2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Spring Interceptor

Posted at
  • Springベースのアプリケーションを開発中であれば、Spring Interceptorを使用する方が、Servlet Filterを使用するよりも統合性の面でより良い。
  • URLパターンをさらに細かく設定でき、Servlet FilterのdoFilterよりさらに細かくpreHandle、postHandle、afterCompletionメソッドを設定できるという長所がある。
preHandle Controller 呼び出し前、応答値がfalseであれば、それ以上進行しない。
postHandle Controller 呼び出し後、Controlle で例外が発生すると呼び出されない。
afterCompletion ビューがレンダリングされた後、例外が発生しても常に呼び出し、例外が発生した場合、どのような例外が発生したのかログを出力できる
  • どのControllerが呼び出されるのか、呼び出し情報も受け取ることができる。
  • どのmodel AndViewが返されるのか、応答情報も受け取ることができる。

以下の例はログインに関するものもありますが、GoogleログインもFilterで処理していて、セキュリティに関してはFilterで扱うということで.. おそらく他のものでInterceptorを使うことになりそうだ。


@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
            // addPathPatterns, excludePathPatternsなどを使って、
            // より細かくUrlパターンを指定することができる。
		    registry.addInterceptor(new LogInterceptor())
            .order(1)
            .addPathPatterns("/**")
            .excludePathPatterns("/css/**", "/*.ico", "/error");
        registry.addInterceptor(new LoginInterceptor())
						.order(2)
						.addPathPatterns("/**")
	          .excludePathPatterns("/user/loginForm","/user/signupForm","","/*.css", "/*.js", "/*.ico", "error");
    }

}
@Slf4j
public class LogInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String requestURI = request.getRequestURI();
        String logId = UUID.randomUUID().toString();
        request.setAttribute(Constant.LOG_ID, logId);

        if(handler instanceof HandlerMethod){
            // 呼び出すControllerメソッドのすべての情報が含まれている。
            HandlerMethod hm = (HandlerMethod) handler;
        }

        log.info("REQUEST [{}] [{}] [{}]", logId, requestURI, handler);
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        String logId = (String)request.getAttribute(Constant.LOGIN_ID);
        log.info("postHandle [{}]", modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        String requestURI = request.getRequestURI();
        String logId = (String)request.getAttribute(Constant.LOGIN_ID);
        if(ex!=null){
            log.error("afterCompletion error", ex);
        }
        log.info("RESPONSE [{}] [{}] [{}]", logId, requestURI, handler);
    }
}
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String requestURI = request.getRequestURI();

        log.info("認証チェック実行 {}", requestURI);

        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute(Constant.LOGIN_ID) == null) {
            log.info("未認証ユーザー");
            //ログインにRedirect
            response.sendRedirect("users/login?redirectURL=" + requestURI);
            return false;
        }

        return true;
    }

}
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?