Filter拦截器从入门到快速上手与Listener监听器概述

前置内容:

1、 过滤器Filter

1.1 Filter快速入门

  • 使用步骤

    1. 定义类并实现Filter接口
    2. 定义@WebFilter注解,配置拦截路径
    3. 放行
    4. (请求其他资源)
  • Demo

    package priv.dandelion.controller.filter;
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException;
    @WebFilter("/*")
    public class FilterDemo implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    // 放行前逻辑
    System.out.println("FilterDemo...");
    // 放行
    filterChain.doFilter(servletRequest, servletResponse);
    // 放行后逻辑
    }
    @Override
    public void destroy() {
    }
    }

1.2 Filter执行流程

  1. 浏览器发送请求到服务器
  2. Filter拦截请求
  3. 执行放行前逻辑
  4. 放行请求
  5. 访问对应资源
  6. 执行放行后逻辑
  7. 服务器对浏览器做出响应

1.3 Filter使用细节

  • 拦截路径配置

    • 拦截具体资源:/index.jsp
    • 目录拦截:/user/*
    • 后缀名拦截:*.jsp
    • 拦截所有:/*
  • 过滤器链

    • 一个Web应用可以配置多个过滤器,多个过滤器成为过滤器链

      • 多个过滤器逐一放行
      • 请求资源
      • 按照递归顺序执行过滤器链的放行后逻辑
    • 过滤器链的过滤顺序

      • 若使用注解配置过滤器,则按照全类名进行排序,即为过滤器链的执行顺序
      • 可在XML中配置顺序

1.4 案例

  • 需求

    • 访问服务器资源时,需要先进行登录验证,如果没有登录则自动跳转到登录页面
  • 方式

    • 判断请求资源是否和登录注册相关,若是则放行
    • 判断Session中是否有User对象,若有则放行,否则跳转到登录
  • 环境准备

    环境和案例框架见:用户登录注册案例

  • 代码实现

    package priv.dandelion.controller.filter;
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;
    import java.io.IOException;
    @WebFilter("/*")
    public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) servletRequest;
    // 判断访问的资源是否和登录注册相关
    String[] urls = {"/login.jsp", "/register.jsp", "/imgs/", "/css/", "/login", "/register", "/checkCode"};
    // 获取当前访问资源的路径
    String requestURL = req.getRequestURL().toString();
    for (String url : urls) {
    if (requestURL.contains(url)) {
    // 若为和登录注册相关的资源,则放行并直接结束过滤器执行
    System.out.println(url);
    filterChain.doFilter(req, servletResponse);
    return;
    }
    }
    // 判断Session中是否有user
    // 获取Session
    Object user = req.getSession().getAttribute("user");
    if (user != null) {
    // 放行
    System.out.println("已登录,放行"+ user);
    filterChain.doFilter(servletRequest, servletResponse);
    } else {
    // 存储提示信息,拦截跳转到登录页面
    System.out.println("未登录,将跳转到登录页面");
    req.setAttribute("login_msg", "您尚未登录!");
    req.getRequestDispatcher("/login.jsp").forward(req, servletResponse);
    }
    }
    @Override
    public void destroy() {
    }
    }

2、 监听器Listener概述

2.1 概述

  • Listener 表示监听器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。

  • 监听器可以监听就是在 applicationsessionrequest 三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。

    applicationServletContext 类型的对象。

    ServletContext 代表整个web应用,在服务器启动的时候,tomcat会自动创建该对象。在服务器关闭时会自动销毁该对象。

2.2 分类

监听器分类 监听器名称 作用
ServletContext监听 ServletContextListener 用于对ServletContext对象进行监听(创建、销毁)
:: ServletContextAttributeLintener 用于对ServletContext对象中的属性的监听(增删改属性)
Session监听 HttpSessionListener 对Session对象的整体状态监听(创建、销毁)
:: HttpSessionAttributeLintener 对Session对象中的属性的监听(增删改属性)
:: HttpSessionBindingListener 监听对象与Session的绑定和解除
:: HttpSessionActivationListener 对Session数据的钝化和活化的监听
Request监听 ServletRequestListener 对Request对象的监听(创建、销毁)
:: ServletRequestAttributeListener 对Request对象中属性的监听(增删改属性)

2.3 代码演示

package priv.dandelion.controller.Listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class ContextLoaderListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
// 加载资源
System.out.println("ContextLoaderListener initialized...");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
// 释放资源
System.out.println("ContextLoaderListener destroyed...");
}
}
posted @   Dandelion_000  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示