servlet filter

Servlet过滤器是 在Java Servlet规范2.3中定义的,它能够对Servlet容器的请求和响应对象进行检查和修改,它在Servlet被调用之前检查Request对象, 修改Request Header和Request内容;在Servlet被调用之后检查Response对象,修改Response Header和Response内容。Servlet过滤器负责过滤的Web组件可以是Servlet、JSP或HTML文件,具有以下特点:

l         Servlet过滤器可能检查和修改ServletRequest和ServletResponse对象

l         可以指定Servlet过滤器和特定的URL关联,只有当客户请求访问此URL时,才会触发该过滤器工作

l         多个Servlet过滤器可以被串联起来,形成管道效应,协同修改请求和响应对象

l         所有支持Java Servlet规范2.3的Servlet容器,都支持Servlet过滤器

 

所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。该接口定义了以下3个方法:

l         init(FilterConfig)     这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后就会调用这个方法。在这个方法中可以通过 FilterConfig来读取web.xml文件中Servlet过滤器的初始化参数。

l         doFilter(ServletRequest, ServletResponse, FilterChain)  这是完成实际的过滤操作的方法,当客户请求访问与过滤器关联的URL时,Servlet容器先调用该方法。FilterChain参数用来访问后续的过滤 器的doFilter()方法。

l         destroy() Servlet容器在销毁过滤器实例前调用该方法,在这个方法中,可以释放过滤器占用的资源。

 

实例:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>
 <filter> 
    <filter-name>NoteFilter</filter-name> 
    <filter-class>NoteFilter</filter-class> 

   
    <init-param>
      <param-name>blacklist</param-name>
      <param-value>捣蛋鬼</param-value>
    </init-param>
 
  </filter> 


<filter-mapping>

       <filter-name>NoteFilter</filter-name>

       <url-pattern>/note</url-pattern>

</filter-mapping>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>note</servlet-name>
    <servlet-class>note</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>note</servlet-name>
    <url-pattern>/note</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

相应的过滤器:

import java.io.*;

public class NoteFilter implements Filter{

       private FilterConfig config=null;

       private String blackList=null;

       public void init(FilterConfig config)throws ServletException{

              this.config=config;

              blackList=config.getInitParameter("blacklist");

       }

       public void destroy(){

              config=null;

       }

       public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

              throws IOException, ServletException{
    	   		System.out.println("Kkkkkkkkkkkkkkkkkkkkkkkk");
              String userName=((HttpServletRequest)request).getParameter("user_name");
              
              if(userName!=null)

                     userName=new String(userName.getBytes("ISO-8859-1"),"UTF-8");
              System.out.println(userName);
              System.out.println( blackList);
              System.out.println( userName.indexOf(blackList));
              if(userName!=null && userName.indexOf(blackList) !=-1 ){
            	  	 response.setContentType("text/html; charset=UTF-8");
                     
            	  	 PrintWriter out=response.getWriter();

                     out.print("<html><body>");

                     out.print("<h1>对不起,"+userName+",你没有权限留言</h1>");

                     out.print("</body></html>");

                     out.flush();
                     System.out.println("ddddddddddddddddddddddd");

                     return;

	              }
             
              long before=System.currentTimeMillis();

              config.getServletContext().log("NoteFilter:before call chain.doFilter()");

              chain.doFilter(request, response);// 把处理发送到下一个过滤器

              config.getServletContext().log("NoteFilter:after call chain.doFilter()");

              long after=System.currentTimeMillis();

              String name = "";
              
              if (request instanceof HttpServletRequest) {
                  name = ((HttpServletRequest)request).getRequestURI();
              }

              config.getServletContext().log("NoteFilter:"+name+":"+(after-before)+"ms");

       }

}

 

随便建立一个应用:note

现在访问:http://localhost:8080/user_name=捣蛋鬼

会被拦截!

注意:

多个过滤器可以串连起来协同工作,Servlet容器将根据它们在web.xml中定义的先后顺序,依次调用它们的doFilter()方法。而这些过滤之间的关系不需要任何配置。

 

 

posted on 2013-10-31 17:51  TrustNature  阅读(51)  评论(0)    收藏  举报