和Servlet类似,Filter也是一个实现特殊接口的普通java类,只不过实现了Filter接口,需要实现该接口的一些过滤方法,实现了对一些请求信息的拦截。首先,我们确定一下它拦截的对象:在浏览器调用Servlet之前,在服务器返回非浏览器之前就行过滤它可以拦截jsp,Servlet,静态图片和静态HTML文件。相当于服务器的门卫,对客户端发来的请求和对客户端做出的响应进行过滤。
那么对于这么一个类,如何让他工作?
首先,这个类需要实现Filter接口,将该接口的方法实现,然后在web.xml中注册和映射拦截的路径就行了。这样一说跟Servlet的工作方式基本上一致,只不过Servlet配置的是可以访问的路径,这里是拦截的路径。其实实现接口的方法都很类似,都是一个init方法,这个方法附带一个配置参数,利用这个配置参数可以获取配置的各种信息,甚至包括ServletContext的配置信息;还有一个destroy方法,不用管;还有就是一个主要的每次用到的方法,只不过名字一个是service方法一个是doFilter方法,反正都是每次都用它工作就对了。
这里我们说一下它的配置(当然在Servlet3.0规范中可以使用注解,不用配置,但是学习时还是自己动手配一下加深学习比较好)。
<filter> <filter-name>filterTest1</filter-name> <filter-class>Filter.FilterTest1</filter-class> </filter> <filter-mapping> <filter-name>filterTest1</filter-name> <url-pattern>/filter/test1.jsp</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>可以看到这里的配置方式跟Servlet基本一致,后面dispatcher是设置拦截方式,一般默认是REQUEST,表示对请求进行拦截,当然这个也是用的最多的,其次是Forward方式,表示对转发进行拦截。
Filter是相互链式的工作的,就是说一个Filter放行后会自动转给另一个Filter来处理的,这里他们工作的顺序是根据web.xml中<filter-mapping>的顺序来决定的。
对于Filter,其经典的应用是处理用户登录问题,很多页面,用户没有登录则不给于显示。其原理就是在Filter中判断用户的session状态,如果登陆了就放行。利用Filter还可以解决乱码问题,设置页面请求的编码,设置页面是否缓存等:这里给两个简单的代码:
//使浏览器不缓存 response.setDateHeader("Expires",-1); response.setHeader("Cache-Control","no-cache"); response.setHeader("Pragma","no-cache");可以在web.xml中设置编码方式,在Filter中进行设置:
//解决乱码: HttpServletRequest req=(HttpServletRequest) request; HttpServletResponse res=(HttpServletResponse) response; String encoding= fConfig.getServletContext().getInitParameter("encoding");//通过配置参数获取web.xml中设置的编码方式 req.setCharacterEncoding(encoding);//设置编码方式 chain.doFilter(request, response);
原文地址:http://blog.csdn.net/js_sky/article/details/44342719