servlet开发——过滤器(filter)
servlet有三种,分为简单servlet、过滤器servlet、监听servlet
简单servlet是作为一种程序所必须的开发结构保存的,继承httpServlet类形式。
过滤器servlet和监听servlet不是程序所必须的。
要想完成一个过滤器的开发,首先必须让一个类实现Filter接口,此接口是javax.serclet中的。根据这个包的特点可发现,此接口的主要功能是完成公共协议的操作。
Filter接口中的方法:
简单的servlet必须手工调用,如在form表单的action之中编写路径。
过滤这种操作本身属于本身自动完成的。package org.lxh.filterdemo ;
import java.io.* ; import javax.servlet.* ; public class SimpleFilter implements Filter { public void init(FilterConfig config) throws ServletException{ // 接收初始化的参数 String initParam = config.getInitParameter("ref") ; System.out.println("** 过滤器初始化,初始化参数=" + initParam) ; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{ System.out.println("** 执行doFilter()方法之前") ; chain.doFilter(request,response) ; System.out.println("** 执行doFilter()方法之后") ;
} public void destroy(){ System.out.println("** 过滤器销毁。") ;
try{
Thread.sleep(1000);//线程中休眠,可以看出销毁输出
}cathc(Exception e){
} } }
过滤器完成,也需要在web.xml中进行配置。先写filer配置,再写简单servlet配置
<display-name>Welcome to Tomcat</display-name> <description> Welcome to Tomcat </description> <filter> <filter-name>simple</filter-name> <filter-class>org.lxh.filterdemo.SimpleFilter</filter-class> <init-param> <param-name>ref</param-name> <param-value>HELLOMLDN</param-value> </init-param> </filter> <filter-mapping> <filter-name>simple</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
此处,<url-mapping>表示一个过滤器的过滤路径,现在既然是”/*则表示对 一个目录中的所有内容进行过滤。
过滤器不需要任何配置,就可以在服务器启动的时候自动地完成初始化操作。
一个过滤器的生命周期和servlet是相同的。
doFilter方法中FitlerChain作用
过滤器是执行两次的,一个过滤器本身可以对多个路径进行过滤。那么过滤器如何应用?
在实际开发中,应用最频繁的就是编码过滤和登录验证。
对应编码,所有的页面都需要使用,只要是页面,都需要编写request.setCharacterEncoding()方法对编码进行限制。
package org.lxh.filterdemo ; import java.io.* ; import javax.servlet.* ; public class EncodingFilter implements Filter { private String charSet ; public void init(FilterConfig config) throws ServletException{ // 接收初始化的参数 this.charSet = config.getInitParameter("charset") ; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{ request.setCharacterEncoding(this.charSet) ; chain.doFilter(request,response) ; } public void destroy(){ }
进行web.xml配置
<filter> <filter-name>encoding</filter-name> <filter-class>org.lxh.filterdemo.EncodingFilter</filter-class> <init-param> <param-name>charset</param-name> <param-value>GBK</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
至于登录验证操作,都需要session验证,但每个页面都写session判断,相当复杂,所以可以对一些需要限制的地方采用登录验证。
package org.lxh.filterdemo ; import java.io.* ; import javax.servlet.* ; import javax.servlet.http.* ; public class LoginFilter implements Filter { public void init(FilterConfig config) throws ServletException{ } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{ // session属于http协议的范畴 HttpServletRequest req = (HttpServletRequest) request ; HttpSession ses = req.getSession() ; if(ses.getAttribute("userid") != null) { // 已经登陆过了,则可以访问 chain.doFilter(request,response) ; } else { request.getRequestDispatcher("login.jsp").forward(request,response) ; } } public void destroy(){ } }