springboot-intercepter

springboot-intercepter

Spring MVC Intercepter拦截器的使用

  1. 创建GlobalIntercepter类
  2. 实现HandlerIntercepter接口
  3. 重写HandlerIntercepter中的三个方法
    /**
     * 在业务处理器处理请求之前被调用,预处理,可以进行编码,安全控制,权限校验等处理;
     * @param request
     * @param response
     * @param handler
     * @return  是否通过拦截器
     * @throws Exception
     */
    boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception 
    /**
     * 在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView 
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception

    /**
     * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面);
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception

在Spring MVC中配置Intercepter

在SpringMvc.xml配置文件中添加如下代码

	<mvc:interceptors>
		<mvc:interceptor>
            <!-- 此处代表拦截所有请求 -->
			<mvc:mapping path="/**"/>
            <!-- 此处填写拦截器的全名称 带包名 -->
			<bean class="com.xxx.intercepter"/>
		</mvc:interceptor>
	</mvc:interceptors>

在Spring Boot中 可以这样配置拦截器

新建WebAppConfigurer 并实现WebMvcConfigurer接口

@Configuration
public class WebAppConfigurer implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 可添加多个
        registry.addInterceptor(new GlobalIntercepter()).addPathPatterns("/**");
    }

    .....//此处省略
}

Spring 中过滤器的使用

  1. 新建GlobalFilter类 并实现Filter接口
  2. 实现如下三个方法
    /**
     * 初始化方法,此方法会在服务器启动的时候运行
     * @param filterConfig
     * @throws ServletException
     */
    void init(FilterConfig filterConfig) throws ServletException 
    /**
     *过滤器拦截的业务处理方法
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException 
    /**
     * 销毁过滤器时调用
     */
    void destroy()

Spring 中Filter的配置

在web.xml中配置

<filter>  
  <filter-name>{过滤器的名字,随便}</filter-name>  
  <filter-class>{过滤器在的全类名}</filter-class>  
</filter>  

<filter-mapping>  
  <filter-name>{过滤器的名字}</filter-name>  
  <url-pattern>{要过滤的路径 例如:/*}</url-pattern>  
</filter-mapping>  

Spring 中拦截器与过滤器的区别

比较内容 原理 使用 应用场景
拦截器 Intercepter 基于java反射机制(动态代理)实现 实现HandlerInterceptor接口
实现WebRequestInterceptor接口
处理所有请求的共同问题(乱码问题,权限验证问题)
过滤器 Filter 基于函数回调来实现 实现Filter接口 设置字符编码,URL级别的权限访问控制,过滤敏感词汇,压缩响应信息

总结

过滤器Filter依赖于Servlet容器,基于回调函数,过滤范围大,还能进行资源过滤
拦截器Interceptor依赖于框架容器,基于反射机制,只过滤请求
执行顺序
Filter>Servlet>Intercepter>Controller