HandlerInterceptor
工作流接口,允许定制处理程序执行链。应用程序可以为某些处理程序组注册任意数量的现有或自定义拦截器,以添加公共预处理行为,而无需修改每个处理程序实现。
在适当的HandlerAdapter触发处理程序本身的执行之前,将调用HandlerInterceptor。这种机制可以用于预处理方面的大量领域,例如授权检查,或者常见的处理程序行为,如区域设置或主题更改。它的主要目的是允许分解出重复的处理程序代码。
在异步处理场景中,当主线程退出时,处理程序可能在单独的线程中执行,而不呈现或调用{@code postHandle}和{@code afterCompletion}回调。当并发处理程序执行完成时,为了继续呈现模型,请求被回调,并再次调用此契约的所有方法。有关更多选项和详细信息,请参见{@code org.springframework.web.servlet。AsyncHandlerInterceptor}
通常,每个HandlerMapping bean定义一个拦截器链,共享其粒度。要将某个拦截器链应用于一组处理程序,需要通过一个HandlerMapping bean映射所需的处理程序。拦截器本身在应用程序上下文中定义为bean,由映射bean定义通过其“拦截器”属性引用(在XML中:a < list >)& lt; ref>)。
HandlerInterceptor基本上类似于Servlet过滤器,但与Servlet过滤器不同的是,它只允许自定义预处理和自定义后处理,选项是禁止执行处理程序本身。过滤器更强大,例如,它们允许交换传递给链的请求和响应对象。注意过滤器是在web中配置的。xml,应用程序上下文中的HandlerInterceptor。
作为一个基本准则,与HandlerInterceptor实现相关的细粒度预处理任务是候选的,特别是经过验证的公共处理程序代码和授权检查。另一方面,过滤器非常适合于请求内容和视图内容处理,比如多部分表单和GZIP压缩。这通常显示何时需要将筛选器映射到某些内容类型(例如图像)或所有请求。
有关系的类
@see HandlerExecutionChain#getInterceptors @see org.springframework.web.servlet.handler.HandlerInterceptorAdapter @see org.springframework.web.servlet.handler.AbstractHandlerMapping#setInterceptors @see org.springframework.web.servlet.handler.UserRoleAuthorizationInterceptor @see org.springframework.web.servlet.i18n.LocaleChangeInterceptor @see org.springframework.web.servlet.theme.ThemeChangeInterceptor @see javax.servlet.Filter
preHandle方法
前置处理:可以在此方法中确定用户是否登录、权限级别等,根据用户情况返回检测结果
/**
* 拦截处理程序的执行。在HandlerMapping确定适当的处理程序对象之后调用,但是在HandlerAdapter调用处
* 理程序之前调用。
* 使用此方法,每个拦截器可以决定中止执行链,通常发送HTTP错误或编写自定义响应。
* {@link org.springframework.web.servlet.AsyncHandlerInterceptor}。
* @param请求当前HTTP请求
* @param响应当前HTTP响应
* 为类型和/或实例计算选择要执行的处理程序
* 如果执行链应该继续执行下一个拦截器或处理程序本身,则返回{@code true}。否则,DispatcherServlet
* 假定这个拦截器已经处理了响应本身。
* @抛出异常以防出错
*/
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
postHandle方法
后置处理:可以在此方法中进行页面的跳转等处理
/**
* 拦截处理程序的执行。
* 在HandlerAdapter实际调用处理程序之后调用,但在DispatcherServlet呈现视图之前调用。
* DispatcherServlet在执行链中处理一个处理程序,该执行链由任意数量的拦截器组成,处理程序本身位于执行链的末尾。
* <strong>注意:</strong>特别注意异步请求处理。有关更多细节,请参见{@link org.springframework.web.servlet.AsyncHandlerInterceptor}。
* @param request 当前HTTP请求
* @param response 当前HTTP响应
* @param handler (或{@link HandlerMethod})用于类型和/或实例检查的启动异步执行的
* @param modelAndView {@code modelAndView}(也可以是{@code null})
* @throws Exception 抛出异常以防出错
*/
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
afterCompletion方法
用户退出后:用于删除token信息等
/**
* 请求处理完成后回调,即呈现视图后回调。
* 将在处理程序执行的任何结果上调用,从而允许进行适当的资源清理。
* 与{@code postHandle}方法一样,该方法将在链中的每个拦截器上以相反的顺序调用,因此第一个拦截器将是最后一个被调用的拦截器。
* {@link org.springframework.web.servlet.AsyncHandlerInterceptor}。
* @param request 当前HTTP请求
* @param response 当前HTTP响应
* @param handler 用于类型和/或实例检查的启动异步执行的@param处理程序处理程序(或{@link HandlerMethod})
* @param ex 在处理程序执行时抛出(如果有的话)
* @throws Exception 抛出异常以防出错
*/
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}