リクエストからUserAgentを取得する
リクエストからUserAgentを取得して各コントローラで持ちまわる共通的な処理を追加する。 取得部分はFilterではなく、HandlerInterceptorで行った。
FilterとInterceptorの違いは下記を参考にした。
https://meetup-jp.toast.com/698
/src/main/java/com/example/demo/interceptor/RequestHandlerInterceptor.java
package com.example.demo.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.lang.Nullable; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import com.example.demo.web.dto.request.RequestInfo; @Component public class RequestHandlerInterceptor implements HandlerInterceptor { private static final Logger LOGGER = LoggerFactory.getLogger(RequestHandlerInterceptor.class); @Override // リクエスト処理前に行う処理 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { LOGGER.info("RequestHandlerInterceptor#preHandle() called."); final String userAgent = request.getHeader("User-Agent"); final RequestInfo requestInfo = new RequestInfo(); requestInfo.setUserAgent(userAgent); request.setAttribute(RequestInfo.REQUEST_KEY, requestInfo); return true; } @Override // コントローラー処理後に行う処理 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { LOGGER.info("RequestHandlerInterceptor#postHandle() called."); } @Override // リクエスト処理後に行う処理 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { LOGGER.info("RequestHandlerInterceptor#afterCompletion() called."); } }
/src/main/java/com/example/demo/WebConfiguration.java
- コンフィグレーションに利用するInterceptorを定義する
package com.example.demo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import com.example.demo.interceptor.RequestHandlerInterceptor; @Configuration public class WebConfiguration implements WebMvcConfigurer { @Autowired private RequestHandlerInterceptor requestHandlerInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(requestHandlerInterceptor); } }
/src/main/java/com/example/demo/web/dto/request/RequestInfo.java
package com.example.demo.web.dto.request; import lombok.Data; @Data public class RequestInfo { public static final String REQUEST_KEY = "com.example.demo.web.dto.request.RequestInfo.REQUEST_KEY"; private String userAgent; }
/src/main/java/com/example/demo/web/controller/UsersController.java
- コントローラのメソッドの引数にInterceptorでリクエストに設定したオブジェクトを追加
@RequestMapping(method = RequestMethod.GET) public UsersGetListResponse getList( @RequestAttribute(name = RequestInfo.REQUEST_KEY, required = true) RequestInfo requestInfo, @RequestParam(name = "page", defaultValue = "1") String page, @RequestParam(name = "limit", defaultValue = "5") String limit) { LOGGER.info("#RequestInfo : {}", requestInfo); List<UserDto> resultList = usersService.findAll(); return UsersHelper.convertToUsersGetListResponse(resultList); }