Filter与Listener 快速上手到实战——一文通透——你真的理解了Filter与Listener了么

📖本篇内容:Filter与Listener 快速上手——一文通透

📑 文章专栏:SSM入门到入坟——一站式基础以及进阶栏目

📆 更新周期:2022年1月18日起~2022年1月18日

🎬最近更新:2022年1月17日 Servlet入门到入坟 一站式基础及进阶——SpringMVC没它都不行 你确定不来看看——囊括初学基础以及进阶

🙊个人简介:一只二本院校在读的大三程序猿,本着注重基础,打卡算法,分享技术作为个人的经验总结性的博文博主,虽然可能有时会犯懒,但是还是会坚持下去的,如果你很喜欢博文的话,建议看下面一行~(疯狂暗示QwQ)

🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 关爱程序猿,从你我做起

📖Filter与Listener入门到进阶📖

💖写在前面💖

明天终于可以正式开刷SpringMVC内容了时间周期可能稍微拉长一点,后续结合SpringBoot二刷会更快,期间个人会整理一个简单的SSM让大家快速上手——保姆教程哦~从0到1一篇足够。最后大家一起加油,二刷知识面也不能忘了技术,也要夯实基础点,话不多说,本文应该一个小时之内能精通掌握

✨1、Filter✨

🎨1、Filter 是什么

web中的过滤器

​ 当访问服务器的资源时,过滤器可以将一部分请求拦截下来,完成一些特殊的功能与作用

过滤器的作用:

​ 一般用于完成通用的操作。

​ 如:登录验证统一编码处理敏感字符过滤等等。

🎨2、快速入门Filter

  • 创建一个用于拦截过滤请求的类,并且该类实现Filter接口(import javax.servlet.*;)

  • 实现方法doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain);

  • 配置拦截路径一般都是直接在类上用 注解

  • 也可以在web.XML文件中进行配置。

@WebFilter("/*")

HelloFilter.java

@WebFilter("/*")
public class HelloFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Hellofilter");
        // 允许执行
        filterChain.doFilter(request, response);
    }
    
    public void init(FilterConfig filterConfig) throws ServletException {
    
    }
    
    public void destroy() {
    
    }
}

在这里插入图片描述

配置web.xml文件

配置过滤器

并且要指定filter-namefilter的类路径

<filter>
        <filter-name>helloFilter</filter-name>
        <filter-class>com.alascanfu.filter.HelloFilter</filter-class>
    </filter>

配置过滤器的映射

需要通过filter-name 并且设置拦截路径。

<filter-mapping>
        <filter-name>helloFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

🎨3、Filter的执行流程

  • 执行过滤器代码
  • 执行放行后的servlet程序
  • 执行完之后执行过滤期之后的代码
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("HelloFilter...");
        //允许执行
        filterChain.doFilter(request, response);
        //回来之后执行
        System.out.println("GoodByeFilter...");
    
    }

在这里插入图片描述

🎨4、Filter的生命周期

  • init():服务器启动之后,会创建Filter对象,Filter对象通过调用init方法。进行初始化,加载资源,该方法只会执行一次
  • doFilter:每一次请求被拦截请求资源的时候都会被执行,可以被执行多次
  • destory:服务器关闭之后,Filter对象就会被销毁,服务器如果正常流程关闭,则会执行destory方法用于释放服务器资源,该方法也只会执行一次

🎨5、Filter中的urlPattern如何配置

  • 具体的url路径: /index.jsp 只有用户访问index.jsp资源时,向服务器发出请求,过滤器才会被执行。

  • 拦截目录: /identify/* 当用户访问了/user 路径下的所有资源时,过滤器都会被执行。

  • 通过通配符拦截😗.xml 当用户访问后缀名为xml文件时,过滤器都会被执行。

  • 拦截所有请求😕* 当用户访问所有资源时,过滤器都会被执行

🎨6、巧读WebFilter注解知其配置

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebFilter {
    //拦截的资源
    String[] urlPatterns() default {};

	//请求转发资源访问方式
    DispatcherType[] dispatcherTypes() default {DispatcherType.REQUEST};
    
}

我把Filter过滤器重要的两个属性标注出来了,可以通过配置以上两个来拿捏咱们的过滤器。

可以看到这个DispatcherType的枚举类。

/**
 * Enumeration of filter dispatcher types.
 *
 * @since Servlet 3.0
 */
public enum DispatcherType {
    FORWARD,
    INCLUDE,
    REQUEST,
    ASYNC,
    ERROR
}

**注解配置:**设置dispatcherTypes属性

​ 1. REQUEST默认值。浏览器直接请求资源

​ 2. FORWARD转发访问资源

​ 3. INCLUDE包含访问资源

​ 4. ERROR错误跳转资源

5. **ASYNC**:`异步访问`资源

1、访问所有资源时,该过滤器都会直接执行。

@WebFilter(value = "/login.jsp",dispatcherTypes = DispatcherType.REQUEST)

2、当资源被转发到了login.jsp时,该过滤器才会被执行。

@WebFilter(value = "/login.jsp",dispatcherTypes = DispatcherType.FORWARD)

3、当资源被转发到了login.jsp或者访问到login.jsp时,该过滤器都会被执行。

@WebFilter(value = "/login.jsp",dispatcherTypes = DispatcherType.FORWARD,DispatcherType.REQUEST)

如果你不通过注解配置,当然也可以采用在web.xml文件中进行配置。

<filter-mapping>
        <filter-name>helloFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
</filter-mapping>

🎨7、FilterChain(在配置多个过滤器链时)

当Servlet中存在多个过滤器时,它的执行顺序你应该看了上面的执行周期你就应该知道了大概了。

画个图你立马就了解:

在这里插入图片描述

顺序就是:当用户想要请求Servlet资源时,会先去访问过滤器1,如果通过接着访问过滤器2,拿到资源回来后,会先回到过滤器2执行过滤器2执行后的操作,然后再回到过滤器1,响应给浏览器,返回数据。

那我们该如何设置哪个过滤器在前哪个在后呢?

  • 说起来有点奇葩,注解配置是根据类名字符串比较规则,值小优先
  • web.xml配置就理解了谁定义在上边,谁先执行。(毕竟先来后到嘛

🎉8、实战案例 登录验证🎉

判断用户是否登录,登陆之后跳转请求的资源页面,如果没有登录跳转到登录页面

LoginFilter.java

@WebFilter("/*")
public class LoginFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    	//获取访问地址
        String uri = httpServletRequest.getRequestURI();
    	//如果访问地址包括登录页、验证码生成servlet、图片脚本、样式等页面直接放行。
        if (uri.contains("/login.jsp") || uri.contains("/loginServlet") || uri.contains("/css/") || uri.contains("/js/") || uri.contains("/fonts/") || uri.contains("/checkCodeServlet")){
            chain.doFilter(request, response);
        }else{
            //反之通过request获取Session中用户是否登陆过
            Object user = httpServletRequest.getSession().getAttribute("user");
            //如果得到了用户则方形
            if (user != null){
                chain.doFilter(request, response);
            }else {
                //反之设置错误信息
                request.setAttribute("login_msg","您尚未登录,请登录");
               
 //请求转发到登录页面
               	request.getRequestDispatcher("login.jsp").forward(request, response);
            }
        }
    }
    
    public void init(FilterConfig filterConfig) throws ServletException {
    
    }
    
    public void destroy() {
    
    }
}

测试

在这里插入图片描述

此时小付想直接登录到成功页面被转发到登录页面,并且把错误数据提示了
在这里插入图片描述

登录成功后就会跳转到正确的界面。

✨2、Listener✨

🧨1、Listener是什么

Listen是什么?

JavaWeb的三大组件之一用于监听与状态改变

🧨2、事件监听机制

  • 一件事情
  • 事件在哪里发生的
  • 用于监听的对象
  • 注册监听:将事件、事件源、监听器绑定在一起。 当事件源上发生某事件后执行监听器代码

🧨3、快速入门Listener

  • 创建一个用于监听事件的类,并且该类实现ServletContextListener接口

  • 配置拦截路径一般都是直接在类上用 注解

  • 也可以在web.XML文件中进行配置。

@WebListener

web.xml

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

通过listener标签配置监听器

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
</context-param>

指定初始化参数,在resources的资源目录下有applicationContext.xml文件用于监听Spring启动

通过注解进行设置监听器

MyListener.java

@WebListener
public class MyListener implements ServletContextListener {
    public void contextInitialized(ServletContextEvent sce) {
        //加载配置文件applicationContext.xml
        //获取Servlet上下文对象
        ServletContext servletContext = sce.getServletContext();
    
        //通过资源名获取资源地址
        String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");
        //获取真实地址
        String realPath = servletContext.getRealPath(contextConfigLocation);
    
        try {
            FileInputStream fis = new FileInputStream(realPath);
            System.out.println(fis);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println("ServletContext对象被创建");
    }
    
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContext对象被销毁");
    }
}

🧨4、Listener监听了些啥?

  • 当我们的类实现了ServletContextListener时,我们实际监听的是Servlet域对象 创建与销毁的过程。

它是为了监听在创建ServletContext对象时需要完成一些初始化任务,以及自定义任务的调度等工作。

  • 当我们的类实现了ServletRequestListener接口时,我们实际监听的服务器对用户的消息请求进行监听。

他是为了在服务器被用户请求访问时,请求与响应的监听,会在服务器对请求响应之后自动销毁监听。

  • 最后一个当我们的类实现了HttpSessionListener,我们实际监听的就是HttpSession域的事件发生。

他是为了统计当前域名有多少人创建了HttpSession的对象,用于记录当前域名站点被多少人注册登录过,Session用于存储用户的个人信息,每个用户就一个。

其实Listener还有很多内容,不过很多都不用我们考虑了,因为SpringMVC在这一块已经帮我们考虑的面面俱到了,我们只需要知道上述这些即可,完全发挥Filter 与 Listener 在SSM与SpringBoot中的威力了~

💖写在最后💖

一个人必须不停地写作

才能不被茫茫人海湮灭

今天小付又完成了这门Filter与Listener的进阶与夯实

主要目的是为了SpringMVC做铺垫

项目嘛 多练练就会了

本文截止6500字

加油哦 兄弟们~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Alascanfu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值