- 我们可以有两种方式,进行请求的过滤
- Filter过滤器
- Spring拦截器(HandlerInterceptor)
Filter 过滤器
标签 |
说明 |
||||||
<filter> |
过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联
|
||||||
<filter-mapping> |
一旦命名了一个过滤器,就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联
|
- 使用servlet中的doFilter
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //请求传递前处理 chain.doFilter(request, response); //请求处理后处理 }
|
- CharacterEncodingFilter
- 因为web容器处理http请求,默认的编码格式是IOS8859-1。CharacterEncodingFilter的作用就是设置请求体编码格式,用于请求体参数的字节转字符,也就是对Post请求的参数进行解码。
- 需要注意的是get请求或者URL上的参数是容器进行解码的,需要设置容器的URL解码的字符集。
- Get请求与Post请求会有不同处理的原因在于,字符串解析是耗性能的,如果不需要使用,那么就不解析,也就不用消耗这部分性能。请求体通常比较大,只有在程序中需要的时候才会进行解码,而URL需要在传递给业务类之前就解码
示例
<filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <!-- 设置编码方式 --> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <!-- 强制请求对象使用encoding的编码方式 --> <param-name>forceRequestEncoding</param-name> <param-value>true</param-value> </init-param> <init-param> <!-- 强制响应对象使用encoding的编码方式 --> <param-name>forceResponseEncoding</param-name> <param-value>true</param-value> </init-param> </filter>
<!-- 为Servlet关联过滤器 --> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
- DelegatingFilterProxy
代理自定义过滤器,过滤器是不能通过Spring依赖注入的,通过DelegatingFilterProxy进行代理,实际上就是通过ApplicationContext中获取filter对象
示例
<filter> <filter-name>xxx</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <param-name>targetBeanName</param-name> <param-value>simpleFilter</param-value> </init-param> </filter> <filter-mapping> <filter-name>xxx</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |