• JavaWeb-Filter


    1.入门

    xml配置--编写普通java类,实现filter接口

    public class QuickFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
        //初始化时调用
        }
        /**
         * 执行拦截的方法....
         *
         * @param servletRequest    :请求对象
         * @param servletResponse   :响应对象
         * @param filterChain       :过滤器链对象(是否放行)
         */
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("QuickFilter拦截了请求...");
            // 放行
            filterChain.doFilter(servletRequest, servletResponse);
        }
    
        @Override
        public void destroy() {
        //关闭时销毁
        }
    }

    --配置web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1">
        <!--快速入门-->
        <!--创建filter对象-->
        <filter>
            <filter-name>QuickFilter</filter-name>
            <filter-class>com.itheima.a_quick.QuickFilter</filter-class>
        </filter>
        <!--拦截请求-->
        <filter-mapping>
            <filter-name>QuickFilter</filter-name>
            <url-pattern>/quick.jsp</url-pattern>
        </filter-mapping>
    </web-app>

    --使用注解配置

    @WebFilter(filterName = "TestFilter", initParams = {@WebInitParam(name = "encode", value = "utf-8")}, dispatcherTypes = {DispatcherType.FORWARD, DispatcherType.REQUEST},value = "/*")
    public class TestFilter implements Filter {
        public void destroy() {
        }
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        }
        public void init(FilterConfig config) throws ServletException {
        }
    }

    2.生命周期

    // 过滤创建时,执行init方法
    public void init(FilterConfig config);
    
    // 过滤器拦截时,执行doFilter方法
    public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain);
    
    // 过滤器销毁时,执行destroy
    public void destroy();
    * 创建
       服务器启动时,创建filter对象,执行init方法(只执行一次)
            
    * 运行(过滤拦截)
       用户访问被拦截的目标资源时,都会执行doFilter方法
    
    * 销毁
       服务器关闭或项目卸载时,销毁filter对象,执行destroy方法(只执行一次)
            
    * 过滤器一定优于servlet等资源创建....

    3.拦截路径

     

    * 精准匹配
       用户访问指定目标资源(/show.jsp)时,过滤器拦截
            
    * 目录匹配
       用户访问指定目录下的资源(/user/*)时,过滤器拦截
    
    * 后缀匹配
       用户访问指定后缀名的资源(*.html | *.js | *.jsp)时,过滤器拦截
    
    * 匹配所有
       用户访问该项目下所有的资源(/*)时,过滤器拦截

     

    // @WebFilter("/show.jsp") // 精准匹配
    // @WebFilter("/user/*") // 目录匹配
    // @WebFilter("*.html") // 后缀匹配
    @WebFilter("/*") // 匹配所有
    public class UrlPatternFilter implements Filter {
    
        public void init(FilterConfig config) throws ServletException {
        }
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws ServletException, IOException {
            // 向下转型
            HttpServletRequest request = (HttpServletRequest) servletRequest;
            HttpServletResponse response = (HttpServletResponse) servletResponse;
    
            System.out.println("UrlPatternFilter拦截了请求...");
    
            // 放行
            chain.doFilter(request, response);
        }
        public void destroy() {
        }
    }

    --拦截方式

    拦截浏览器请求request,拦截转发请求forword

    <filter-mapping>
        <filter-name>name</filter-name>
        <url-pattern>/</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>

     

    @WebFilter(value = "/*.jsp",dispatcherTypes={DispatcherType.REQUEST,DispatcherType.FORWARD})
    FORWARD,//转发的
    INCLUDE,//包含在页面的
    REQUEST,//请求的
    ASYNC,//异步的
    ERROR;//出错的

    4.过滤器链-顺序问题

     

    1.在web.xml中,filter执行顺序跟<filter-mapping>的顺序有关,先声明的先执行
    2.使用注解配置的话,filter的执行顺序跟名称的字母顺序有关,例如AFilter会比BFilter先执行
    3.如果既有在web.xml中声明的Filter,也有通过注解配置的Filter,那么会优先执行web.xml中配置的Filter
    *注意:
      
    1.执行顺序跟<filter>的顺序无关
      2.<filter-mapping>的顺序才决定执行顺序

     

     

     

     

  • 相关阅读:
    layui + mvc + ajax 导出Excel功能
    PL/SQL Developer工具包和InstantClient连接Oracle 11g数据库
    .NET中JSON的序列化和反序列化的几种方式
    C# 编程中的堆栈(Stack)和队列(Queue)
    Oracle 数据库常用操作语句大全
    C#方法中参数ref和out的解析
    JS实现限行
    ajax+ashx 完美实现input file上传文件
    HTML5 学习
    Linux文件和目录操作管理命令
  • 原文地址:https://www.cnblogs.com/xiaozhang666/p/13398610.html
Copyright © 2020-2023  润新知