﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-公主她爹的网窝-随笔分类-Servlet Filter</title><link>http://www.blogjava.net/mulin/category/18979.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 01 Mar 2007 14:14:27 GMT</lastBuildDate><pubDate>Thu, 01 Mar 2007 14:14:27 GMT</pubDate><ttl>60</ttl><item><title>功能强大的 Servlet Filter 完整源代码</title><link>http://www.blogjava.net/mulin/archive/2007/01/05/91978.html</link><dc:creator>公主她爹</dc:creator><author>公主她爹</author><pubDate>Fri, 05 Jan 2007 05:59:00 GMT</pubDate><guid>http://www.blogjava.net/mulin/archive/2007/01/05/91978.html</guid><wfw:comment>http://www.blogjava.net/mulin/comments/91978.html</wfw:comment><comments>http://www.blogjava.net/mulin/archive/2007/01/05/91978.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mulin/comments/commentRss/91978.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mulin/services/trackbacks/91978.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1/** *//**//*  2 * &lt;p&gt;Company: 凌科软件 www.elingke.com &lt;/p&gt;  3 * @author liubaojun  4 * @version 1.0  5 * Created on 2004-11-29  6 * 来源于 elinkBSP 部分源代码  7 */  8package com.elink.control;  9 1...&nbsp;&nbsp;<a href='http://www.blogjava.net/mulin/archive/2007/01/05/91978.html'>阅读全文</a><img src ="http://www.blogjava.net/mulin/aggbug/91978.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mulin/" target="_blank">公主她爹</a> 2007-01-05 13:59 <a href="http://www.blogjava.net/mulin/archive/2007/01/05/91978.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>servlet filter </title><link>http://www.blogjava.net/mulin/archive/2007/01/05/91971.html</link><dc:creator>公主她爹</dc:creator><author>公主她爹</author><pubDate>Fri, 05 Jan 2007 05:53:00 GMT</pubDate><guid>http://www.blogjava.net/mulin/archive/2007/01/05/91971.html</guid><wfw:comment>http://www.blogjava.net/mulin/comments/91971.html</wfw:comment><comments>http://www.blogjava.net/mulin/archive/2007/01/05/91971.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mulin/comments/commentRss/91971.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mulin/services/trackbacks/91971.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt">
				<span lang="EN-US" style="COLOR: #0000cc; FONT-FAMILY: 'MS UI Gothic'">servlet filter<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt">
				<span lang="EN-US" style="COLOR: #0000cc; FONT-FAMILY: 'MS UI Gothic'"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">JSP</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">技术构建在</span>
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">Servlet</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">技术之上，所以</span>
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">Servlet</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">和</span>
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">JSP</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">的技术本质是一样的，</span>
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">JSP</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">能做到的，</span>
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">Servlet</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">都能做到，但是它们却各有所长。</span>
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">Servlet</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">比较适合作为控制类组件，比如视图控制器等。另外，</span>
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">Servlet</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">还可以作为过滤器、监听器等。</span>
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">Servlet</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">不仅可以动态生成</span>
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">HTML</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">内容，还可以动态生成图形。总而言之，</span>
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">Servlet</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">在项目中作为控制类的组件，并且处理一些后台业务，</span>
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">JSP</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">则作为显示组件。</span>
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">  <br /><br />    </span>
				<span lang="ZH-CN" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">在本节，我们将介绍</span>
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">Servlet</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">常用的使用方法之一：作为过滤器。在</span>
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">Servlet</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">作为过滤器使用时，它可以对客户的请求进行过滤处理，当它处理完成后，它会交给下一个过滤器处理，就这样，客户的请求在过滤链里一个个处理，直到请求发送到目标。举个例子，某个网站里有提交</span>
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">"</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">修改的注册信息</span>
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">"</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">的网页，当用户填写完成修改信息并提交后，服务端在进行真正的处理时需要做两个处理：客户端的会话是否有效；对提交的数据进行统一的编码，比如</span>
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">GB2312</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">。这两个处理可以在由两个过滤器组成的过滤链里进行处理。当过滤器处理成功后，把提交的数据发送到最终目标；如果过滤器处理不成功（比如客户端的会话无效），它将把视图派发到指定的错误页面。可以看出，过滤器就像一扇门，客户端要和服务端的某个目标交互，必须通过这扇门。</span>
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">  <br /><br />    </span>
				<span lang="ZH-CN" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">下面我们来看一个具体的例子，这个例子将介绍怎么开发过滤器，并且介绍怎么在</span>
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">web.xml</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">文件里配置过滤器。这个例子里有两个</span>
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">JSP</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">页面，前一个页面用户输入一些信息然后提交，后一个页面显示用户提交的信息。在提交信息后，要经过两个过滤器的处理，一个检查用户是否登录，一个把用户的提交信息用</span>
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">GB2312</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">进行重新编码。</span>
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'; mso-fareast-language: ZH-CN">  <br /><br />    </span>
				<span style="FONT-FAMILY: 'MS UI Gothic'">开发一个<span lang="EN-US">Filter，这个Filter需要实现Filter接口，Filter接口定义了以下的方法：  <br /><br />destroy() //由Web容器调用，销毁此Filter <br />init(FilterConfig filterConfig) ///由Web容器调用，初始化此Filter <br />doFilter(ServletRequest request, ServletResponse response,  <br />FilterChain chain)//具体过滤处理代码 <br />  <br /><br /><br />    下面我们来看对提交信息用GB2312进行重新编码的Filter，见示例14-7、示例14-8。 <br />    【程序源代码】  <br /><br />1 // ==================== Program Discription ===================== <br />2 // 程序名称：示例14-7 : EncodingFilter .java <br />3 // 程序目的：学习使用编码过滤器 <br />4 // ============================================================== <br />5 import javax.servlet.FilterChain; <br />6 import javax.servlet.ServletRequest; <br />7 import javax.servlet.ServletResponse; <br />8 import java.io.IOException; <br />9 import javax.servlet.Filter; <br />10 import javax.servlet.http.HttpServletRequest; <br />11 import javax.servlet.http.HttpServletResponse; <br />12 import javax.servlet.ServletException; <br />13 import javax.servlet.FilterConfig; <br />14  <br />15 public class EncodingFilter implements Filter <br />16 { <br />17      <br />18     private String targetEncoding = "gb2312"; <br />19     protected FilterConfig filterConfig; <br />20      <br />  <br />21     public void init(FilterConfig config) throws ServletException { <br />22         this.filterConfig = config; <br />23         this.targetEncoding = config.getInitParameter("encoding"); <br />24     } <br />25      <br />26     <br />27      public  void doFilter(ServletRequest srequest,  <br />ServletResponse  sresponse,FilterChain chain) <br />28         throws IOException, ServletException { <br />29         <br />30         HttpServletRequest request = (HttpServletRequest)srequest; <br />31         request.setCharacterEncoding(targetEncoding);//把请求用指定的方式编码 <br />32         // 把处理发送到下一个过滤器 <br />33        chain.doFilter(srequest,sresponse);  <o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: 'MS UI Gothic'">34     } <br />35      <br />36     public void destroy() <br />37  { <br />38   this.filterConfig=null; <br />39  } <br />40  <br />41  public void setFilterConfig(final FilterConfig filterConfig) <br />42  { <br />43   this.filterConfig=filterConfig; <br />44  } <br />45 } <br />  <br /><br /><br />    【程序源代码】  <br /><br />1 // ==================== Program Discription ===================== <br />2 // 程序名称：示例14-8 : LoginFilter.java <br />3 // 程序目的：学习使用登录过滤器 <br />4 // ============================================================== <br />5 import javax.servlet.FilterChain; <br />6 import javax.servlet.ServletRequest; <br />7 import javax.servlet.ServletResponse; <br />8 import java.io.IOException; <br />9 import javax.servlet.Filter; <br />10 import javax.servlet.http.HttpServletRequest; <br />11 import javax.servlet.http.HttpServletResponse; <br />12 import javax.servlet.ServletException; <br />13 import javax.servlet.FilterConfig; <br />14 <br />15 public class LoginFilter implements Filter <br />16 { <br />17  String LOGIN_PAGE="init.jsp"; <br />18  protected FilterConfig filterConfig; <br />  <br />19  public void doFilter(final ServletRequest req,final ServletResponse  <br />res,FilterChain chain)throws IOException,ServletException <br />20  { <br />21    HttpServletRequest hreq = (HttpServletRequest)req; <br />22          HttpServletResponse hres = (HttpServletResponse)res;  <br />23          String isLog=(String)hreq.getSession().getAttribute("isLog");   <br />24 if((isLog!=null)&amp;&amp;((isLog.equals("true"))||(isLog=="true")))//检查是否登录 <br />25    { <br />26     chain.doFilter(req,res); <br />27     return ; <br />28    } <br />29    else <br />30     hres.sendRedirect(LOGIN_PAGE);//如果没有登录，把视图派发到登录页面 <br />31  } <br />32   <br />33  public void destroy() <br />34  { <br />35   this.filterConfig=null; <br />36  } <br />37  public void init(FilterConfig config) <br />38  { <br />39   this.filterConfig=config; <br />40  } <br />41  public void setFilterConfig(final FilterConfig filterConfig) <br />42  { <br />43   this.filterConfig=filterConfig; <br />44  }  <br />45 } <br />  <br /><br /><br />    【程序注解】 <br />    正如前面所说，EncodingFilter的目的是把客户端的请求用指定的方式编码，具体的处理在request.setCharacterEncoding(targetEncoding)完成了。LoginFilter判断用户在进入目标之前是否登录，if((isLog!=null)&amp;&amp;((isLog.equals("true"))||(isLog=="true")))将检查用户是否登录，如果已登录，那么把视图让过滤链继续处理，如果没有登录，把视图派发到登录页面，过滤链处理结束。 <br />下面我们来看怎么在web.xml里配置这两个过滤器，代码如下所示： <br />    【程序源代码】  <br /><br />&lt;web-app&gt; <br />  &lt;filter&gt; <br />     &lt;filter-name&gt;encoding&lt;/filter-name&gt;  <br />           &lt;filter-class&gt;EncodingFilter&lt;/filter-class&gt;  <br />           &lt;init-param&gt; <br />             &lt;param-name&gt;encoding&lt;/param-name&gt; <br />             &lt;param-value&gt;gb2312&lt;/param-value&gt; <br />  <br />     &lt;/init-param&gt; <br />    &lt;/filter&gt;     <br />    &lt;filter&gt; <br />     &lt;filter-name&gt;auth&lt;/filter-name&gt; <br />     &lt;filter-class&gt;LoginFilter&lt;/filter-class&gt; <br />    &lt;/filter&gt; <br />     <br />    &lt;filter-mapping&gt;  <br />       &lt;filter-name&gt;encoding&lt;/filter-name&gt;  <br />       &lt;url-pattern&gt;/*&lt;/url-pattern&gt;   <br />     &lt;/filter-mapping&gt;   <br />    &lt;filter-mapping&gt; <br />      &lt;filter-name&gt;auth&lt;/filter-name&gt; <br />     &lt;url-pattern&gt;/target.jsp&lt;/url-pattern&gt; <br />    &lt;/filter-mapping&gt;     <br />&lt;/web-app&gt; <br />  <br /><br /><br />    【程序注解】 <br />    可以看出，配置Filter时，首先指定Filter的名字和Filter的实现类，如果有必要，还要配置Filter的初始参数；然后为Filter做映射，这个映射指定了需要过滤的目标（JSP、Servlet）。在上面的例子中，指定了EncodingFilter 为所有的JSP和Servlet做过滤，LoginFilter为target.jsp做过滤。这样，当客户请求target.jsp时，首先要经过EncodingFilter的处理，然后经过LoginFilter的处理，最后才把请求传递给target.jsp。  <br /><br />    【运行程序】 <br />    把程序部署到Web服务器里（比如Tomcat），然后启动Web服务器，在浏览器里输入以下URL（根据具体请求改变URL）：<a href="http://127.0.0.1:8080/ch14/target.jsp" target="_blank"><span style="COLOR: #261cdc">http://127.0.0.1:8080/ch14/target.jsp</span></a>  <br /><br />    那么Filter将会把视图派发到：<a href="http://127.0.0.1:8080/ch14/init.jsp" target="_blank"><span style="COLOR: #261cdc">http://127.0.0.1:8080/ch14/init.jsp</span></a>  <br /><br />    在init.jsp里，我们使用：  <br /><br />&lt;% session.setAttribute("isLog","true");%&gt; <br />  <br /><br /><br />    来设置用户已经登录（这里是简化的，在实际项目中，可能要经过验证处理）。在init.jsp里，可以提交一些中文的信息。由于提交的信息被EncodingFilter使用GB2312统一编码了，故在target.jsp里能够正确显示中文。您可以做一个试验，把  <br /><br />&lt;filter-mapping&gt;  <br />       &lt;filter-name&gt;encoding&lt;/filter-name&gt;  <br />       &lt;url-pattern&gt;/*&lt;/url-pattern&gt;   <br />&lt;/filter-mapping&gt; <br />  <br /><br /><br />改为  <br /><br />&lt;filter-mapping&gt;  <br />       &lt;filter-name&gt;encoding&lt;/filter-name&gt;  <br />       &lt;url-pattern&gt;/nothing&lt;/url-pattern&gt;   <br />&lt;/filter-mapping&gt; <br /><br />    然后重新启动Web服务器。那么在target.jsp里，中文将不能正确显示<o:p></o:p></span>
		</p>
<img src ="http://www.blogjava.net/mulin/aggbug/91971.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mulin/" target="_blank">公主她爹</a> 2007-01-05 13:53 <a href="http://www.blogjava.net/mulin/archive/2007/01/05/91971.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javax.servlet.Filter 的应用 </title><link>http://www.blogjava.net/mulin/archive/2007/01/05/91969.html</link><dc:creator>公主她爹</dc:creator><author>公主她爹</author><pubDate>Fri, 05 Jan 2007 05:51:00 GMT</pubDate><guid>http://www.blogjava.net/mulin/archive/2007/01/05/91969.html</guid><wfw:comment>http://www.blogjava.net/mulin/comments/91969.html</wfw:comment><comments>http://www.blogjava.net/mulin/archive/2007/01/05/91969.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mulin/comments/commentRss/91969.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mulin/services/trackbacks/91969.html</trackback:ping><description><![CDATA[
		<div id="art" style="MARGIN: 15px">
				<div>Filter过滤器的使用<br />本篇文章是介绍javax.servlet包中Filter的几个功能,一是字符编码过滤,二是拦截指文件夹中的文件,实现登录验证.实现以上两个功能需以下几个步骤:<br />1、实现javax.servlet.Filter接口，编写两个类，如下：</div>
				<div>/**<br /> * 作用：过滤编码<br /> */<br />package filter;<br />import java.io.IOException;<br />import javax.servlet.*;<br />import javax.servlet.http.HttpServletRequest;<br />public class EncodingFilter implements Filter<br />{<br />    protected FilterConfig filterConfig;<br />    private String targetEncoding;<br />    public EncodingFilter()<br />    {<br />        targetEncoding = "gb2312";//直接初始化0912<br />    }<br />    public void init(FilterConfig filterconfig) throws ServletException<br />    {<br />        filterConfig = filterconfig;<br />        //targetEncoding = filterconfig.getInitParameter("encoding");//web.xml挂参初始化<br />    }<br />    public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain)<br />        throws IOException, ServletException<br />    {<br />        HttpServletRequest httpservletrequest = (HttpServletRequest)servletrequest;<br />        httpservletrequest.setCharacterEncoding(targetEncoding);<br />        System.out.println("使用" targetEncoding "对请求进行编码过滤");<br />        filterchain.doFilter(servletrequest, servletresponse);<br />    }<br />    public void setFilterConfig(FilterConfig filterconfig)<br />    {<br />        filterConfig = filterconfig;<br />    }<br />    public void destroy()<br />    {<br />        filterConfig = null;<br />    }<br />}</div>
				<div>/**<br /> * 作用：过滤外界非法的进入页面<br /> * 注意：使用该功能时，一定要把登录页与被过滤文件夹设为同级，否则会出现循环<br /> */<br />package filter;<br />import java.io.IOException;<br />import javax.servlet.*;<br />import javax.servlet.http.*;<br />public class ManageFilter implements Filter<br />{<br />    String LOGIN_PAGE;<br />    protected FilterConfig filterConfig;<br />    public ManageFilter()<br />    {<br />        LOGIN_PAGE = "/login.jsp";<br />    }<br />    public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain)<br />        throws IOException, ServletException<br />    {<br />        HttpServletRequest request = (HttpServletRequest) servletrequest;<br />        HttpServletResponse response = (HttpServletResponse) servletresponse;<br />        HttpSession session = request.getSession();<br />        String key = "";<br />        try<br />        {<br />            //通过验证时在session中存的一个标志<br />     key = (String) session.getAttribute("key");<br />           <br />            <br />            if (key!= null&amp;&amp;key.equals("ok"))<br />            {<br />               <br />                filterchain.doFilter(servletrequest, servletresponse);<br />            }<br />            else<br />            {<br />                response.sendRedirect(LOGIN_PAGE);<br />                System.out.println("被拦截一个未认证的请求");<br />            }<br />        }<br />        catch (Exception exception)<br />        {<br />            exception.printStackTrace();<br />        }<br />    }<br />    public void setFilterConfig(FilterConfig filterconfig)<br />    {<br />        filterConfig = filterconfig;<br />    }<br />    public void destroy()<br />    {<br />        filterConfig = null;<br />    }<br />    public void init(FilterConfig filterconfig)<br />        throws ServletException<br />    {<br />        filterConfig = filterconfig;<br />    }<br />}</div>
				<div>2、在web.xml中做一些设置<br /> &lt;filter&gt;<br />     &lt;filter-name&gt;code&lt;/filter-name&gt;<br />     &lt;filter-class&gt;filter.EncodingFilter&lt;/filter-class&gt;<br /> &lt;/filter&gt;<br /> <br /> &lt;filter&gt;<br />     &lt;filter-name&gt;manage&lt;/filter-name&gt;<br />     &lt;filter-class&gt;filter.ManageFilter&lt;/filter-class&gt;<br /> &lt;/filter&gt;<br /> &lt;filter-mapping&gt;<br />     &lt;filter-name&gt;code&lt;/filter-name&gt;<br />     &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br /> &lt;/filter-mapping&gt;<br /> <br /> &lt;filter-mapping&gt;<br />     &lt;filter-name&gt;manage&lt;/filter-name&gt;<br />     &lt;!-- &lt;url-pattern&gt;/ShuiBaoRHPWK_NEW/system/ruhepaiwukou/*&lt;/url-pattern&gt;--&gt;<br />     &lt;url-pattern&gt;/servlets-examples/*&lt;/url-pattern&gt;<br /> &lt;/filter-mapping&gt;<br /></div>
		</div>
<img src ="http://www.blogjava.net/mulin/aggbug/91969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mulin/" target="_blank">公主她爹</a> 2007-01-05 13:51 <a href="http://www.blogjava.net/mulin/archive/2007/01/05/91969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>servlet和JSP过滤器Filter</title><link>http://www.blogjava.net/mulin/archive/2007/01/05/91965.html</link><dc:creator>公主她爹</dc:creator><author>公主她爹</author><pubDate>Fri, 05 Jan 2007 05:47:00 GMT</pubDate><guid>http://www.blogjava.net/mulin/archive/2007/01/05/91965.html</guid><wfw:comment>http://www.blogjava.net/mulin/comments/91965.html</wfw:comment><comments>http://www.blogjava.net/mulin/archive/2007/01/05/91965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mulin/comments/commentRss/91965.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mulin/services/trackbacks/91965.html</trackback:ping><description><![CDATA[
		<div class="cnt">
				<p>servlet和JSP过滤器Filter<br /><br />或许，servlet API的2.3版本中最重要的一个新功能就是能够为servlet和JSP页面定义过滤器。过滤器提供了某些早期服务器所支持的非标准“servlet链接”的一种功能强大且标准的替代品。<br />过滤器是一个程序，它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上，并且可以检查进入这些资源的请求信息。在这之后，过滤器可以作如下的选择：<br />l 以常规的方式调用资源（即，调用servlet或JSP页面）。<br />l 利用修改过的请求信息调用资源。<br />l 调用资源，但在发送响应到客户机前对其进行修改<br />l 阻止该资源调用，代之以转到其他的资源，返回一个特定的状态代码或生成替换输出。<br />过滤器提供了几个重要好处。<br />首先，它以一种模块化的或可重用的方式封装公共的行为。你有30个不同的serlvet或JSP页面，需要压缩它们的内容以减少下载时间吗？没问题：构造一个压缩过滤器（参阅第11节），然后将它应用到30个资源上即可。<br />其次，利用它能够将高级访问决策与表现代码相分离。这对于JSP特别有价值，其中一般希望将几乎整个页面集中在表现上，而不是集中在业务逻辑上。例如，希望阻塞来自某些站点的访问而不用修改各页面（这些页面受到访问限制）吗？没问题：建立一个访问限制过滤器（参阅第8节）并把它应用到想要限制访问的页面上即可。<br />最后，过滤器使你能够对许多不同的资源进行批量性的更改。你有许多现存资源，这些资源除了公司名要更改外其他的保持不变，能办到么？没问题：构造一个串替换过滤器（参阅第10节），只要合适就使用它。<br />但要注意，过滤器只在与servlet规范2.3版兼容的服务器上有作用。如果你的Web应用需要支持旧版服务器，就不能使用过滤器。<br />1．  建立基本过滤器<br />建立一个过滤器涉及下列五个步骤：<br />1）建立一个实现Filter接口的类。这个类需要三个方法，分别是：doFilter、init和destroy。doFilter方法包含主要的过滤代码（见第2步），init方法建立设置操作，而destroy方法进行清楚。<br />2）在doFilter方法中放入过滤行为。doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息（包括表单数据、cookie和HTTP请求头）的完全访问。第二个参数为ServletResponse，通常在简单的过滤器中忽略此参数。最后一个参数为FilterChain，如下一步所述，此参数用来调用servlet或JSP页。<br />3）调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作为它的一个参数。在调用此对象的doFilter方法时，激活下一个相关的过滤器。如果没有另一个过滤器与servlet或JSP页面关联，则servlet或JSP页面被激活。<br />4）对相应的servlet和JSP页面注册过滤器。在部署描述符文件（web.xml）中使用filter和filter-mapping元素。<br />5）禁用激活器servlet。防止用户利用缺省servlet URL绕过过滤器设置。<br />1.1  建立一个实现Filter接口的类<br />所有过滤器都必须实现javax.servlet.Filter。这个接口包含三个方法，分别为doFilter、init和destroy。<br />l public void doFilter(ServletRequset request, <br />                    ServletResponse response,<br />                    FilterChain chain)<br />    thows ServletException, IOException<br />每当调用一个过滤器（即，每次请求与此过滤器相关的servlet或JSP页面）时，就执行其doFilter方法。正是这个方法包含了大部分过滤逻辑。<br />第一个参数为与传入请求有关的ServletRequest。对于简单的过滤器，大多数过滤逻辑是基于这个对象的。如果处理HTTP请求，并且需要访问诸如getHeader或getCookies等在ServletRequest中无法得到的方法，就要把此对象构造成HttpServletRequest。<br />第二个参数为ServletResponse。除了在两个情形下要使用它以外，通常忽略这个参数。首先，如果希望完全阻塞对相关servlet或JSP页面的访问。可调用response.getWriter并直接发送一个响应到客户机。第7节给出详细内容，第8节给出一个例子。其次，如果希望修改相关的servlet或JSP页面的输出，可把响应包含在一个收集所有发送到它的输出的对象中。然后，在调用serlvet或JSP页面后，过滤器可检查输出，如果合适就修改它，之后发送到客户机。详情请参阅第9节。<br />DoFilter的最后一个参数为FilterChain对象。对此对象调用doFilter以激活与servlet或JSP页面相关的下一个过滤器。如果没有另一个相关的过滤器，则对doFilter的调用激活servlet或JSP本身。<br />l public void init(FilterConfig config)<br />    thows ServletException<br />init方法只在此过滤器第一次初始化时执行，不是每次调用过滤器都执行它。对于简单的过滤器，可提供此方法的一个空体，但有两个原因需要使用init。首先，FilterConfig对象提供对servlet环境及web.xml文件中指派的过滤器名的访问。因此，普遍的办法是利用init将FilterConfig对象存放在一个字段中，以便doFilter方法能够访问servlet环境或过滤器名。这种处理在第3节描述。其次，FilterConfig对象具有一个getInitParameter方法，它能够访问部署描述符文件（web.xml）中分配的过滤器初始化参数。初始化参数的使用在第5节中描述。<br />l public void destroy( )<br />此方法在利用一个给定的过滤器对象永久地终止服务器（如关闭服务器）时调用。大多数过滤器简单地为此方法提供一个空体，不过，可利用它来完成诸如关闭过滤器使用的文件或数据库连接池等清除任务。<br />1.2  将过滤行为放入doFilter方法<br />doFilter方法为大多数过滤器地关键部分。每当调用一个过滤器时，都要执行doFilter。对于大多数过滤器来说，doFilter执行的步骤是基于传入的信息的。因此，可能要利用作为doFilter的第一个参数提供的ServletRequest。这个对象常常构造为HttpServletRequest类型，以提供对该类的更特殊方法的访问。<br />1.3  调用FilterChain对象的doFilter方法<br />Filter接口的doFilter方法以一个FilterChain对象作为它的第三个参数。在调用该对象的doFilter方法时，激活下一个相关的过滤器。这个过程一般持续到链中最后一个过滤器为止。在最后一个过滤器调用其FilterChain对象的doFilter方法时，激活servlet或页面自身。<br />但是，链中的任意过滤器都可以通过不调用其FilterChain的doFilter方法中断这个过程。在这样的情况下，不再调用JSP页面的serlvet，并且中断此调用过程的过滤器负责将输出提供给客户机。详情请参阅第7节。<br />1.4  对适当的servlet和JSP页面注册过滤器<br />部署描述符文件的2.3版本引入了两个用于过滤器的元素，分别是：filter和filter-mapping。filter元素向系统注册一个过滤对象，filter-mapping元素指定该过滤对象所应用的URL。<br />1.filter元素<br />filter元素位于部署描述符文件（web.xml）的前部，所有filter-mapping、servlet或servlet-mapping元素之前。filter元素具有如下六个可能的子元素：<br />l icon  这是一个可选的元素，它声明IDE能够使用的一个图象文件。<br />l filter-name  这是一个必需的元素，它给过滤器分配一个选定的名字。<br />l display-name  这是一个可选的元素，它给出IDE使用的短名称。<br />l description  这也是一个可选的元素，它给出IDE的信息，提供文本文档。<br />l filter-class  这是一个必需的元素，它指定过滤器实现类的完全限定名。<br />l init-param  这是一个可选的元素，它定义可利用FilterConfig的getInitParameter方法读取的初始化参数。单个过滤器元素可包含多个init-param元素。<br />请注意，过滤是在serlvet规范2.3版中初次引入的。因此，web.xml文件必须使用DTD的2.3版本。下面介绍一个简单的例子：<br />    &lt; xml version="1.0" encoding="ISO-8859-1" &gt;<br />    &lt;!DOCTYPE web-app PUBLIC<br />        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />        "<a href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>"&gt;<br />    &lt;web-app&gt;<br />      &lt;filter&gt;<br />        &lt;filter-name&gt;MyFilter&lt;/filter-name&gt;<br />        &lt;filter-class&gt;myPackage.FilterClass&lt;/filter-class&gt;<br />      &lt;/filter&gt;<br />      &lt;!-- ... --&gt;<br />      &lt;filter-mapping&gt;...&lt;/filter-mapping&gt;<br />    &lt;/web-app&gt;</p>
				<p>
						<br />2.filter-mapping元素<br />filter-mapping元素位于web.xml文件中filter元素之后serlvet元素之前。它包含如下三个可能的子元素：：<br />l filter-name  这个必需的元素必须与用filter元素声明时给予过滤器的名称相匹配。<br />l url-pattern  此元素声明一个以斜杠（/）开始的模式，它指定过滤器应用的URL。所有filter-mapping元素中必须提供url-pattern或servlet-name。但不能对单个filter-mapping元素提供多个url-pattern元素项。如果希望过滤器适用于多个模式，可重复整个filter-mapping元素。<br />l servlet-name  此元素给出一个名称，此名称必须与利用servlet元素给予servlet或JSP页面的名称相匹配。不能给单个filter-mapping元素提供多个servlet-name元素项。如果希望过滤器适合于多个servlet名，可重复这个filter-mapping元素。<br />下面举一个例子：<br />  &lt; xml version="1.0" encoding="ISO-8859-1" &gt;<br />    &lt;!DOCTYPE web-app PUBLIC<br />        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />        "<a href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>"&gt;<br />    &lt;web-app&gt;<br />      &lt;filter&gt;<br />        &lt;filter-name&gt;MyFilter&lt;/filter-name&gt;<br />        &lt;filter-class&gt;myPackage.FilterClass&lt;/filter-class&gt;<br />      &lt;/filter&gt;<br />      &lt;!-- ... --&gt;<br />      &lt;filter-mapping&gt;<br />        &lt;filter-name&gt;MyFilter&lt;/filter-name&gt;<br />        &lt;url-pattern&gt;/someDirectory/SomePage.jsp&lt;/url-pattern&gt;<br />      &lt;/filter-mapping&gt;<br />    &lt;/web-app&gt;</p>
				<p>1.5  禁用激活器servlet<br />在对资源应用过滤器时，可通过指定要应用过滤器的URL模式或servlet名来完成。如果提供servlet名，则此名称必须与web.xml的servlet元素中给出的名称相匹配。如果使用应用到一个serlvet的URL模式，则此模式必须与利用web.xml的元素servlet-mapping指定的模式相匹配。但是，多数服务器使用“激活器servlet”为servlet体统一个缺省的URL：<a href="http://host/WebAppPrefix/servlet/ServletName">http://host/WebAppPrefix/servlet/ServletName</a>。需要保证用户不利用这个URL访问servlet（这样会绕过过滤器设置）。<br />例如，假如利用filter和filter-mapping指示名为SomeFilter的过滤器应用到名为SomeServlet的servlet，则如下：<br />  &lt;filter&gt;<br />      &lt;filter-name&gt;SomeFilter&lt;/filter-name&gt;<br />      &lt;filter-class&gt;somePackage.SomeFilterClass&lt;/filter-class&gt;<br />    &lt;/filter&gt;<br />    &lt;!-- ... --&gt;<br />    &lt;filter-mapping&gt;<br />      &lt;filter-name&gt;SomeFilter&lt;/filter-name&gt;<br />      &lt;servlet-name&gt;SomeServlet&lt;/servlet-name&gt;<br />    &lt;/filter-mapping&gt;</p>
				<p>
						<br />接着，用servlet和servlet-mapping规定URL  <a href="http://host/webAppPrefix/Blah">http://host/webAppPrefix/Blah</a> 应该调用SomeSerlvet，如下所示：</p>
				<p>  &lt;filter&gt;<br />      &lt;filter-name&gt;SomeFilter&lt;/filter-name&gt;<br />      &lt;filter-class&gt;somePackage.SomeFilterClass&lt;/filter-class&gt;<br />    &lt;/filter&gt;<br />    &lt;!-- ... --&gt;<br />    &lt;filter-mapping&gt;<br />      &lt;filter-name&gt;SomeFilter&lt;/filter-name&gt;<br />      &lt;servlet-name&gt;/Blah&lt;/servlet-name&gt;<br />    &lt;/filter-mapping&gt;</p>
				<p>
						<br />现在，在客户机使用URL  <a href="http://host/webAppPrefix/Blah">http://host/webAppPrefix/Blah</a> 时就会调用过滤器。过滤器不应用到<br /><a href="http://host/webAppPrefix/servlet/SomePackage.SomeServletClass">http://host/webAppPrefix/servlet/SomePackage.SomeServletClass</a>。<br />尽管有关闭激活器的服务器专用方法。但是，可移植最强的方法时重新映射Web应用钟的/servlet模式，这样使所有包含此模式的请求被送到相同的servlet中。为了重新映射此模式，首先应该建立一个简单的servlet，它打印一条错误消息，或重定向用户到顶层页。然后，使用servlet和servlet-mapping元素发送包含/servlet模式的请求到该servlet。程序清单9-1给出了一个简短的例子。</p>
				<p>程序清单9-1 web.xml（重定向缺省servlet URL的摘录）<br />   &lt; xml version="1.0" encoding="ISO-8859-1" &gt;<br />    &lt;!DOCTYPE web-app PUBLIC<br />        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />        "<a href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>"&gt;<br />    &lt;web-app&gt;<br />    &lt;!-- ... --&gt;<br />    &lt;servlet&gt;<br />      &lt;servlet-name&gt;Error&lt;/servlet-name&gt;<br />      &lt;servlet-class&gt;somePackage.ErrorServlet&lt;/servlet-class&gt;<br />    &lt;/servlet&gt;<br />    &lt;!-- ... --&gt;<br />    &lt;servlet-mapping&gt;<br />      &lt;servlet-name&gt;Error&lt;/servlet-name&gt;<br />      &lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt;<br />    &lt;/servlet-mapping&gt;<br />    &lt;!-- ... --&gt;<br />    &lt;/web-app&gt;</p>
				<p>
						<br />2．  样例：报告过滤器<br />趁热打铁，我们来试验一个简单的过滤器，只要调用相关的servlet或JSP页面，它就打印一条消息到标准输出。为了完成此任务，相应的过滤器必须具有下面的内容：<br />1）实现Filter接口的一个类。这个类名为ReportFilter，如程序清单9-2所示。这个类对init和destroy方法提供空体。<br />2）在doFilter方法中过滤行为。每当调用与这个过滤器相关的servlet或JSP页面时，doFilter方法就生成一个打印输出，此输出列出请求主机和调用的URL。因为getRequestURL方法位于HttpServletRequest而不是ServletRequest中，所以把ServletRequest对象构造为HttpServletRequest类型。<br />3）调用FilterChain的doFilter方法。在打印输出报告后，过滤器调用FilterChain的doFilter方法激活servlet或JSP页面（如果有的话，调用下一个过滤器）<br />4）对Web应用主页和显示TodaysSpecialservlet进行注册。首先，filter元素将名称Reporter与类moreservlets.filters.ReportFilter相关联。然后，filter-mapping元素使用/index.jsp的url-pattern将过滤器与主页相关联。最后，filter-mapping元素使用TodaysSpecial的servlet-name将过滤器与TodaysSpecialservlet（名称TodaysSpecial是在servlet元素中声明的）相关联。参见程序清单9-3。<br />5）禁用激活器servlet。首先，建立一个RedirectorServlet（见程序清单9-6），它把接收到的所有请求重定向到此Web应用的主页。接着，利用servlet和servlet-mapping元素（参见程序清单9-3）指定所有以<a href="http://host/webAppPrefix/servlet/">http://host/webAppPrefix/servlet/</a> 开始的URL都应该激活RedirectorServlet。<br />给出这些设置后，每当客户机请求此Web应用主页（程序清单9-4）或TodaysSpecialservlet（程序清单9-5）时，都调用此过滤器。</p>
				<p>程序清单9-2 ReportFilter.java</p>
				<p>  package moreservlets.filters;</p>
				<p>import java.io.*;<br />import javax.servlet.*;<br />import javax.servlet.http.*;<br />import java.util.*; // For Date class</p>
				<p>/** Simple filter that prints a report on the standard output<br />* each time an associated servlet or JSP page is accessed.<br />*/</p>
				<p>public class ReportFilter implements Filter {<br />  public void doFilter(ServletRequest request,<br />                  ServletResponse response,<br />                  FilterChain chain)<br />      throws ServletException, IOException {<br />    HttpServletRequest req = (HttpServletRequest)request;<br />    System.out.println(req.getRemoteHost() +<br />                   " tried to access " +<br />                   req.getRequestURL() +<br />                   " on " + new Date() + ".");<br />    chain.doFilter(request,response);<br />  }</p>
				<p>  public void init(FilterConfig config)<br />      throws ServletException {<br />  }</p>
				<p>  public void destroy() {}<br />}</p>
				<p> </p>
				<p>程序清单9-3 web.xml（针对报告过滤器的摘录）<br />&lt; xml version="1.0" encoding="ISO-8859-1" &gt;<br />    &lt;!DOCTYPE web-app PUBLIC<br />        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />        "<a href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>"&gt;<br />    &lt;web-app&gt;<br />      &lt;!-- Register the name "Reporter" for ReportFilter. --&gt;<br />      &lt;filter&gt;<br />        &lt;filter-name&gt;Reporter&lt;/filter-name&gt;<br />        &lt;filter-class&gt;<br />          moreservlets.filters.ReportFilter<br />        &lt;/filter-class&gt;<br />      &lt;/filter&gt;<br />      &lt;!-- ... --&gt;<br />      &lt;!-- Apply the Reporter filter to home page. --&gt;<br />      &lt;filter-mapping&gt;<br />        &lt;filter-name&gt;Reporter&lt;/filter-name&gt;<br />        &lt;url-pattern&gt;/index.jsp&lt;/url-pattern&gt;<br />      &lt;/filter-mapping&gt;<br />      &lt;!-- Also apply the Reporter filter to the servlet named<br />          "TodaysSpecial".<br />      --&gt;<br />      &lt;filter-mapping&gt;<br />        &lt;filter-name&gt;Reporter&lt;/filter-name&gt;<br />        &lt;servlet-name&gt;TodaysSpecial&lt;/servlet-name&gt;<br />      &lt;/filter-mapping&gt;<br />      &lt;!-- ... --&gt;<br />    <br />      &lt;!-- Give a name to the Today's Special servlet so that filters<br />          can be applied to it.<br />      --&gt;<br />      &lt;servlet&gt;<br />        &lt;servlet-name&gt;TodaysSpecial&lt;/servlet-name&gt;<br />        &lt;servlet-class&gt;<br />          moreservlets.TodaysSpecialServlet<br />        &lt;/servlet-class&gt;<br />      &lt;/servlet&gt;<br />      &lt;!-- ... --&gt;<br />    <br />      &lt;!-- Make /TodaysSpecial invoke the servlet<br />          named TodaysSpecial (i.e., moreservlets.TodaysSpecial).<br />      --&gt;<br />      &lt;servlet-mapping&gt;<br />        &lt;servlet-name&gt;TodaysSpecial&lt;/servlet-name&gt;<br />        &lt;url-pattern&gt;/TodaysSpecial&lt;/url-pattern&gt;<br />      &lt;/servlet-mapping&gt;<br />    <br />      &lt;!-- Turn off invoker. Send requests to index.jsp. --&gt;<br />      &lt;servlet-mapping&gt;<br />        &lt;servlet-name&gt;Redirector&lt;/servlet-name&gt;<br />        &lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt;<br />      &lt;/servlet-mapping&gt;<br />      &lt;!-- ... --&gt;<br />    &lt;/web-app&gt;</p>
		</div>
<img src ="http://www.blogjava.net/mulin/aggbug/91965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mulin/" target="_blank">公主她爹</a> 2007-01-05 13:47 <a href="http://www.blogjava.net/mulin/archive/2007/01/05/91965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Servlet Flter简介</title><link>http://www.blogjava.net/mulin/archive/2007/01/05/91962.html</link><dc:creator>公主她爹</dc:creator><author>公主她爹</author><pubDate>Fri, 05 Jan 2007 05:44:00 GMT</pubDate><guid>http://www.blogjava.net/mulin/archive/2007/01/05/91962.html</guid><wfw:comment>http://www.blogjava.net/mulin/comments/91962.html</wfw:comment><comments>http://www.blogjava.net/mulin/archive/2007/01/05/91962.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mulin/comments/commentRss/91962.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mulin/services/trackbacks/91962.html</trackback:ping><description><![CDATA[Servlet filter简介<br /><br />本篇文章只是一篇学习笔记，其中参考了许多文章。<br /><br />一：简介<br /><br />filter（过滤器）是servlet2.3中增加的一个新功能，filter可以改变一个请求（request）或者是修改响应（response）。filter不是一个servlet，它只是一个servlet接受到请求前的预处理器。就是说，用户发送一个请求给servlet时，在servlet处理之前，这个filter首先执行，然后才是servlet的执行。<br /><br />二：作用<br /><br />filter可以用在下面几个方面<br /><br />1：访问特定资源（Web 页、JSP 页、servlet）时的身份认证<br />2：访问资源的记录<br /><br />3：访问资源的转换<br /><br />三：编写filter<br /><br />一个filter 必须实现javax.servlet.Filter 接口，即实现下面的三个方法：<br /><br /><br />1：void init(FilterConfig config) throws ServletException: 初始化方法<br />2：void destroy(): <br />3：void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException: 完成具体的过滤工作。<br /><br />四：示例<br /><br />示例一：限制访问资源<br /><br />我们以参考文献1中的第一个例子介绍怎样限制用户访问特定的资源<br /><br />在那个例子中，对浏览器为IE的用户做了限制，原文讲的很清楚，关键代码如下：<br /><br /><!--c1--><div class="codetop">CODE</div><div class="codemain"><!--ec1--><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.io.</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.servlet.</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.servlet.http.</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img id="Codehighlighter1_118_923_Open_Image" onclick="this.style.display='none'; Codehighlighter1_118_923_Open_Text.style.display='none'; Codehighlighter1_118_923_Closed_Image.style.display='inline'; Codehighlighter1_118_923_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_118_923_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_118_923_Closed_Text.style.display='none'; Codehighlighter1_118_923_Open_Image.style.display='inline'; Codehighlighter1_118_923_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> IEFilter </span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000"> Filter </span><span id="Codehighlighter1_118_923_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_118_923_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> FilterConfig filterConfig </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> doFilter(ServletRequest request, ServletResponse response,<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                         FilterChain chain)<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img id="Codehighlighter1_325_795_Open_Image" onclick="this.style.display='none'; Codehighlighter1_325_795_Open_Text.style.display='none'; Codehighlighter1_325_795_Closed_Image.style.display='inline'; Codehighlighter1_325_795_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_325_795_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_325_795_Closed_Text.style.display='none'; Codehighlighter1_325_795_Open_Image.style.display='inline'; Codehighlighter1_325_795_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> IOException, ServletException </span><span id="Codehighlighter1_325_795_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_325_795_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      String browserDet </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ((HttpServletRequest) request).getHeader(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">User-Agent</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">).toLowerCase();<br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img id="Codehighlighter1_470_746_Open_Image" onclick="this.style.display='none'; Codehighlighter1_470_746_Open_Text.style.display='none'; Codehighlighter1_470_746_Closed_Image.style.display='inline'; Codehighlighter1_470_746_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_470_746_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_470_746_Closed_Text.style.display='none'; Codehighlighter1_470_746_Open_Image.style.display='inline'; Codehighlighter1_470_746_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ( browserDet.indexOf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">msie</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)  </span><span id="Codehighlighter1_470_746_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_470_746_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            PrintWriter out </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> response.getWriter();<br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;h1&gt;Sorry, page cannot be displayed!&lt;/h1&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;/body&gt;&lt;/html&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            out.flush();<br /></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />          }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      chain.doFilter(request, response);<br /></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img id="Codehighlighter1_824_830_Open_Image" onclick="this.style.display='none'; Codehighlighter1_824_830_Open_Text.style.display='none'; Codehighlighter1_824_830_Closed_Image.style.display='inline'; Codehighlighter1_824_830_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_824_830_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_824_830_Closed_Text.style.display='none'; Codehighlighter1_824_830_Open_Image.style.display='inline'; Codehighlighter1_824_830_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> destroy() </span><span id="Codehighlighter1_824_830_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_824_830_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img id="Codehighlighter1_881_922_Open_Image" onclick="this.style.display='none'; Codehighlighter1_881_922_Open_Text.style.display='none'; Codehighlighter1_881_922_Closed_Image.style.display='inline'; Codehighlighter1_881_922_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_881_922_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_881_922_Closed_Text.style.display='none'; Codehighlighter1_881_922_Open_Image.style.display='inline'; Codehighlighter1_881_922_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> init(FilterConfig filterConfig) </span><span id="Codehighlighter1_881_922_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_881_922_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.filterConfig </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> filterConfig;<br /></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span></span></div></div><!--ec2--><br /><br /><br />看看doFilter的参数可知，利用request和response我们可以对做各种处理。例如可以通过ServletRequest类的getRemoteAddr()方法得到访问这个应用的客户端ip，然后对这个ip作一些处理，如果不符合条件，可以限制访问。这样可以很好的保护应用。<br /><br />示例二：资源转换<br /><br />参考文献一中的第二个例子演示了怎样将用户要访问的资源进行转换。<br /><br />示例三：访问记录<br /><br />类似于一个跟踪程序，参考文献二中的第二个例子演示了怎样记录用户访问的所有属于同一个应用的资源。<br /><br />五：配置<br /><br />以tomcat为例：每个使用filter的应用的web.xml类似下面<br /><!--c1--><div class="codetop">CODE</div><div class="codemain"><!--ec1--><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">web-app</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">filter</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">filter-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">Filter</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">filter-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> //这里是Filter的名字，随便你怎么起<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">filter-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">FilterClass</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">filter-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> //Filter的类名，注意包含package<br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">filter</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">filter-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">filter-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">Filter</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">filter-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">//与上面的保持一致<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> //对所有资源应用此filter<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">filter-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">web-app</span><span style="COLOR: #0000ff">&gt;</span></div><!--ec2--><br />如果一个应用有多个Filter，则在web.xml文件中，&lt;filter-mapping&gt;靠前的filter先执行。<br /><br />六：测试<br /><br />可以把参考文献一和二中的代码中的war文件放到tomcat\webapp目录下，启动tomcat，用类似http://localhost:8080/clickstream（此乃文献二中第二个例子的访问方法）访问。<br /><br />这只是一篇笔记，要想真正理解filter，建议读下面两篇文章。<br /><br />参考文献<br /><br /><a href="http://www-900.ibm.com/developerWorks/cn/java/j-tomcat/index.shtml" target="_blank"><font color="#384072">1：Tomcat 的过滤诀窍</font></a><br /><a href="http://www.javaworld.com/javaworld/jw-06-2001/jw-0622-filters.html" target="_blank"><font color="#384072">2：Filter code with Servlet 2.3 model</font></a><br /></div><img src ="http://www.blogjava.net/mulin/aggbug/91962.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mulin/" target="_blank">公主她爹</a> 2007-01-05 13:44 <a href="http://www.blogjava.net/mulin/archive/2007/01/05/91962.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>