• 【笔记整理】之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/");
  • 相关阅读:
    Visual C# 2008+SQL Server 2005 数据库与网络开发14.2.3 WWF的功能
    Visual C# 2008+SQL Server 2005 数据库与网络开发14.1.3 WPF的架构
    Visual C# 2008+SQL Server 2005 数据库与网络开发14.3.2 WCF的架构
    Visual C# 2008+SQL Server 2005 数据库与网络开发14.3.1 WCF介绍
    Visual C# 2008+SQL Server 2005 数据库与网络开发14.2.2 WWF的结构
    Visual C# 2008+SQL Server 2005 数据库与网络开发 14.2 Windows Workflow Foundation(WWF)
    Visual C# 2008+SQL Server 2005 数据库与网络开发14.1.4 WPF和XAML
    Visual C# 2008+SQL Server 2005 数据库与网络开发 14.3 Windows Communication Foundation(WCF)
    Visual C# 2008+SQL Server 2005 数据库与网络开发14.2.1 WWF简介
    Visual C# 2008+SQL Server 2005 数据库与网络开发 14.4 小结
  • 原文地址:https://www.cnblogs.com/whaleX/p/10486252.html
Copyright © 2020-2023  润新知