zoukankan      html  css  js  c++  java
  • Filter过滤器

    • 什么是过滤器

      可以把过滤器理解为在容器中和servlet同一级别的组件,在容器中有被定义的生命周期,容器启动时会根据部署文件加载过滤器并执行其init方法,请求到来时才会调用doFilter  方法,和servlet组件很类似的是,过滤器需要实现javax.servlet.Filter接口,并充写其生命周期方法。

      值得注意的是:目标资源中的servlet或jsp执行完毕后,响应就会发送,因此如果是实现一个输出过滤器就要对输出进行处理即code2部分,则需要使用包装器,由于对原理不是很明白,因此暂略过,也是作为研究tomcat源码的思考课题!

      下面是过滤器的工作流程:

      

      代码目录

      

    • SimpleFilter.java
     1 package filter;
     2 import java.io.IOException;
     3 import java.io.PrintWriter;
     4 
     5 import javax.servlet.Filter;
     6 import javax.servlet.FilterChain;
     7 import javax.servlet.FilterConfig;
     8 import javax.servlet.ServletException;
     9 import javax.servlet.ServletRequest;
    10 import javax.servlet.ServletResponse;
    11 /**下面将展示其在容器中的生命周期方法,和servlet和容器的关系的类似。首先过滤器不能改变请求对象属性,但可以根据请求做响应处理!
    12 *    结合具体应用:init都初始化什么?销毁呢? 过滤链不能调用init/destory方法??servlet被包含在过滤器中,其生命周期执行完毕还要等过滤器完毕后容器才会发送响应
    13 *    tomcat原理思考:doFilter定位的资源已经填写了响应,容器不立即发送而是还要回到过滤器继续执行,怎么实现的,感觉很神秘??
    14 *    带着这些疑惑,写一些应用案例!
    15 */
    16 public class SimpleFilter implements Filter {
    17     private String ENCODE;//容器启动即初始化该成员变量
    18     
    19     @Override//初始化
    20     public void init(FilterConfig filterConfig) throws ServletException {
    21         ENCODE = filterConfig.getInitParameter("charset");
    22         System.out.println("init方法被执行"+ENCODE);
    23     }
    24 
    25     @Override//处理方法
    26     public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
    27             throws IOException, ServletException {
    28         res.setContentType("text/html;charset=GB2312");
    29         PrintWriter out = res.getWriter();
    30         out.println("before doFilter");  
    31         chain.doFilter(req, res);//使用过滤链,过滤链将res/req传递给下一个过滤器,没有下一个则定位到目标资源即jsp/servlet
    32         out.println("after doFilter");
    33         out.close();
    34     }
    35 
    36     @Override//销毁
    37     public void destroy() {
    38         System.out.println("销毁方法 被执行!");
    39     }
    40 
    41 }
    View Code

      服务器启动时会调用init方法,config对象封装了来自部署文件中的初始化参数,使得请求到来时doFilter方法可以访问已经初始化的成员变量。

    • web.xml

       和servlet组件类似,我们需要部署给容器;具体解释看注释:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
     3   <display-name>Servlet&amp;Jsp_servletSession2</display-name>
     4   <filter>
     5           <filter-name>SimpleFilter</filter-name>
     6           <filter-class>filter.SimpleFilter</filter-class>
     7           <init-param>   <!-- 被封装在config对象中 -->
     8             <param-name>charset</param-name>
     9             <param-value>utf-8</param-value>
    10         </init-param>
    11   </filter>
    12   <filter-mapping>
    13           <filter-name>SimpleFilter</filter-name>
    14           <url-pattern>/test.jsp</url-pattern> <!-- 请求模版或路径 ,即请求会执行该过滤器-->
    15           <dispatcher>REQUEST</dispatcher><!-- 请求方式,如果配置就和请求模版是逻辑与的关系       REQUEST表示客户端请求而来 -->
    16         <dispatcher>FORWARD</dispatcher><!-- 表示服务器内部转发 -->
    17         <!-- <dispatcher>INCLUDE</dispatcher> -->
    18         <!-- <dispatcher>ERROR</dispatcher>  -->
    19   </filter-mapping>
    20   
    21   
    22   <welcome-file-list>
    23     <welcome-file>index.html</welcome-file>
    24     <welcome-file>index.htm</welcome-file>
    25     <welcome-file>index.jsp</welcome-file>
    26     <welcome-file>default.html</welcome-file>
    27     <welcome-file>default.htm</welcome-file>
    28     <welcome-file>default.jsp</welcome-file>
    29   </welcome-file-list>
    30 </web-app>
    View Code
  • 相关阅读:
    SQL 列转行
    SQL 行转列
    ActionScript 3.0 学习笔记三
    VS 2010 添加扩展工具
    VS 2010 启动慢解决办法
    [SQL Server]游标示例
    SQL Server 2005 express TCP/IP 不能连接的配置
    FCKeditor.Net v2.6.3 上传图片的配置及注意事项
    HTTP/1.1 403 Forbidden
    存储过程中常使用的逻辑控制语句
  • 原文地址:https://www.cnblogs.com/10000miles/p/9277842.html
Copyright © 2011-2022 走看看