和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);
OK,Filter就复习这么多吧