springboot中的过滤器和监听器

简介: springboot中的过滤器和监听器

公众号merlinsea


  • 过滤器

   过滤器:当用户请求访问某个路径的时候,会先执行过滤器中的逻辑,然后在决定是否放行执行接下去的controller层的逻辑。


登陆过滤器的执行流程:

1、用户首先通过公有路径登陆,登陆了以后会为用户生成一个token并返回给用户同时把token存在本地。

2、用户下单通过私有路径,(因为必须先登录再下单)

3、由于过滤器配置的是对私有路径进行拦截,因此当用户下单的时候会先执行过滤器的逻辑再决定是否放行。

4、过滤器发现用户没有携带token或者是token异常那么就不会进行放行,并把登陆不成功的信息通过HttpServletResponse返回给前端。


LoginFileter登陆过滤器编写


/**
 * 实现的是WebFilter包下的过滤器
 * 当访问路径是api/v1/pri/开头的都要先经过这个过滤器处理以后在决定是否执行后面的controller逻辑
 * @WebFilter 标记这个类是一个过滤器类,交给spring扫描并配置过滤路径
 * init()方法是在过滤器逻辑执行之前使用
 * doFilter()方法是过滤器的核心逻辑,通常会判断token信息是否合法
 * destroy()方法是过滤器核心逻辑之后使用
 */
@WebFilter(urlPatterns = "/api/v1/pri/*", filterName = "loginFilter")
public class LoginFilter implements Filter {
    private static final ObjectMapper objectMapper = new ObjectMapper();
    /**
     * 容器加载的时候
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init LoginFilter======");
    }
   @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("doFilter LoginFilter======");
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;
        String token = req.getHeader("token");
        if(StringUtils.isEmpty(token)){
            token = req.getParameter("token");
        }
        if(!StringUtils.isEmpty(token)){
            //判断token是否合法
            User user = UserServiceImpl.sessionMap.get(token);
            if(user!=null){
                //token合法逻辑,放行
                filterChain.doFilter(servletRequest,servletResponse);
            }else {
                //token不合法逻辑,不放行,通过HttpServletResponse返回token不合法给前端
               JsonData jsonData =  JsonData.buildError("登录失败,token无效",-2);
                String jsonStr = objectMapper.writeValueAsString(jsonData);
                renderJson(resp,jsonStr);
            }
        }else {
            //token没有,通过HttpServletResponse返回token为空给前端
            JsonData jsonData =  JsonData.buildError("未登录",-3);
            String jsonStr = objectMapper.writeValueAsString(jsonData);
            renderJson(resp,jsonStr);
        }
    }
    //自定义的把数据返回给前端
    private void renderJson(HttpServletResponse response,String json){
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json");
        try(PrintWriter writer = response.getWriter()){
            writer.print(json);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    /**
     * 容器销毁的时候
     */
    @Override
    public void destroy() {
        System.out.println("destroy LoginFilter======");
    }
}

640.png


  • 监听器

   监听器:监听某一个动作,然后做出相应的反应,主要用于排错定位,不做业务逻辑!!

   监听器用@WebListner注解标识。

  • ServletContextListener
  • 应⽤启动监听,开启springboot项目和关闭springboot项目的时候调用,主要用于资源初始化。
  • ServletRequestListener
  • 请求监听,开启一个url请求和关闭一个url请求的时候调用,可以用于定位请求日志。
  • HttpSessionLisener
  • 会话监听,分布式系统中很少使用。


 1、ServletContextListener,应用启动监听器


/**
 * 应用上下文监听器
 * 启动项目和关闭项目的时候调用
 * @WebListner 告诉springboot这是一个监听器
 */
@WebListener
class ApplicationListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("contextInitialized====");
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("contextDestroyed====");
    }
}


2、ServletRequestListener 请求监听,开启一个url请求的时候调用,可以用于定位请求日志


/**
 * 请求监听器,用于监听每一个请求的创建和销毁,可以用于打印日志排错
 * 开启一个url请求和关闭一个url请求的时候调用
 * @WebListener 告诉springboot这是一个监听器
 */
@WebListener
class CustomRequestListener implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println("requestDestroyed====");
    }
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("requestInitialized====");
    }
}


3、HttpSessionLisener 会话监听

/**
 * 会话监听器,现在分布式应用中很少使用
 */
@WebListener
class CustomSessionListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("sessionCreated====");
    }
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("sessionDestroyed====");
    }
}
相关文章
|
2月前
|
Java 容器
如何在SpringBoot项目中使用过滤器和拦截器
过滤器和拦截器是日常开发中常用技术,用于对特定请求进行增强处理,如插入自定义代码以实现特定功能。过滤器在请求到达 `servlet` 前执行,而拦截器在请求到达 `servlet` 后执行。`SpringBoot` 中的拦截器依赖于 `SpringBoot` 容器,过滤器则由 `servlet` 提供。通过实现 `Filter` 接口并重写 `doFilter()` 方法可实现过滤器;通过实现 `HandlerInterceptor` 接口并重写相应方法可实现拦截器。两者的主要区别在于执行时机的不同,需根据具体场景选择使用。
163 4
如何在SpringBoot项目中使用过滤器和拦截器
|
6月前
|
Java Spring 容器
【二十二】springboot整合拦截器实战并对比过滤器
【二十二】springboot整合拦截器实战并对比过滤器
81 0
|
3月前
|
SQL Java 测试技术
在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证
204 0
|
3月前
|
前端开发 JavaScript Java
【实操】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本
本文介绍了一个结合SpringBoot和Python的实用功能,旨在监控iPhone 15的库存状态并通过邮件提醒用户。系统采用SpringBoot监听苹果官网API,解析JSON数据判断是否有货,并展示最近的库存记录。此外,还能自动触发Selenium+Python脚本实现自动化购买。文中详细介绍了技术栈、接口分析、邮件配置及自动化脚本的设置方法。该项目不仅适用于熟悉后端开发的人员,也适合回顾Layui和Jquery等前端技术。
53 0
【实操】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本
|
23天前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
21 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
1月前
|
设计模式 Java Spring
Spring Boot监听器的底层实现原理
Spring Boot监听器的底层实现原理主要基于观察者模式(也称为发布-订阅模式),这是设计模式中用于实现对象之间一对多依赖的一种常见方式。在Spring Boot中,监听器的实现依赖于Spring框架提供的事件监听机制。
25 1
|
3月前
|
缓存 Java 数据库
Spring Boot中使用监听器
系统的介绍了监听器原理,以及在 Spring Boot 中如何使用监听器,列举了监听器的三个常用的案例,有很好的实战意义。最后讲解了项目中如何自定义事件和监听器,并结合微服务中常见的场景,给出具体的代码模型,均能运用到实际项目中去,希望读者认真消化。
|
6月前
|
NoSQL Java Redis
Spring Boot 监听 Redis Key 失效事件实现定时任务
Spring Boot 监听 Redis Key 失效事件实现定时任务
139 0
|
5月前
|
Java API 数据安全/隐私保护
在Spring Boot中,过滤器(Filter)是一种非常有用的组件
在Spring Boot中,过滤器(Filter)是一种非常有用的组件
80 6
|
5月前
|
监控 NoSQL Java
在 Spring Boot 中实现 Redis 的发布/订阅功能可以通过 RedisTemplate 和消息监听器来完成
在 Spring Boot 中实现 Redis 的发布/订阅功能可以通过 RedisTemplate 和消息监听器来完成
224 1