过滤器

        假设你们要进入一个城堡,这个城堡的规则是在第一关的时候你必须穿着正装,OK,门卫就会先看一下你是否穿着符合规则的正装;那个第一关的门卫就是过滤器,那如果是只有一个人申请进入城堡的话,门卫当然会只检查你一个人了。
       问题来了:1、门卫(过滤器)是什么意思?
                         2、我要进入城堡没错,但是我怎么确定你就是这个城堡的门卫呢?
                         3、我知道你是这个城堡的门卫,那你怎么工作的呢?
                         4、你的穿正装的规定是怎么定义的?
                         5、如果我穿的不符合规定,你怎么做啊?
                         6、我穿的是正装,那我能直接进入城堡吗?

        先来回答第一个问题:
1、门卫(过滤器)是什么意思?
        好的,大人,我先来回答第一个问题,门卫也是人,你可能会笑,OK,换句话,过滤器就是一个servlet。 Java Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或是其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。Servlet的简单教程链接: http://www.runoob.com/servlet/servlet-intro.html ,我就不再搬砖了。

         OK,我们知道门卫(过滤器)是什么了之后,就得回答第二个问题了。

2、眼前的这个门卫是这个城堡的门卫吗?我怎么让他成为我城堡的门外呢?
         回答:在web项目中的web.xml文件中配置代码如下:
    <filter>   
      <filter-name>filter</filter-name>   
      <filter-class>dc.gz.filters.MyCharsetFilter</filter-class>   
      <init-param>   
          <param-name>charset</param-name>   
          <param-value>UTF-8</param-value>   
      </init-param>   
      <init-param>   
          <param-name>contentType</param-name>   
          <param-value>text/html;charset=UTF-8</param-value>   
      </init-param>   
  </filter>   
  <filter-mapping>   
      <filter-name>filter</filter-name>   
      <!-- * 代表截获所有的请求  或指定请求/test.do  /xxx.do -->   
      <url-pattern>/*</url-pattern>   
  </filter-mapping>  

       有了这行代码,算是注册了,这就将urlFilter(url过滤器)放到这个城堡的外面了,成为一个门卫(过滤器)了。我这个城堡的主人只需要一次告诉他说:你是门卫了,你可以工作就可以。用专业的话讲就是: 它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁。
         
 3、我知道你是这个城堡的门卫,那你怎么工作的呢?
 答:当你知道你眼前的这个是门卫了,他的工作方式是:你发出一个请求,要进入城堡,门卫一看你穿的衣服,根据城堡主人的规定,得出你是否符合要求,如果符合且没有其他要求了,那你就能进入下一关,如果不符合,就需要告诉你,你不符合什么规则,没有办法进入城堡。
       用计算机语言就是:当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的Web资源处理。请求信息在过滤器链中可以被修改,也可以根据条件让请求不发往资源处理器,并直接向客户机发回一个响应。当资源处理器完成了对资源的处理后,响应信息将逐级逆向返回。同样在这个过程中,用户可以修改响应信息,从而完成一定的任务。
   
    好了,过了第一关,我们很高兴的以为能进入城堡,但是事多的城堡主人还有规定,女性必须是漂亮女人,而且打扮还必须很性感,得,这个时候怎么办?我们进入第二关,第三关,也就是一个检查链,在Java过滤器中过滤链FilterChain.
   
   FilterChain又是怎么回事?看下图:
   
    
     服务器按照web.xml中定义的过滤器的先后顺序来进入第一个过滤器的chain.doFilter(),然后进入第二个过滤器的chain.doFilter()方法,如果其中有不符合规则的,就给出响应。
     
4、你的穿正装的规定是怎么定义的?        
也就是说,在web服务中过滤器中的规则是如何定义的?
看下面的代码:
MyCharsetFilter.java 编码过滤器   
package ...;   
import ...;   
// 主要目的:过滤字符编码;其次,做一些应用逻辑判断等.    
// Filter跟web应用一起启动    
// 当web应用重新启动或销毁时,Filter也被销毁    
public   class  MyCharsetFilter implements Filter {   
      private  FilterConfig config =  null ;   
      public   void  destroy() {   
         System. out .println( "MyCharsetFilter准备销毁..." );   
     }   
    
      public   void  doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException {   
          // 强制类型转换    
         HttpServletRequest request = (HttpServletRequest)arg0;   
         HttpServletResponse response = (HttpServletResponse)arg1;   
          // 获取web.xm设置的编码集,设置到Request、Response中        
         request.setCharacterEncoding(config.getInitParameter("charset")); 
         response.setContentType(config.getInitParameter("contentType"));           
         // 将请求转发到目的地    
         chain.doFilter(request, response);   
     }   
    
      public   void  init(FilterConfig arg0) throws ServletException {   
          this .config = arg0;   
         System. out .println( "MyCharsetFilter初始化..." );   
     }   
 }   

OK,看这行代码: request.setCharacterEncoding(config.getInitParameter("charset"));   这行代码里的config.getInitParameter("charset")
拿的就是在web.xml文件中配置的<param-name>charset</param-name>   
                              <param-value>UTF-8</param-value>   它的值,也就是UTF-8;
 这样就会把所有的请求的编码都设置为UTF-8;下面的相同。


5、如果我穿的不符合规定,你怎么做啊?
         那就不行了,或者是空白页面,或者是404,如果浏览器自身有404页面,说不定你会得到浏览器自身的404页面哦。

6、我穿的是正装,那我能直接进入城堡吗?
       对的,符合规定了,也找到相应的方法了,那就可以进入服务器的返回信息。

         
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值