您的位置:首页 > 编程语言 > Java开发

spring mvc自定义过滤器filter实现对请求参数编解码的代码

2015-10-07 16:17 891 查看
百度,google了半天即使再万能的stackoverflow上也没有得到解答,今天偶然间发现springmvc注解@RequestParam不是通过HttpServletRequest.java的getParameter(String name)方法得到的参数值,而是通过getParameterValues得到的,怪不得debug了半天getParameter方法就是未被调用,filter也没生效。

相关代码如下:

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
}
当然必须在web.xml中配置启动该过滤器:

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
>
这样就可以实现全局的控制springmvc的参数过滤,比如xss,编解码等业务,比在每个springmvc方法中对每个参数值进行判断和过滤简单方便多了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: