リクエストから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);
    }