zoukankan      html  css  js  c++  java
  • 【笔记整理】之filter过滤器

    filter过滤器 

     1、什么是过滤器:

        1、对servlet的请求/响应进行一些额外操作或者处理,包括获取信息、添加信息、拦截
      2、一个filter过滤器可以对应于一个或者多个servlet
      3、请求servlet或者响应到前台之前 先要经过servlet过滤器
      也就是servlet容器在调用service()方法前调用doFilter()进行一些操作,并决定是否进行chain.doFilter()继续操作

    2、编写一个filter

      过滤器实现了 javax.servlet.Filter 接口的 Java类. 有三个方法:
      1、void init(FilterConfig filterConfig)
        web容器启动时候遍历 web部署描述符 进行过滤器初始化,只执行初始化一次
        通过filterConfig可以获取filter配置的init-param参数
        filterConfig.getInitParam("site"); ""里为param-name
      2、void doFilter(ServletRequest, ServletResponse, FilterChain)
        FilterChain接口只有一个方法:doFilter(ServletRequest, ServletResponse)
        作用是把web容器当前请求交给下一个过滤器或者servlet处理,如果没有调用FilterChain的doFilter方法 则该请求停止在此过滤器不会继续执行
      3、void destroy()
        过滤器实例回收前进行的资源回收操作.

    public class filter implements Filter {
    
        /**
         * 容器启动时候初始化一次
         */
        @Override
        public void init(FilterConfig config) {
            System.out.println("init  " + config.getInitParameter("name"));
            config.getFilterName();
            config.getInitParameterNames();
            config.getServletContext();
        }
        
        /**
         * 过滤器过滤处理操作,每次请求都处理;
         * chain为链子,链接所有过滤器;
         */
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
            System.out.println("doFilter1");
            try {
                chain.doFilter(request, response);
            } catch (IOException | ServletException e) {
                // TODO Auto-generated catch block
                System.out.println("error" + e.getMessage());
            }
        }
        
        /**
         * 资源回收
         */
        @Override
        public void destroy() {
            
        }
    }

    3、配置filter

      1、web.xml叫做web部署描述符,声明一些约定、规定的配置文件. 

      2、当web容器启动时候,会为web.xml(部署描述符)中配置的每一个过滤器启动一个实例.

      3、过滤器配置在 web.xml(部署描述符)里.跟servlet格式差不多
        一般将过滤器放在servlet前面

    <filter>
        <filter-name>test</filter-name>
        <filter-class>filter</filter-class>
        <init-param>
            <param-name>name</param-name>
            <param-value>test</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>test</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

       4、过滤器执行顺序跟web部署描述符里配置顺序有关,<filter-mapping>在前先配置的过滤器会先执行,某个请求的所有匹配的过滤器、servlet构成一条过滤链

    4、一些说明

      1、filter的init()初始化操作在tomcat完全启动之前就执行了

      2、如果//chain.doFilter(request, response); 注释掉了 请求这个地址时候,不会有进一步动作, 但是请求对应的servlet的初始化操作会先于过滤器doFilter之前执行
      3、关于<filter-mapping>节点下对应的servlet配置补充
        除了上面通过url-patten匹配servlet之外,还可以通过servlet-name匹配对应的servlet,同时servlet2.4新增dispatcher节点

    <filter-mapping>
      <filter-name></filter-name>
      <servlet-name></servlet-name>
      <dispatcher></dispatcher> 
    </filter-mapping>

      dispatcher 分配调度 必须在filter-mapping最后,且在servlet-name或url-pattern后面,将请求分为4个类型,只有匹配上的类型才可以执行次过滤器
        * REQUEST 正常请求(有几次执行几次),也是默认值
        * INCLUDE  引入<jsp:include page="../modules/common/archive.jsp"></jsp:include>
        * FORWARD 必须是转发,且出错跳转的不算在内
        * ERROR 是触发error由error-page跳转过来的时候,但是这个不触发forward
          

    <error-page>
        <error-code>500</error-code>
        <location>/filter/error.jsp</location>
    </error-page>

      4、关于转发与重定向对比

      转发 重定向
    客户端发起请求次数 1次 2次
    客户端URL是否变化 不变 变为重定向后的URL
    是否可以跨站点请求 不可以 可以
    响应速度 相对快 相对慢
    发起跳转 后端直接跳转 后端响应http code为3xx,前端重新发起请求

      实现方式: 

    //跳转
    request.getRequestDispatcher("http://localhost:8777/hello/form").forward(request, response);
    //重定向 response.sendRedirct("https://www.cnblogs.com/");
  • 相关阅读:
    codeforces 814B An express train to reveries
    codeforces 814A An abandoned sentiment from past
    codeforces 785D D. Anton and School
    codeforces 785C Anton and Fairy Tale
    codeforces 791C Bear and Different Names
    AOP详解
    Spring集成JUnit测试
    Spring整合web开发
    IOC装配Bean(注解方式)
    IOC装配Bean(XML方式)
  • 原文地址:https://www.cnblogs.com/whaleX/p/10486252.html
Copyright © 2011-2022 走看看