SpringBoot2.0(过滤器,监听器,拦截器)

目录

  • 一,过滤器
    • 1.1,自定义Filter
    • 1.2,启动类代码
    • 1.2,创建filter类和LoginFilter包
      • 1.2.1,编写loginFilter类 过滤器代码
      • 1.2.2,创建二个Controller类
  • 二,监听器
    • 2.1,自定义监听器
    • 2.2,创建listenter包和MyListenter类
      • 2.2.1,编写MyListenter类 监听器代码
  • 三,拦截器
    • 3.1,创建自定义拦截器配置类
    • 3.2,创建配置包config和配置类MyWebMvcConfigurer
    • 3.3,创建拦截器包interceptor和Logininterceptor类
  • 四,按顺序进行拦截,先注册,先被拦截

一,过滤器

1.1,自定义Filter

  1. 使用Servlet3.0的注解进行配置
  2. 启动类里面增加 @ServletComponentScan ,进行扫描
  3. 新建一个Filter类,implements Filter ,并实现对应接口
  4. @WebFilter 标记一个类为Filter,被spring进行扫描
  5. urlPatterns:拦截规则,支持正则
  6. 控制chain.doFilter的方法的调用,来实现是否通过放行,
    不放行的话,web应用resp.sendRedirect(“/index.html”)
    场景:权限控制,用户登录(非前端后端分离场景)等

1.2,启动类代码

package com.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;@SpringBootApplication
@ServletComponentScan  // 扫描select的注解
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class,args);}}

1.2,创建filter类和LoginFilter包

在这里插入图片描述

1.2.1,编写loginFilter类 过滤器代码

package com.demo.filter;import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.PrintWriter;@WebFilter(urlPatterns = {"/*"})
@Order(Ordered.HIGHEST_PRECEDENCE)    // 设置过滤器的排序,int类型
public class LoginFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("初始化过滤器");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("doFilter");
//        servletResponse.setCharacterEncoding("UTF-8");// 设置响应的字符编码为UTF-8servletResponse.setCharacterEncoding("UTF-8");// 设置响应的内容类型为text/plain;charset=UTF-8servletResponse.setContentType("text/plain;charset=UTF-8");// 登录过滤器 有两种情况,需要放行// 1,登录请求要放行// 2. 不是登录请求,但是有登录tokenString uri = ((HttpServletRequest)servletRequest).getRequestURI();System.out.println(uri);if (uri.startsWith("/login/")){  // 判断是否以 /login/ 开头// 放行filterChain.doFilter(servletRequest,servletResponse);}else {// 从请求中获取tokenString token = ((HttpServletRequest)servletRequest).getParameter("token");if (token != null && !"".equals(token)){// 其实还需要进行解码,现在是只要有token就放行filterChain.doFilter(servletRequest,servletResponse);}else {PrintWriter pw = servletResponse.getWriter();pw.flush();pw.write("请先登录");pw.close();}}}@Overridepublic void destroy() {System.out.println("销毁过滤器");}
}

1.2.2,创建二个Controller类

看看是不是以login开头的放行

第一个controller类为LoginController

package com.demo.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/login")
public class LoginController {@RequestMapping("/doLogin")public Object doLogin(){return "登录接口";}
}

在这里插入图片描述

第二个controller类为HelloController

看看不是以login会不会过滤

package com.demo.controller;import com.demo.bean.Person;
import com.demo.config.BootProperties;
import com.demo.config.SysProperties;
import com.demo.util.ResultUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.util.ClassUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import javax.xml.crypto.Data;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.UUID;@RestController
public class HelloController {@Autowiredprivate BootProperties bootProperties;@RequestMapping("/test6")public Object test6(){return sysProperties.getParam1()+sysProperties.getParam2();}
}
// 整个之前的代码试试

在这里插入图片描述
证明过滤了,试试登录后

在这里插入图片描述

二,监听器

2.1,自定义监听器

  1. 自定义Listenter(常用监听器
    servletContextListenter,
    httpSessionListenter,
    HTTPSessionAttributeListenter,
    servletRequestListenter)

2.2,创建listenter包和MyListenter类

在这里插入图片描述

2.2.1,编写MyListenter类 监听器代码

package com.demo.listener;import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;@WebListener
public class MyListener implements ServletRequestListener {@Overridepublic void requestDestroyed(ServletRequestEvent servletRequestEvent) {System.out.println("请求被销毁");}@Overridepublic void requestInitialized(ServletRequestEvent servletRequestEvent) {System.out.println("请求被初始化创建");}
}

三,拦截器

3.1,创建自定义拦截器配置类

@Configuration
继承WebMvcConfigurationAdapter(SpringBoot2.X之前旧版本)
SpringBoot2.X新版本配置拦截器 implements WebMvcConfigurer

3.2,创建配置包config和配置类MyWebMvcConfigurer

在这里插入图片描述

package com.demo.config;import com.demo.interceptor.Logininterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration  // 添加了Configuration的类,我们称之为配置类
public class MyWebMvcConfigurer implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new Logininterceptor()).addPathPatterns("/login/**");WebMvcConfigurer.super.addInterceptors(registry);}
}

3.3,创建拦截器包interceptor和Logininterceptor类

在这里插入图片描述

Logininterceptor类代码

package com.demo.interceptor;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class Logininterceptor implements HandlerInterceptor {// 调用Controller某个方法之前,判断是否要不要处理@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return false; // false是拦截, true是不拦截}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion");}
}

在这里插入图片描述

四,按顺序进行拦截,先注册,先被拦截

拦截器不生效的常见问题:

  1. 是否有加@Configuration
  2. 拦截器是否有路径问题 ** 和 *
  3. 拦截器最后路径一定要 " /** " ,如果是目录的话则是 /*/

Filter
是基于函数回调 doFilter(),而lnterceptor则是基于AOP思想
Filter在只在Servlet前后起作用,而lnterceptor够深入到方法前后,异常抛出前后等

依赖于Servlet容器即web应用中,而lnterceptor不依赖于Servlet容器所以可以运行在多种环境。

在接口调用的声明周期里,lnterceptor可以被多次调用,而Filter只能在容器中初始化调用一次。

Filter和lnterceptor的执行顺序
过滤前 --> 拦截前 --> action(handler) --> 执行 --> 拦截后 --> 过滤后

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/106839.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何查询成绩或工资

为什么每次查询成绩或者工资的时候都觉得麻烦又耗时呢?在过去,我们可能需要去学校或公司的相关部门,填写繁琐的表格,然后等待工作人员进行查询和处理。这不仅浪费了我们宝贵的时间,还可能出现查询结果不准确或者遗漏的…

【深度学习】实验09 使用Keras完成线性回归

文章目录 使用Keras完成线性回归1. 导入Keras库2. 创建数据集3. 划分数据集4. 构造神经网络模型5. 训练模型6. 测试模型7. 分析模型 附:系列文章 使用Keras完成线性回归 Keras是一款基于Python的深度学习框架,以Tensorflow、Theano和CNTK作为后端&#…

【视觉检测】电源线圈上的导线弯直与否视觉检测系统软硬件方案

 检测内容 线圈上的导线弯直与否检测系统。  检测要求 检测线圈上的导线有无弯曲,弯曲度由客户自己设定。检测速度5K/8H625PCS/H。  视觉可行性分析 对样品进行了光学实验,并进行图像处理,原则上可以使用机器视觉进行测试测量…

结构方程模型SEM、路径分析房价和犯罪率数据、预测智力影响因素可视化2案例...

原文链接:http://tecdat.cn/?p25044 在本文,我们将考虑观察/显示所有变量的模型,以及具有潜在变量的模型(点击文末“阅读原文”获取完整代码数据)。 1 简介 第一种有时称为“路径分析”,而后者有时称为“测…

RabbitMQ: 死信队列

一、在客户端创建方式 1.创建死信交换机 2.创建类生产者队列 3.创建死信队列 其实就是一个普通的队列,绑定号私信交换机,不给ttl,给上匹配的路由,等待交换机发送消息。 二、springboot实现创建类生产者队列 1.在消费者里的…

Java后端简历指南(应届)

⭐简单说两句⭐ 作者:后端小知识 CSDN个人主页:后端小知识 🔎GZH:后端小知识 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 Java后端简历指南(应届) 文章目录 Java后端简…

Direct3D纹理映射

借助纹理映射技术,我们可将图像数据映射到三角形单元中,这种功能可以显著地增加所绘制场景的细节和真实感,例如创建一个立方体然后为其每个面映射一个板条纹理,从而将该立方体变为一个板条箱,在Direct3D中纹理用接口ID…

C#,《小白学程序》第十五课:随机数(Random)第二,统计学初步,数据统计的计算方法与代码

1 文本格式 /// <summary> /// 《小白学程序》第十五课&#xff1a;随机数&#xff08;Random&#xff09;第二&#xff0c;统计学初步&#xff0c;数据统计的计算方法与代码 /// 用随机数做简单的统计并用图形显示统计结果。 /// </summary> /// <param name&q…

人工智能基础-趋势-架构

在过去的几周里&#xff0c;我花了一些时间来了解生成式人工智能基础设施的前景。在这篇文章中&#xff0c;我的目标是清晰概述关键组成部分、新兴趋势&#xff0c;并重点介绍推动创新的早期行业参与者。我将解释基础模型、计算、框架、计算、编排和矢量数据库、微调、标签、合…

宋浩高等数学笔记(十二)无穷级数

完结&#xff0c;宋浩笔记系列的最后一更~ 之后会出一些武忠祥老师的错题&笔记总结&#xff0c;10月份就要赶紧做真题了

成都瀚网科技有限公司:抖音怎么绑定抖音小店才好?

抖音是一款非常流行的短视频应用&#xff0c;为用户提供了一个展示才华、分享生活的平台。在抖音上&#xff0c;用户可以通过绑定抖音商店来销售自己的产品或服务&#xff0c;从而实现商业变现。那么&#xff0c;抖音如何绑定抖音商店呢&#xff1f; 1、抖音如何绑定抖音商店&a…

Golang教程与Gin教程合集,入门到实战

GolangGin框架GormRbac微服务仿小米商城项目实战视频教程Docker Swarm K8s云原生分布式部署 介绍&#xff1a; Go即Golang&#xff0c;是Google公司2009年11月正式对外公开的一门编程语言&#xff0c;它不仅拥有静态编译语言的安全和高性能&#xff0c;而 且又达到了动态语言开…