12 November 2019

拦截器

作为springmvc提供的拦截器,有三个方法

  • preHandle() - 请求处理前被调用,通过返回值,判定请求是否向下传递。

  • postHandle() - 在请求处理后,数据模型产生后被调用。

  • afterCompletion() - 请求被返回或视图被返回后调用。

使用方式分为两种

  • 实现HandlerInterceptor接口

  • 继承HandlerInterceptorAdapter类

    @Component
    public class CustomerWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter{
      
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new SimpleHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/path1")
        }
    }
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
        <mvc:interceptors>
            <mvc:interceptor>
                <mvc:mapping path="/**"/>
                <mvc:exclude-mapping path="/admin/**"/>
                <ref bean="simpleHandlerInterceptor"/>
            </mvc:interceptor>
        </mvc:interceptors>
    </beans>
    
多个拦截器的调用路径,按照配置顺序

1573527147908.jpg

过滤器

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    //请求传递前处理
    chain.doFilter(request, response);
    //请求处理后处理
}
1.CharacterEncodingFilter

因为web容器处理http请求,默认的编码格式是IOS8859-1CharacterEncodingFilter的作用就是设置请求体编码格式,用于请求体参数的字节转字符,也就是对Post请求的参数进行解码。

需要注意的是get请求或者URL上的参数是容器进行解码的,需要设置容器的URL解码的字符集。

2.DelegatingFilterProxy(重要)

这个过滤器是用来代理自定义过滤器的,为什么需要代理?因为从过滤器的配置可以看出,过滤器不能通过spring依赖注入,通过DelegatingFilterProxy进行代理,实际就是通过ApplicationContext中获取filter对象

区别

  • 拦截器可以更细粒度的处理请求拦截操作,而且能够排除不需要过滤的请求
  • 关于请求链的传递
    • 拦截器挺好boolean返回值判定是否继续传递
    • filter需要主动调用传递


blog comments powered by Disqus