前言:
过滤器是Servlet中一个非常重要的组成部分,进行WEB开发时无不用到过滤器;因此这篇blog来单独总结下关于过滤器的知识点。
下面这句话引自这篇文章 Filte即过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
Servlet API中提供了一个Filter接口,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,如下:
建立一个过滤器涉及下列五个步骤:
1、建立一个实现Filter接口的类:
init( )
doFilter( )
destroy( )
public void init(FilterConfig config) thows ServletException
只在此过滤器第一次初始化时执行2、在doFilter方法中实现过滤行为:
public void doFilter(ServletRequset request, ServletResponse response,FilterChain chain)
3、调用FilterChain对象的doFilter方法:
4、对相应的servlet和JSP页面注册过滤器:
filter
:元素向系统注册一个过滤对象filter-mapping
:元素指定该过滤对象所应用的URL<filter-name>
必需元素,必须与用filter元素声明时给予过滤器的名称相匹配<url-pattern>
必需元素,此元素声明一个以斜杠"/"
开始的模式,它指定过滤器应用的URL。例:
要求:利用filter和filter-mapping指示名为SomeFilter的过滤器应用到名为SomeServlet的servlet。
web.xml应配置为:
<filter>
<filter-name>SomeFilter</filter-name>
<filter-class>sPackage.SFilterClass</filter-class>
</filter>
<filter-mapping>
<filter-name>SomeFilter</filter-name>
<servlet-name>SomeServlet</servlet-name>
</filter-mapping>
5、禁用激活器servlet:
对请求信息的过滤大致分为下列5个步骤:
因为Servlet对中文支持不好,用户提交的表单信息会产生乱码问题,会给后台的数据查询和记录(数据库存储)等功能造成影响,因此需要对请求信息进行转码。
解决方法一:
直接在Servlet中转码
处理get请求::
String name = request.getParameter(param_name);
name = new String( name.getBytes("ISO8859_1") );
处理post请求:
request.setCharacterEncoding("utf-8");
直接在servlet里处理的缺点是从request中取出的每个中文变量都要转换,且不能动态的改变编码。
解决方法二:
在过滤器中进行转码,且在一个动态web项目里设置完成后就可以不用在单个Servlet中一一设置了。
例:
Filter类:
public class MyFilter implements Filter
{ private String tarEncoding = "gb2312";
protected FilterConfig filterConfig;
public void init(FilterConfig config) throws ServletException
{ this.filterConfig = config;
this.tarEncoding = config.getInitParameter("encoding");
}
public void doFilter( ServletRequest srequest, ServletResponse sresponse, FilterChain chain) throws IOException, ServletException
{
HttpServletRequest request = (HttpServletRequest)srequest;
HttpServletResponse response = (HttpServletResponse)sresponse;
//把请求用指定的方式编码
request.setCharacterEncoding(targetEncoding);
//把响应用指定的方式编码
response.setCharacterEncoding(targetEncoding);
// 把处理发送到下一个过滤器
chain.doFilter(srequest,sresponse);
}
public void destroy()
{ this.filterConfig=null; }
}
过滤器部署描述:
<filter>
<filter-name>encod</filter-name>
<filter-class>pdsu.edu.cn.chu.MyFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encod</filter-name>
<url-pattern>/*</url-pattern>
<filter-mapping>
过滤器只能解决Post提交的中文乱码问题,Get提交中文乱码解决方法为:
修改tomcat配置文件下的server.xml,找到对8080端口进行服务的Connector组件的设置部分,为Connector添加属性URIEncoding="GBK"