Filter功能一般用于:
1.字符编码转换
2.session管理
Filter好比一个门卫过滤进来的人。而且在实现Filter接口的类的dofilter方法中,一定要执行chain.dofilter(request,response)才能继续执行。例如在web.xml设置filter-mapping中的url-pattern为/admin/*,则表明访问该工程下的admin目录下的代码才会执行设置好的filter实现类,执行别的页面则不执行。
根据filter功能1字符编码转换功能:
比如:建立一个带default表单的html页面(charset=UTF-8),建立个LoginServlet的servlet页面,从login.html传递到LoginServlet的username参数名"张三",由于html页面charset=utf-8,request读不到汉字,结果为乱码。修改方法:html修改charset=gbk,request.setCharacterEncoding("gbk"),response.setCharacterEncoding("gbk")。
或者更为简便的方法是使用Filter,代码如下
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
request.setCharacterEncoding("gbk");
response.setCharacterEncoding("gbk");
chain.doFilter(request, response);
}
在web.xml中添加
<filter>
<filter-name>ef</filter-name>
<filter-class>EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ef</filter-name>
<url-pattern>/*</url-pattern>
而页面的字符集编码都不用管了。
Filter第二个功能是session管理:
比如:工程下webroot包含一个pages文件夹里含有业务页面,webroot根目录下还有一个Login.jsp,则需要设置filter过滤pages文件夹中的页面,可以设置sessionfilter类来判别每个页面是否在session中是否存有用户名,如果没有则跳转到Login.jsp并提示下您没有输入用户名。如果有则继续执行。另外要注意的是,在dofilter类中的参数是servletrequest 和servletresponse。一般我们要用到的session是从httpservletrequest获取到的,所以必须要把dofilter的servletrequest转型