spring mvc自定义过滤器filter实现对请求参数编解码的代码
2015-10-07 16:17
891 查看
百度,google了半天即使再万能的stackoverflow上也没有得到解答,今天偶然间发现springmvc注解@RequestParam不是通过HttpServletRequest.java的getParameter(String name)方法得到的参数值,而是通过getParameterValues得到的,怪不得debug了半天getParameter方法就是未被调用,filter也没生效。
相关代码如下:
RequestFilter.java
当然必须在web.xml中配置启动该过滤器:
这样就可以实现全局的控制springmvc的参数过滤,比如xss,编解码等业务,比在每个springmvc方法中对每个参数值进行判断和过滤简单方便多了。
相关代码如下:
RequestFilter.java
01 | package com.zuidaima.filter; |
02 |
03 | import java.io.IOException; |
04 | import java.io.UnsupportedEncodingException; |
05 |
06 | import javax.servlet.FilterChain; |
07 | import javax.servlet.ServletException; |
08 | import javax.servlet.http.HttpServletRequest; |
09 | import javax.servlet.http.HttpServletRequestWrapper; |
10 | import javax.servlet.http.HttpServletResponse; |
11 |
12 | import org.springframework.web.filter.OncePerRequestFilter; |
13 | /** |
14 | *@author www.zuidaima.com |
15 | **/ |
16 | public class RequestFilter extends OncePerRequestFilter { |
17 |
18 | public String filter(HttpServletRequest request, String input) { |
19 | String ret = input; |
20 | //ios客户端请求参数值可能为(null)服务端过滤掉当null处理即可 |
21 | if (input == null || input.trim().equals( "(null)" )) { |
22 | ret= null ; |
23 | return ret; |
24 | } |
25 | final String userAgent = request.getHeader( "User-Agent" ); |
26 | final String method = request.getMethod(); |
27 | //该处可以实现各种业务的自定义的过滤机制 |
28 | if (method.equalsIgnoreCase( "get" ) |
29 | || userAgent.toLowerCase().indexOf( "android" ) != - 1 ) { |
30 | try { |
31 | ret = new String(input.getBytes( "ISO8859-1" ), "utf-8" ); |
32 | } catch (UnsupportedEncodingException e) { |
33 | e.printStackTrace(); |
34 | } |
35 | } |
36 | return ret; |
37 | } |
38 |
39 | @Override |
40 | protected void doFilterInternal( final HttpServletRequest request, |
41 | HttpServletResponse response, FilterChain chain) |
42 | throws ServletException, IOException { |
43 |
44 | chain.doFilter( new HttpServletRequestWrapper(request) { |
45 | @Override |
46 | public String getParameter(String name) { |
47 | String value = super .getParameter(name); |
48 | return filter( this , value); |
49 | } |
50 |
51 | @Override |
52 | public String[] getParameterValues(String name) { |
53 | String[] values = super .getParameterValues(name); |
54 | if (values == null ) { |
55 | return null ; |
56 | } |
57 | for ( int i = 0 ; i < values.length; i++) { |
58 | values[i] = filter( this , values[i]); |
59 | } |
60 | return values; |
61 | } |
62 |
63 | }, response); |
64 |
65 | } |
66 | } |
1 | < filter > |
2 | < filter-name >RequestFilter</ filter-name > |
3 | < filter-class >com.zuidaima.filter.RequestFilter</ filter-class > |
4 | </ filter > |
5 | < filter-mapping > |
6 | < filter-name >RequestFilter</ filter-name > |
7 | < url-pattern >*.htm</ url-pattern > |
8 | </ filter-mapping > |
相关文章推荐
- [转] Java中native关键字
- Spring MVC+Spring+Hibrenarte实现的简单的CRUD项目实例
- java笔记--Java内存模型与线程
- spring 使用外部配置文件访问数据库
- Java构造函数(面向对象)
- java中的final关键字
- 深入解析Java编程中面向字节流的一些应用
- 在springmvc中解决FastJson循环引用的问题
- SpringMVC与fastjson整合并同时解决中文乱码问题
- SpringMVC处理ajax请求
- spring mvc 返回json的配置
- AJAX与spring mvc交互
- FreeMarker与SpringMVC整合实例代码教程
- Spring中的设计模式-适配器模式
- 《JAVA与模式》之适配器模式
- 详解Java编程中面向字符的输出流
- Java语言特征
- JAVA抓取网页图片并下载到本地
- JAVA抓取网页图片并下载到本地
- Java优势