Springmvcのスクリーンセーバの実行順序と各方法の役割

3256 ワード

HandlerInterceptorインターフェースを実現したり、HandlerInterceptorのサブクラスを継承したり、例えばSpringがすでに提供しているHandlerInterceptorインターフェースを実現した抽象的な種類のHandler InterceptorAdapterを実現したりします.次に、そのインターフェースを実現する書き方を説明します.まずこのインターフェースの3つの方法を見てください. 
を選択します. 方法preHandle:名前の通り、この方法は要求処理の前に呼び出しを行い、controllerの前に実行されます.SprigMVCのInterceptorはチェーン式の呼び出しであり、一つのアプリケーションまたは一つの要求に複数のInterceptorが同時に存在することができる.各Interceptorの呼び出しは、その声明の順序に従って順次実行され、最初に実行されるのは、IntercepterにおけるpreHandle方法であるので、この方法では、前置初期化動作や、現在要求されている一つの前処理を行うことができます.たとえば、クッキーの値を取得したり、ログインしたかどうかを判断したりします.この方法では、要求が継続するかどうかを判断しても良い.この方法の戻り値は、ブール値Booleanタイプであり、falseに戻ると、要求が終了し、後続のInterceptorとControllerは再実行されないことを示す.戻り値がtrueの場合は、次のIntercepterのpreHandleメソッドを呼び出し続けます.最後のInterceptorの場合は、現在の要求を呼び出すController方法です. 
を選択します. 方法postHandle:preHandle方法の説明により、この方法は後述するafterComplection方法を含むことが分かりました.現在所属しているInterceptorのpreHandle方法の戻り値がtrueの場合にのみ呼び出されます.PostHandle方法は、名前の通り、現在の要求が処理された後、つまりControllerメソッドの呼び出し後に実行されますが、Disparer Servletがビューをレンダリングする前に呼び出されますので、この方法でController処理後のModelAndViewオブジェクトを操作します.たとえば、cookieを設定して、フロントエンドに戻ります.postHandleメソッドが呼び出される方向はpreHandleとは反対です.つまり先に声明したInterceptorのpostHandle方法は逆に後に実行されます.
を選択します. 方法afterComplection:この方法も、現在対応するInterceptrのpreHandle方法の戻り値がtrueの場合に実行されます.この方法は、要求全体が終了した後、すなわちDispactch Servletに対応するビューをレンダリングした後に実行される.この方法の主な役割は資源整理作業を行うためのものである.
 
例:
 
@Component
public class AuthInterceptor implements HandlerInterceptor {
  
  private static final String TOKEN_COOKIE = "token";
  
  
  @Autowired
  private UserDao userDao;

  
  @Override
  public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler)
          throws Exception {
    Map map = req.getParameterMap();
    map.forEach((k,v) ->req.setAttribute(k, Joiner.on(",").join(v)));
    String requestURI = req.getRequestURI();
    if (requestURI.startsWith("/static") || requestURI.startsWith("/error")) {
      return true;
    }
    Cookie cookie = WebUtils.getCookie(req, TOKEN_COOKIE);
    if (cookie != null && StringUtils.isNoneBlank(cookie.getValue())) {
        User user = userDao.getUserByToken(cookie.getValue());
        if (user != null) {
          req.setAttribute(CommonConstants.LOGIN_USER_ATTRIBUTE, user);

          UserContext.setUser(user);
        }
    }
    return true;
  }
  

  @Override
  public void postHandle(HttpServletRequest req, HttpServletResponse res, Object handler,
          ModelAndView modelAndView) throws Exception {
    String requestURI = req.getRequestURI();
    if (requestURI.startsWith("/static") || requestURI.startsWith("/error")) {
      return ;
    }
    User user = UserContext.getUser();
    if (user != null && StringUtils.isNoneBlank(user.getToken())) {
       String token = requestURI.startsWith("logout")? "" : user.getToken();
       Cookie cookie = new Cookie(TOKEN_COOKIE, token);
       cookie.setPath("/");
       cookie.setHttpOnly(false);
       res.addCookie(cookie);
    }
    
  }

  @Override
  public void afterCompletion(HttpServletRequest req, HttpServletResponse response, Object handler, Exception ex)
          throws Exception {
    UserContext.remove();
  }
}