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配置
<!--    过滤器写法 同Servlet配置-->
    <filter>
        <filter-name>filter1</filter-name>
        <filter-class>com.atguigu.filters.loggingFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>filter1</filter-name>
<!--
        url-pattern 根据请求路径 指定过滤
            /*          匹配所有
            /a/*        匹配a开头所有
            *.html      匹配所有html后缀
            /Servlet1   精确匹配

        servlet-name 指定特定Servlet进行过滤

        规则
            一个filter-mapping可以多个url-pattern和servlet-name
-->
        <url-pattern> /*</url-pattern>
        <servlet-name>Servlet1</servlet-name>
    </filter-mapping>
  • 关于路径的配置过滤器可以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的包下优先级

也就是其字典顺序

在这里插入图片描述

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值