zoukankan      html  css  js  c++  java
  • 学习笔记_过滤器概述(过滤器JavaWeb三大组件之一)

          

    过滤器Filter
    Filter和Lister是Servlet规范里的两个高级特性。不同于Servlet,它们不用于处理客户端请求,只用于对request、
    response进行修改或者对context、session、request事件进行监听
    Filter意为滤镜或者过滤器,用于Servlet之外对request或者response进行修改。Filter提出了滤镜链的概念,一个
    Filterchain包括多个F

    1 什么是过滤器

      过滤器JavaWeb三大组件之,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的。

          当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“放行”,那么会继承执行用户请求的Servlet;如果Filter不“放行”,那么就不会执行用户请求的Servlet。

          其实可以这样理解,当用户请求某个Servlet时,Tomcat会去执行注册在这个请求上的Filter,然后是否“放行”由Filter来决定。可以理解为,Filter来决定是否调用Servlet!当执行完成Servlet的代码后,还会执行Filter后面的代码。

                          

     

    2 过滤器之hello world

      其实过滤器与Servlet很相似,我们回忆一下如果写的第一个Servlet应用!写一个类,实现Servlet接口!没错,写过滤器就是写一个类,实现Filter接口。

    public class HelloFilter implements Filter {

        public void init[崔1] (FilterConfig filterConfig) throws ServletException {}

        public void doFilter[崔2] (ServletRequest request, ServletResponse response,

               FilterChain chain) throws IOException, ServletException {

           System.out.println("Hello Filter");

        }

        public void destroy[崔3] () {}

    }

          

     [崔1]不去理会它 

     [崔2]当访问被拦截资源时,doFilter()方法会被调用!我们先不去管它的参数是什么作用! 

     [崔3]不去理会它 

     [崔4]指定要拦截的路径!当用户访问index.jsp页面时,HelloFilter就会被执行

    第二步也与Servlet一样,在web.xml文件中部署Filter:

      <filter>

        <filter-name>helloFilter</filter-name>

        <filter-class>cn.itcast.filter.HelloFilter</filter-class>

      </filter>

      <filter-mapping>

        <filter-name>helloFilter</filter-name>

        <url-pattern>/index.jsp[崔4] </url-pattern>

      </filter-mapping>

     

            应该没有问题吧,都可以看懂吧!

             OK了,现在可以尝试去访问index.jsp页面了,看看是什么效果!

             当用户访问index.jsp页面时,会执行HelloFilter的doFilter()方法!在我们的示例中,index.jsp页面是不会被执行的,如果想执行index.jsp页面,那么我们需要放行!

        public void doFilter(ServletRequest request, ServletResponse response,  FilterChain chain) throws IOException, ServletException {

           System.out.println("filter start...");[崔5] 

           chain.doFilter(request, response);[崔6] 

           System.out.println("filter end...");[崔7] 

        }

     

     [崔5]执行index.jsp之前执行 

     [崔6]放行!表示执行index.jsp 

     [崔7]在执行index.jsp后执行这一句 

     

      

            有很多同学总是错误的认为,一个请求在给客户端输出之后就算是结束了,这是不对的!其实很多事情都需要在给客户端响应之后才能完成!

     


     
    每天都做更好的自己,不纠结于输赢成败
  • 相关阅读:
    json dump dumps load loads
    python tip: 格式化 深浅copy sorted
    转载整理
    python 计算器练习
    实验5 OSPF虚连接和验证配置
    实验4 OSPF的特殊区域STUB和NSSA
    实验3ospf路由聚合
    实验2 OSPF基本配置
    实验1静态ECMP的浮动静态路由配置
    补充实验6:tftp
  • 原文地址:https://www.cnblogs.com/snowwhite/p/4639375.html
Copyright © 2011-2022 走看看