• 10_JavaWeb过滤器


    过滤器

    • 生活举例: 公司前台,停车场安保,地铁验票闸机

    • java中过滤仅仅是对请求做出过滤

    在这里插入图片描述

    客户端向服务器发出请求,在服务器内部,相应资源之前,如上如所示;就会经过一层过滤器,过滤器做出判断,如果不能通过会将其返回,如果通过那么就正常访问服务器资源;
    

    过滤器开发中应用的场景

    • 日志的记录
    • 性能的分析
    • 乱码的处理
    • 事务的控制
    • 登录的控制
    • 跨域的处理
    • … …

    1.过滤器的实现

    • 1.1实现过滤器

      • 实现Filter接口
      • 重写过滤方法
        • 如下图所示,重写的是doFilter方法
        • doFilter请求的时候对请求做出控制,相应的时候,可以对相应的内容进行控制;
    • 配置过滤器的映射

      • web.xml
      • 注解方式

    在这里插入图片描述

    1.1 实现过滤器

    • doFilter相关参数
         * @param servletRequest
         * @param servletResponse
         * @param filterChain      这是一个过滤器链,在执行到此方法前,可以进行多个过滤器,通过过滤器链可以对当前情况做出判断是否响应
    
    • 请求方面
      • 判断是否登录
      • 校验权限是否满足
    • 放行代码
          filterChain.doFilter(servletRequest,servletResponse);
    
    • 相应之前 做出业务简单逻辑
    /**
     * 日志过滤器,记录请求的历史
     */
    public class loggingFilter implements Filter {
        private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
        /**
         *
         * @param servletRequest
         * @param servletResponse
         * @param filterChain      这是一个过滤器链,在执行到此方法前,可以进行多个过滤器,通过过滤器链可以对当前情况做出判断是否响应
         */
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
    //        2.写出响应前代码,需求写响应日志
            System.out.println("响应前");
    
    //        参数父转子
            /**
             * 参数父转子
             *      Httpservlet对象是Servlet对象的子对象,功能强大 我们需要获取响应的uri因此需要转用子对象进行获取
             */
            HttpServletRequest req = (HttpServletRequest) servletRequest;
            HttpServletResponse res = (HttpServletResponse)servletResponse;
            String requestURI = req.getRequestURI();
            String data = dateFormat.format(new Date());
            String logging = requestURI+data+ "被访问了";
    
            System.out.println(logging);
    
    
    
    //        4.求1前后的时间差
            long l1 = System.currentTimeMillis();
    
    //        1.如果此过滤器进行放行,可以直接调用filterChain的doFilter方法
            filterChain.doFilter(servletRequest,servletResponse);
    
            long l2 = System.currentTimeMillis();
    
    
    //        3.写出响应之后的日志
            System.out.println("响应之后");
            String afterlogging = requestURI+data+ "响应了"+(l2-l1) +"毫秒";
            System.out.println(afterlogging);
    
        }
    }
    
    • 细节点
      • 响应前后时间使用System.currentTimeMillis()做差返回值为long
      • 时间日期格式化SimpleDateFormat().format(new Date)
      • doFilter中形参是ServletResponse,没有URI获取的功能,我们的一般做法是向下强转,转为功能更为强大的HttpServletResponse方法
    整体代码入上所示;结果如下所示;
    

    在这里插入图片描述

    1.2 配置过滤器

    1.2.1 过滤器的xml方式

    • 同Servlet配置
    
        
            filter1
            com.atguigu.filters.loggingFilter
        
    
        
            filter1
    
             /*
            Servlet1
        
    
    • 关于路径的配置过滤器可以url-pattern或者直接写url-name都可

    • 下面写法是通过url-pattern配置 批Servlet匹配;

    在这里插入图片描述

    • 如果配置Servlet-name那么此过滤照片不可用,且需要手动配置servlet-name

    在这里插入图片描述

    1.2.2 过滤器的注解方式

    @WebFilter("/*")
    

    在这里插入图片描述

    2. 过滤器的生命周期

    • 1.构造 constorct 默认重写

    • 2.初始化 init

    • 3.过滤 doFilter (多次)

    • 4.销毁 destory

    整体流程和Servlet生命周期一致
    

    3. 过滤器链使用

    • 过滤器链的形成是tomcat自动给我们形成的

    在这里插入图片描述

    观察上述图,不同过滤器约束不同的资源,请求发出的时候,请求经过过滤器链的 被约束过滤器,请求走的时候 以相反的方向经过过滤器的约束路径;具体Filter优先级,是看xml文件的filter-mapping标签配置顺序;
    仔细思考也能想清楚,filter-mapping关联request的url-pattern
    

    在这里插入图片描述

    如果是过滤器注解方式,其优先级是看filter的包下优先级
    
    也就是其字典顺序
    

    在这里插入图片描述

  • 相关阅读:
    算法 括号生成-(递归回溯+同向双指针)
    ECharts多个数据视图进行自适应大小的解决方案
    vue基础概念
    string类的使用方式的介绍
    VMware Fusion 13在M2芯片的Mac上安装 Windows 11
    唯众中职Web前端专业解决方案
    RocketMQ 相关文档
    Spark核心技术架构
    网络安全(黑客)——2024自学
    少即是多:视觉SLAM的点稀疏化(IROS 2022)
  • 原文地址:https://blog.csdn.net/m0_52474839/article/details/139458008