整理今天说明的java过滤器的使用
request.setcharacterencoding (utf-8 );
response.set content type (' text/html; charset=utf-8 ';
这是在servlet中设置字符编码的代码,但通常有多个servlet,因此必须在每个servlet中编写以上代码。 这样做不仅麻烦,而且容易混淆。
因此,在这些servlet上运行相同的代码时,通常可以使用过滤器来完成操作:
滤波器:
要使用过滤器,必须首先实现Filter类,然后重写三个所需的方法:
导入javax.servlet.*;
import javax.servlet.annotation.web过滤器;
import java.io.IOException;
@ web过滤器(filtername=' test filter2',urlPatterns='/* ' )
publicclasstestfilter 2实施过滤器{
公共语音目录
}
publicvoiddofilter (servletrequestreq,ServletResponse resp,过滤器通道) throws ServletException,IOException {
chain.do滤波器(req,resp );
}
公共语音输入(filterconfigconfig ) throws ServletException { )。
}
}
创建当前过滤器时将自动调用init方法:容器。
销毁当前过滤器时将自动调用destroy方法:容器
doFilter方法:过滤器的主要代码写在此处
1 @ web过滤器(filtername=' test filter2',urlPatterns='/* ' )
此行的代码意味着添加注释,不需要使用此行的代码在web.xml中注册
其中,filterName表示此过滤器的名称,后面的urlPatterns表示过滤器的路径/*表示所有路径,这意味着在访问所有路径时首先访问此过滤器
chain.do滤波器(req,resp );
此代码行意味着在存在其他过滤器时调用其他过滤器,但请注意,此代码行必须写在doFilter方法的末尾
1 publicvoiddofilter (servletrequestreq,ServletResponse resp,过滤器通道) throws ServletException,IOException {
2 //这在执行各servlet时先进行
3 http servlet请求=(http servlet请求) req;
4 http servlet响应=(http servlet响应) resp;
5
6 request.setcharacterencoding (utf-8 );
7 response.set content type (' text/html; charset=utf-8 ';
8
9 //因为可能不仅仅是这一个过滤器,所以需要运行所有过滤器
10 //这一行的代码一定要写到底
11chain.dofilter(req,resp );
12 }
其中,3-7行代码是设定代码
从doFilter传递的默认值是ServletRequest对象,设置字符集的是HttpServetRequest,必须强制转换
转换后,我们可以进行设定。
附上我另一个测试过滤器的代码:
1导入javax.servlet.*;
2 import javax.servlet.annotation.web过滤器;
3导入javax.servlet.http.http servlet请求;
4导入javax.servlet.http.httpservletrequestwrapper;
5导入javax.servlet.http.http servlet响应;
6 import java.io.IOException;
7导入Java.io.unsupportedencodingexception;
8
9 /**
10 * urlPatterns意味着必须过滤这些路径。 其中*表示所有路径都必须进入此过滤器
11 */
12 @ web过滤器(filtername=' test filter ',urlPatterns='/* ' )
13 publicclasstestfilterimplementsfilter {
14公共语音目录(
15 }
16
17 /**
18 *此处编写的代码在运行servlet JSP等之前执行
19 */
20 publicvoiddofilter (servletrequestreq,ServletResponse resp,FilterChain chain ) throws ServletException,IOException {
21 //这在执行各servlet时先进行
22 http servlet请求=(http servlet请求) req;
23 http servlet响应=(http servlet响应) resp;
24
25 request.setcharacterencoding (utf-8 );
26 response.set content type (' text/html; charset=utf-8 ';
27
28 //可能不仅仅是这一个过滤器,所以需要运行所有过滤器
29 //这一行的代码一定要写到底
30chain.dofilter(req,resp );
31 }
32
33公共void init (过滤器配置) throws ServletException {
34
35 }
36
通过改写37//getparameter方法,实现get方法的自动转码
38 classmywrapperextendshttpservletrequestwrapper {
39隐私保护策略;
40 publicmywrapper (httpservletrequestrequest ) {
41 super (请求;
42 this.request=request;
43 }
44
45 @Override
46公共字符串获取参数(字符串名称) {
47 string value=this.request.getparameter (name;
48if(value==null ) {
49返回空值;
50 }
51
52//get方法提交时
53if(this.request.getmethod ).equalsignorecase('get ' ) {
54特里{
55 //进行转码
56 value=new string (value.getbytes (iso-8859-1 )、utf-8 ) );
57 ) catch (不支持编码封装) {
58 e .打印堆栈跟踪(;
59 }
60 }
61
62 //屏蔽尖括号
63 value=value.replace (','');
64 value=value.replace ('
65
66返回值;
67 }
68 }
69 }