﻿<?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-我的Blog，我的舒亭-文章分类-JSP</title><link>http://www.blogjava.net/Aisce/category/25590.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 05 Sep 2007 06:46:47 GMT</lastBuildDate><pubDate>Wed, 05 Sep 2007 06:46:47 GMT</pubDate><ttl>60</ttl><item><title>一个servlet登陆过滤器</title><link>http://www.blogjava.net/Aisce/articles/142812.html</link><dc:creator>Aisce</dc:creator><author>Aisce</author><pubDate>Wed, 05 Sep 2007 02:11:00 GMT</pubDate><guid>http://www.blogjava.net/Aisce/articles/142812.html</guid><wfw:comment>http://www.blogjava.net/Aisce/comments/142812.html</wfw:comment><comments>http://www.blogjava.net/Aisce/articles/142812.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Aisce/comments/commentRss/142812.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Aisce/services/trackbacks/142812.html</trackback:ping><description><![CDATA[
		<p>1.Servlet 过滤器是什么？ <br />    Servlet 过滤器是小型的 Web 组件，它们拦截请求和响应，以便查看、提取或以某种方式操作正在客户机和服务器之间交换的数据。过滤器是通常封装了一些功能的 Web 组件，这些功能虽然很重要，但是对于处理客户机请求或发送响应来说不是决定性的。典型的例子包括记录关于请求和响应的数据、处理安全协议、管理会话属性，等等。过滤器提供一种面向对象的模块化机制，用以将公共任务封装到可插入的组件中，这些组件通过一个配置文件来声明，并动态地处理。</p>
		<p>     Servlet 过滤器中结合了许多元素，从而使得过滤器成为独特、强大和模块化的 Web 组件。也就是说，Servlet 过滤器是：</p>
		<p>声明式的：过滤器通过 Web 部署描述符（web.xml）中的 XML 标签来声明。这样允许添加和删除过滤器，而无需改动任何应用程序代码或 JSP 页面。 </p>
		<p>动态的：过滤器在运行时由 Servlet 容器调用来拦截和处理请求和响应。   </p>
		<p>灵活的：过滤器在 Web 处理环境中的应用很广泛，涵盖诸如日志记录和安全等许多最公共的辅助任务。过滤器还是灵活的，因为它们可用于对来自客户机的直接调用执行预处理和后期处理，以及处理在防火墙之后的 Web 组件之间调度的请求。最后，可以将过滤器链接起来以提供必需的功能。 </p>
		<p>模块化的：通过把应用程序处理逻辑封装到单个类文件中，过滤器从而定义了可容易地从请求/响应链中添加或删除的模块化单元。 </p>
		<p>可移植的：与 Java 平台的其他许多方面一样，Servlet 过滤器是跨平台和跨容器可移植的，从而进一步支持了 Servler 过滤器的模块化和可重用本质。 </p>
		<p>可重用的：归功于过滤器实现类的模块化设计，以及声明式的过滤器配置方式，过滤器可以容易地跨越不同的项目和应用程序使用。 </p>
		<p>透明的：在请求/响应链中包括过滤器，这种设计是为了补充（而不是以任何方式替代）servlet 或 JSP 页面提供的核心处理。因而，过滤器可以根据需要添加或删除，而不会破坏 servlet 或 JSP 页面。 </p>
		<p>2.Servlet 过滤器体系结构</p>
		<p>     正如其名称所暗示的， Servlet 过滤器用于拦截传入的请求和/或传出的响应，并监视、修改或以某种方式处理正在通过的数据流。过滤器是自包含、模块化的组件，可以将它们添加到请求/响应链中，或者在无需影响应用程序中其他 Web 组件的情况下删除它们。过滤器仅只是改动请求和响应的运行时处理，因而不应该将它们直接嵌入 Web 应用程序框架，除非是通过 Servlet API 中良好定义的标准接口来实现。 </p>
		<p>    Web 资源可以配置为没有过滤器与之关联（这是默认情况）、与单个过滤器关联（这是典型情况），甚至是与一个过滤器链相关联。那么过滤器究竟做什么呢？ 像 servlet 一样，它接受请求并响应对象。然后过滤器会检查请求对象，并决定将该请求转发给链中的下一个组件，或者中止该请求并直接向客户机发回一个响应。如果请求被转发了，它将被传递给链中的下一个资源（另一个过滤器、servlet 或 JSP 页面）。在这个请求设法通过过滤器链并被服务器处理之后，一个响应将以相反的顺序通过该链发送回去。这样就给每个过滤器都提供了根据需要处理响应对象的机会。</p>
		<p>    当过滤器在 Servlet 2.3 规范中首次引入时，它们只能过滤 Web 客户机和客户机所访问的指定 Web 资源之间的内容。如果该资源然后将请求调度给其他 Web 资源，那就不能向幕后委托的任何请求应用过滤器。2.4 规范消除了这个限制。Servlet 过滤器现在可以应用于 J2EE Web 环境中存在请求和响应对象的任何地方。因此，Servlet 过滤器可以应用在客户机和 servlet 之间、servlet 和 servlet 或 JSP 页面之间，以及所包括的每个 JSP 页面之间。这才是我所称的强大能力和灵活性！</p>
		<p>3.编写实现类的程序<br />    过滤器 API 包含 3 个简单的接口，它们整洁地嵌套在 javax.servlet 包中。那 3 个接口分别是 Filter 、 FilterChain 和 FilterConfig 。从编程的角度看，过滤器类将实现 Filter 接口，然后使用这个过滤器类中的 FilterChain 和 FilterConfig 接口。该过滤器类的一个引用将传递给 FilterChain 对象，以允许过滤器把控制权传递给链中的下一个资源。 FilterConfig 对象将由容器提供给过滤器，以允许访问该过滤器的初始化数据。 </p>
		<p>为了与我们的三步模式保持一致，过滤器必须运用三个方法，以便完全实现 Filter 接口： </p>
		<p>init() ：这个方法在容器实例化过滤器时被调用，它主要设计用于使过滤器为处理做准备。该方法接受一个 FilterConfig 类型的对象作为输入。 </p>
		<p>doFilter() ：与 servlet 拥有一个 service() 方法（这个方法又调用 doPost() 或者 doGet() ）来处理请求一样，过滤器拥有单个用于处理请求和响应的方法?D?D doFilter() 。这个方法接受三个输入参数：一个 ServletRequest 、 response 和一个 FilterChain 对象。 </p>
		<p>destroy() ：正如您想像的那样，这个方法执行任何清理操作，这些操作可能需要在自动垃圾收集之前进行。 </p>
		<p>SessionFilter.java<br />package net.pms.web.filter;</p>
		<p>import java.io.IOException;</p>
		<p>import javax.servlet.Filter;<br />import javax.servlet.FilterChain;<br />import javax.servlet.FilterConfig;<br />import javax.servlet.ServletException;<br />import javax.servlet.ServletRequest;<br />import javax.servlet.ServletResponse;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br />import javax.servlet.http.HttpServletResponseWrapper;</p>
		<p>/**<br />* @author jfish<br />* @since 2006.1.12<br />*/<br />public class SessionFilter implements Filter {</p>
		<p>     public static boolean isContains(String container, String[] regx) {<br />           boolean result = false;</p>
		<p>           for (int i = 0; i &lt; regx.length; i++) {<br />                 if (container.indexOf(regx[i]) != -1) {<br />                       return true;<br />                 }<br />           }<br />           return result;<br />     }</p>
		<p>     public FilterConfig config;</p>
		<p>     public void setFilterConfig(FilterConfig config) {<br />           this.config = config;<br />     }</p>
		<p>     public FilterConfig getFilterConfig() {<br />           return config;<br />     }</p>
		<p>     public void doFilter(ServletRequest request, ServletResponse response,<br />                 FilterChain chain) throws IOException, ServletException {</p>
		<p>           HttpServletRequest httpreq = (HttpServletRequest) request;<br />           HttpServletResponse httpres = (HttpServletResponse) response;</p>
		<p>           HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(<br />                       (HttpServletResponse) response);<br />           String logonStrings = config.getInitParameter("logonStrings");<br />           String includeStrings = config.getInitParameter("includeStrings");<br />           String redirectPath = httpreq.getContextPath()<br />                       + config.getInitParameter("redirectPath");<br />           String disabletestfilter = config.getInitParameter("disabletestfilter");</p>
		<p>           if (disabletestfilter.toUpperCase().equals("Y")) {<br />                 chain.doFilter(request, response);<br />                 return;<br />           }<br />           String[] logonList = logonStrings.split(";");<br />           String[] includeList = includeStrings.split(";");<br />           Object user = httpreq.getSession().getAttribute("userinfo");<br />           if (user == null) {<br />                 if (!this.isContains(httpreq.getRequestURI(), includeList)) {<br />                       chain.doFilter(request, response);<br />                       return;<br />                 }<br />                 if (this.isContains(httpreq.getRequestURI(), logonList)) {<br />                       chain.doFilter(request, response);<br />                       return;<br />                 }<br />                 wrapper.sendRedirect(redirectPath);</p>
		<p>           } else {<br />                 chain.doFilter(request, response);<br />           }<br />     }</p>
		<p>     public void destroy() {<br />           this.config = null;<br />     }</p>
		<p>     public void init(FilterConfig filterConfig) throws ServletException {<br />           this.config = filterConfig;<br />     }<br />}</p>
		<p>4.配置 Servlet 过滤器<br />在web.xml中：<br />        &lt;filter&gt;<br />           &lt;filter-name&gt;SessionFilter&lt;/filter-name&gt;<br />           &lt;filter-class&gt;net.pms.web.filter.SessionFilter&lt;/filter-class&gt;<br />           &lt;init-param&gt;<br />                 &lt;param-name&gt;logonStrings&lt;/param-name&gt;<br />                 &lt;param-value&gt;login.jsp&lt;/param-value&gt;<br />           &lt;/init-param&gt;<br />           &lt;init-param&gt;<br />                 &lt;param-name&gt;includeStrings&lt;/param-name&gt;<br />                 &lt;param-value&gt;.jsp;.html&lt;/param-value&gt;<br />           &lt;/init-param&gt;<br />           &lt;init-param&gt;<br />                 &lt;param-name&gt;redirectPath&lt;/param-name&gt;<br />                 &lt;param-value&gt;/login.jsp&lt;/param-value&gt;<br />           &lt;/init-param&gt;<br />           &lt;init-param&gt;<br />                 &lt;param-name&gt;disabletestfilter&lt;/param-name&gt;<br />                 &lt;param-value&gt;N&lt;/param-value&gt;<br />           &lt;/init-param&gt;<br />     &lt;/filter&gt;<br />      &lt;filter-mapping&gt;<br />           &lt;filter-name&gt;SessionFilter&lt;/filter-name&gt;<br />           &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />     &lt;/filter-mapping&gt;<br />其中参数logonStrings，登陆页面<br />includeStrings，过滤页面参数<br />redirectPath，没有登陆转向页面<br />disabletestfilter，过滤器是否有效。<br /></p>
<img src ="http://www.blogjava.net/Aisce/aggbug/142812.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Aisce/" target="_blank">Aisce</a> 2007-09-05 10:11 <a href="http://www.blogjava.net/Aisce/articles/142812.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Servlet过滤器</title><link>http://www.blogjava.net/Aisce/articles/142811.html</link><dc:creator>Aisce</dc:creator><author>Aisce</author><pubDate>Wed, 05 Sep 2007 02:10:00 GMT</pubDate><guid>http://www.blogjava.net/Aisce/articles/142811.html</guid><wfw:comment>http://www.blogjava.net/Aisce/comments/142811.html</wfw:comment><comments>http://www.blogjava.net/Aisce/articles/142811.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Aisce/comments/commentRss/142811.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Aisce/services/trackbacks/142811.html</trackback:ping><description><![CDATA[
		<p>一、Servlet过滤器的概念：<br />***************************************************************************************<br />Servlet过滤器是在Java Servlet规范2.3中定义的，它能够对Servlet容器的请求和响应对象进行检查和修改。　　　</p>
		<p>Servlet过滤器本身并不产生请求和响应对象，它只能提供过滤作用。Servlet过期能够在Servlet被调用之前检查Request对象，修改Request Header和Request内容；在Servlet被调用之后检查Response对象，修改Response Header和Response内容。</p>
		<p>Servlet过期负责过滤的Web组件可以是Servlet、JSP或者HTML文件。　<br />***************************************************************************************<br /><br />二、Servlet过滤器的特点：<br />***************************************************************************************<br />A．Servlet过滤器可以检查和修改ServletRequest和ServletResponse对象<br />B．Servlet过滤器可以被指定和特定的URL关联，只有当客户请求访问该URL时，才会触发过滤器<br />C．Servlet过滤器可以被串联在一起，形成管道效应，协同修改请求和响应对象<br />***************************************************************************************<br /><br />三、Servlet过滤器的作用：<br />***************************************************************************************<br />A．查询请求并作出相应的行动。<br />B．阻塞请求-响应对，使其不能进一步传递。<br />C．修改请求的头部和数据。用户可以提供自定义的请求。<br />D．修改响应的头部和数据。用户可以通过提供定制的响应版本实现。<br />E．与外部资源进行交互。<br />***************************************************************************************<br /><br />四、Servlet过滤器的适用场合：<br />***************************************************************************************<br />A．认证过滤<br />B．登录和审核过滤<br />C．图像转换过滤 <br />D．数据压缩过滤 <br />E．加密过滤 <br />F．令牌过滤 <br />G．资源访问触发事件过滤 <br />H．XSL/T过滤 <br />I．Mime-type过滤<br />***************************************************************************************<br /><br />五、Servlet过滤器接口的构成：<br />***************************************************************************************<br />所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法：</p>
		<p>A.init(FilterConfig)：<br />这是Servlet过滤器的初始化方法，Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数</p>
		<p>B.doFilter(ServletRequest,ServletResponse,FilterChain)：<br />这个方法完成实际的过滤操作，当客户请求访问于过滤器关联的URL时，Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器</p>
		<p>B.destroy()：<br />Servlet容器在销毁过滤器实例前调用该方法，这个方法中可以释放Servlet过滤器占用的资源<br />***************************************************************************************<br /><br />六、Servlet过滤器的创建步骤：<br />***************************************************************************************<br />A．实现javax.servlet.Filter接口<br />B．实现init方法，读取过滤器的初始化函数<br />C．实现doFilter方法，完成对请求或过滤的响应<br />D．调用FilterChain接口对象的doFilter方法，向后续的过滤器传递请求或响应<br />E．销毁过滤器<br />***************************************************************************************<br /><br />七、Servlet过滤器对请求的过滤：<br />***************************************************************************************<br />A．Servlet容器创建一个过滤器实例<br />B．过滤器实例调用init方法，读取过滤器的初始化参数<br />C．过滤器实例调用doFilter方法，根据初始化参数的值判断该请求是否合法<br />D．如果该请求不合法则阻塞该请求<br />E．如果该请求合法则调用chain.doFilter方法将该请求向后续传递<br />***************************************************************************************<br /><br />八、Servlet过滤器对响应的过滤：<br />***************************************************************************************<br />A．过滤器截获客户端的请求<br />B．重新封装ServletResponse，在封装后的ServletResponse中提供用户自定义的输出流<br />C．将请求向后续传递<br />D．Web组件产生响应<br />E．从封装后的ServletResponse中获取用户自定义的输出流<br />F．将响应内容通过用户自定义的输出流写入到缓冲流中<br />G．在缓冲流中修改响应的内容后清空缓冲流，输出响应内容<br />***************************************************************************************</p>
		<p>九、Servlet过滤器的发布：<br />***************************************************************************************<br />A．发布Servlet过滤器时，必须在web.xml文件中加入&lt;filter&gt;元素和&lt;filter-mapping&gt;元素。</p>
		<p>B．&lt;filter&gt;元素用来定义一个过滤器：<br />属性                   含义<br />filter-name    指定过滤器的名字<br />filter-class    指定过滤器的类名<br />init-param    为过滤器实例提供初始化参数，可以有多个</p>
		<p>C．&lt;filter-mapping&gt;元素用于将过滤器和URL关联：<br />属性                     含义<br />filter-name    指定过滤器的名字<br />url-pattern    指定和过滤器关联的URL，为"/*"表示所有URL<br />***************************************************************************************<br /><br />十一、Servlet过滤器使用的注意事项<br />***************************************************************************************<br />A．由于Filter、FilterConfig、FilterChain都是位于javax.servlet包下，并非HTTP包所特有的，所以其中所用到的请求、响应对象ServletRequest、ServletResponse在使用前都必须先转换成HttpServletRequest、HttpServletResponse再进行下一步操作。</p>
		<p>B．在web.xml中配置Servlet和Servlet过滤器，应该先声明过滤器元素，再声明Servlet元素<br /><br />C．如果要在Servlet中观察过滤器生成的日志，应该确保在server.xml的localhost对应的&lt;host&gt;元素中配置如下&lt;logger&gt;元素：<br />&lt;Logger className = "org.apache.catalina.logger.FileLogger"<br />directory = "logs"prefix = "localhost_log."suffix=".txt"<br />timestamp = "true"/&gt;<br />***************************************************************************************<br /></p>
<img src ="http://www.blogjava.net/Aisce/aggbug/142811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Aisce/" target="_blank">Aisce</a> 2007-09-05 10:10 <a href="http://www.blogjava.net/Aisce/articles/142811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>