JavaWeb-Filter过滤器

Filter是JavaEE的规范,是一个接口,用于拦截请求,过滤响应,在获取目标资源之前执行

在这里插入图片描述

作为一个拦截器,主要的核心目的就是拦截请求数据,对session中的数据进行判断和处理

如何自定义一个Filter

  1. 创建一个类,继承javax.servlet.Filter接口

    public class MyFilter implements Filter {
    }
    
  2. 重写init、destory、doFilter方法

    public class MyFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            Filter.super.init(filterConfig);
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
        }
    
        @Override
        public void destroy() {
            Filter.super.destroy();
        }
    }
    

    doFilter方法是用于拦截请求的核心方法

  3. 在doFilter方法中处理拦截逻辑

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        HttpSession session = httpServletRequest.getSession();
        User user = (User)session.getAttribute("user");
        //没有登录,则跳转到login.jsp
        if (user == null) {
            servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
        }else{
            //这段代码表示让程序继续向下访问用户的目标资源
            filterChain.doFilter(servletRequest, servletResponse);
        }
    }
    
  4. 在web.xml文件中配置filter映射

    <filter>
        <!--filter别名-->
        <filter-name>MyFilter</filter-name>
        <filter-class>com.carl.filter.MyFilter</filter-class>
    </filter>
    <filter-mapping>
        <!--映射<filter-name>的value值,表示当前拦截路径给哪个filter使用-->
        <filter-name>MyFilter</filter-name>
        <!--配置拦截路径
            /表示请求地址为:http://ip:port/工程路径/  即项目的web目录下
            /img/* 表示img目录下的所有文件-->
        <url-pattern>/</url-pattern>
    </filter-mapping>
    

Filter的生命周期

  1. 创建构造器
  2. int初始化方法
    在web工程启动时执行构造器和init方法,表示创建了Filter拦截器
  3. doFilter
    浏览器每次访问web.xml中的拦截路径,就会触发调用doFilter方法
  4. destory
    停止web工程时就会销毁拦截器

FilterConfig类

Filter拦截器的配置文件类,Tomcat每次创建Filter的时候,也会同时创建一个FilterConfig类,该类包含了Filter的配置信息

FilterConfig类的作用:

  • 获取Filter的名称filter-name的内容
    String filterName = filterConfig.getFilterName();
    
  • 获取Filter中配置的init-param初始化参数
    String userName = filterConfig.getInitParameter("userName");
    Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();
    
  • 获取ServletContext对象
    ServletContext servletContext = filterConfig.getServletContext();
    

FilterChain过滤器链

多个过滤器如何一起工作?FilterChain.doFilter的作用就是将所有Filter串联起来

如果存在多个过滤器,执行流程如下:
在这里插入图片描述

  • 浏览器发起请求,经过Filter过滤器
  • Filter过滤器进行拦截,并开始执行,执行到filterChain.doFilter()方法
  • 判断后面是否还有其他过滤器,如果有,则执行其他过滤器,如果没有则直接访问目标资源
  • 其他过滤器执行流程与上面类似,直到访问到目标资源后,才可以执行filter中的后置代码(挨个向前执行)

注意事项:

  1. 没有fiterChain.doFilter()将不会访问到目标资源,直接返回
  2. 多个Filter执行的时候,执行的优先顺序是由它们在web.xml文件中从上到下的配置顺序决定的
  3. 所有filter和目标资源默认都执行在同一个线程中
  4. 多个filter共同执行的时候,它们都使用的是同一个Request对象

Filter的拦截路径

  • 精确匹配

    <url-pattern>/index.jsp</url-pattern>
    

    拦截路径必须是:http://ip:port/工程路径/index.jsp

  • 目录匹配

    <url-pattern>/admin/*</url-pattern>
    

    拦截路径必须是:http://ip:port/工程路径/admin/
    admin目录下的所有资源

  • 后缀名匹配(不要用/开头)

    <url-pattern>*.html</url-pattern>
    

    拦截路径必须以.html结尾才会被拦截

    <!--常用的拦截为*.do或*.action-->
    <url-pattern>*.do</url-pattern>
    <url-pattern>*.action</url-pattern>
    

    filter只关心请求的地址是否匹配,不关心请求的资源是否存在

  • 13
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Carl·杰尼龟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值