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

    序言:从今天开始慢慢复习Java基础

     

    一:过滤器的简介

    1.1 过滤器是什么

    1:过滤器是javaweb中的三大组件之一,也就是说需要在web.xml中配置,也可以使用注解。

    2:过滤器它能够对Servlet容器传给web组件中的ServletRequest和ServletResponse对象进行检查或者修改。比如过滤器能够在Web组件被调用之前检查ServletRequest对象,修改请求头或者请求的正文;过滤器能够在被Web组件调用之后检查ServletResponse对象,修改响应头或者响应的内容。

    3:过滤器就像我们现实中的在窗户装一个过滤网,这样可以避免有蚊子进来,那么如果让蚊子进来呢?将那个过滤网的洞口变大一点,那么蚊子就可以进来了。

    4:过滤器它会在一组资源(jsp、servlet、.css、.html等等)的前面执行, 它可以让请求得到目标资源,也可以不让请求达到。

     

    1.2 使用过滤器的好处

     

    A:通过一个现实的例子:在没有使用过滤器之前,我举例生活中的一个例子,比如 某某公司,分配了好多个部门,每个部门门口前面都有一个保安来检查你是不是该公司的人,如果是,那么你就可以进去。 如果我们使用这种方式的话,那么一个公司就得多请几个保安,这样导致总是重复一些劳动,降低了保安的检查工作的效率。

    那么如果我们使用过滤器的话,就好比你在公司的大门面前,安排一个保安来检查是否是该公司的人,如果是,就放他进该公司,这样会大大提高保安的工作效率,而且还能减少重复劳动力,只需要请一个保安。

    B:当多个web组件中编写同样操作的代码,那么我们可以将各个组件的相同操作可以放在同个过滤器中来完成,从而提高开发的效率。

    二: Filter的API

    void init(FilterConfig)
      * 创建之后,马上执行;Filter会在服务器启动时就创建!
    void destory()
      * 销毁之前执行!在服务器关闭时销毁
    void doFilter(ServletRequest,ServletResponse,FilterChain)
      * 每次过滤时都会执行
    二个对象:
    FilterConfig(这个对象就类似当初学ServletConfig的时候)
    getInitparamer
    *获取初始化参数
    getFilterName
    *获取配置名称
    getServletContext
    *获取配置的值
    FilterChain(这个东西比较重要)
    *doFilter
    作用:这个东西其实就决定了整个Filter,该方法决定了是否放行下一个过滤器执行(如果没有过滤器的话,那么执行目标资源)。

    三:过滤器快速入门

    3.1步骤

    3.1.1 实现Filter接口

    因为Filter不是ServletRequest或者ServletResponse中的对象,所以我们只需要直接用java的方式实现Filter接口

    3.1.2 部署web.xml

    这个东西的部署跟Servlet的部署是一样的,只是把将Servle的名字改为Filter

     
       <servlet>                                                         <filter>
         <servlet-name>类名</servlet-name>                                  <filter-name>类名</filter-name>
          <servlet-class>包名.类名</servlet-class>                           <filter-class>包名.类名</filter-class>
       </servlet>                                                        </filter>
       <servlet-mapping>                                                     <filter-mapping>
         <servlet-name>类名</servlet-name>                                <filter-name>类名</filter-name>
         <url-pattern>/类名</url-pattern>                                 <url-pattern>拦截的资源</url-pattern>
       </servlet-mapping>                                                    <dispatcher>REQUEST</dispatcher>默认的!还有三个                                                                          值FORWARD,INCLUDE,ERROR
                                                                             </filter-mapping>
    View Code

    3.1.3  快速入门案例代码

    1   <servlet>                                                             <filter>
    2     <servlet-name>AServlet</servlet-name>                                <filter-name>类名</filter-name>
    3      <servlet-class>cn.itcast.web.AServlet.AServlet</servlet-class>      <filter-class>包名.类名</filter-class>
    4   </servlet>                                                            </filter>
    5   <servlet-mapping>                                                     <filter-mapping>
    6     <servlet-name>AServlet</servlet-name>                                <filter-name>类名</filter-name>
    7     <url-pattern>/AServlet</url-pattern>                                 <url-pattern>拦截的资源</url-pattern>
    8   </servlet-mapping>                                                    <dispatcher>REQUEST</dispatcher>默认的!还有三个                                                                          值FORWARD,INCLUDE,ERROR
    9                                                                         </filter-mapping>
    View Code

    效果图:

    四:Filter执行顺序

    前面我们说过,FilterChain中有个方法(doFilter)及其重要,它能够决定整个doFilter,因为它能够决定你是否能够执行下一个过滤器(如果没有过滤器的话,那么直接执行目标资源)。

    那么问题来了,当有多个过滤器的话,那么Filter的执行顺序是怎么样的?

    4.1  多个过滤器执行顺序

    当一个目标有多个过滤器执行顺序的时候,那么他的执行顺序是根据xml的中的位置,来执行过滤器的,

    那么如果当中有涉及到放行呢? 那么流程可以这样记 当你去姥姥家取水果的时候,会先经过匪徒A再经过匪徒B,如果当你去的时候,他们会放你过去 那么会经过AB,回来的就从先经过B再经过A。

    public class MyFilter1 extends HttpFilter {
        public void doFilter(HttpServletRequest request, HttpServletResponse response,
               FilterChain chain) throws IOException, ServletException {
           System.out.println("filter1 start...");
           chain.doFilter(request, response);//放行,执行MyFilter2的doFilter()方法
           System.out.println("filter1 end...");
        }
    }
    public class MyFilter2 extends HttpFilter {
        public void doFilter(HttpServletRequest request, HttpServletResponse response,
               FilterChain chain) throws IOException, ServletException {
           System.out.println("filter2 start...");
           chain.doFilter(request, response);//放行,执行目标资源
           System.out.println("filter2 end...");
        }
    }
      <body>
        This is my JSP page.
     
        <h1>index.jsp</h1>
        <%System.out.println("index.jsp"); %>
      </body>
     
    当用户访问index.jsp的时候,输出的结果:
    filter1 start...
    filter2 start...
    index.jsp
    filter2 end...
    filter1 end...
    View Code

    五:Filter 拦截方式

    附上 dispatcher 的可选值及说明

    可选值
    说明
    REQUEST
    当客户端直接请求时,通过过滤器进行处理
    INCLUDE
    当客户端通过 RequestDispatcher 对象的 include() 方法请求时,通过过滤器处理
    FORWARD
    当客户端通过 RequestDispatcher 对象的 forward() 方法请求时,通过过滤器进行处理
    ERROR
    当声明式异常产生时,通过过滤器进行处理
     

    六:过滤器的应用场景

    过滤器的应用场景:

    * 执行目标资源之前做预处理工作,例如设置编码,这种试通常都会放行,只是在目标资源执行之前做一些准备工作;

    * 通过条件判断是否放行,例如校验当前用户是否已经登录,或者用户IP是否已经被禁用;

    * 在目标资源执行后,做一些后续的特殊处理工作,例如把目标资源输出的数据进行处理;

     
     
  • 相关阅读:
    可视化工具Navicat 视图 事物 存储过程
    mysql用户管理 + pymysql的使用
    0914 表与表之间的关系补充一对一关系 记录操作 关键字 多对多 子查询
    0913数据库约束之主键 外键 非空 默认值约束 唯一约束 级联操作 表与表之间的联系
    数据库的数据类型
    面向对象之继承
    面向对象
    re模块
    加密常用模块
    日志模块
  • 原文地址:https://www.cnblogs.com/Yzengxin/p/11204486.html
Copyright © 2011-2022 走看看