Springboot拦截器的使用


 

* 1、编写一个拦截器实现HandlerInterceptor接口
* 2、拦截器注册到容器中(实现WebMvcConfigurer的addInterceptors)
* 3、指定拦截规则【如果是拦截所有,静态资源也会被拦截】

这段代码定义了一个 `LoginInterceptor` 类,它实现了 `HandlerInterceptor` 接口,用于在 Spring MVC 中进行拦截器的操作。拦截器可以用来在请求的处理流程中执行特定的逻辑,比如权限检查、日志记录等。下面是对这段代码的注释和解释:

```java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.method.HandlerInterceptor;

@Slf4j // 通过 Lombok 注解自动创建 Logger 实例
public class LoginInterceptor implements HandlerInterceptor {

    /**
     * 目标方法执行之前调用的拦截器逻辑
     * @param request HTTP 请求对象
     * @param response HTTP 响应对象
     * @param handler 处理器,例如 Controller 中的方法
     * @return 如果返回 true,则请求继续执行;如果返回 false,则请求中断,不再执行后续的拦截器或处理器
     * @throws Exception 可能抛出的异常
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取请求的 URI
        String requestURI = request.getRequestURI();
        // 使用 SLF4J 记录拦截的请求路径
        log.info("preHandle拦截的请求路径是{}", requestURI);

        // 登录检查逻辑
        // 通过 request 获取当前会话的 HttpSession 对象
        HttpSession session = request.getSession();

        // 从 session 中获取名为 "loginUser" 的属性,用于验证用户是否已登录
        Object loginUser = session.getAttribute("loginUser");

        // 如果用户已登录(即 loginUser 不为空),则放行请求
        if (loginUser != null) {
            return true;
        }

        // 如果用户未登录,则拦截请求
        // 将错误消息 "请先登录" 存储在 request 属性中,以便在登录页面显示
        request.setAttribute("msg", "请先登录");
        // 转发到登录页面(这里使用了 request.getRequestDispatcher("/") 来获取登录页面的请求分发器)
        request.getRequestDispatcher("/").forward(request, response);
        // 返回 false 表示请求被拦截,不会继续执行后续的拦截器或处理器
        return false;
    }
}
```

解释:

1. `@Slf4j` 是 Lombok 库提供的一个注解,它可以自动生成一个名为 `log` 的 `Logger` 实例,用于记录日志。这样,你就可以直接使用 `log.info()` 等方法来记录日志,而不需要手动创建 `Logger` 对象。

2. `preHandle` 方法是 `HandlerInterceptor` 接口中的一个方法,它在控制器方法(handler)执行之前被调用。这个方法的返回值决定了请求是否继续执行。如果返回 `true`,则请求继续向下执行;如果返回 `false`,则请求被拦截,不会执行后续的拦截器或控制器方法。

3. 在 `preHandle` 方法中,首先记录了当前请求的 URI。然后,通过 `request.getSession()` 获取当前会话的 `HttpSession` 对象,并尝试从会话中获取名为 "loginUser" 的属性,这个属性通常用于存储用户的登录状态。

4. 如果用户已经登录(`loginUser` 不为空),则方法返回 `true`,请求继续执行。

5. 如果用户未登录(`loginUser` 为空),则在请求属性中设置一条消息,并转发到登录页面。这里使用 `request.getRequestDispatcher("/").forward()` 方法来实现请求的转发。

6. 最后,方法返回 `false`,表示请求被拦截,不会继续执行后续的拦截器或控制器方法。




 

代码行 `request.getRequestDispatcher("/").forward(request, response);

` 是 Java Servlet API 中的一部分,用于在当前请求的上下文中转发请求到另一个资源。这行代码通常用于拦截器或 Servlet 中,当你想要将用户的请求从当前路径重定向到另一个路径时。

让我们分解这行代码:

- `request.getRequestDispatcher`:这是 `HttpServletRequest` 对象的一个方法,它创建一个 `RequestDispatcher` 对象。`RequestDispatcher` 是用于转发请求到其他资源的接口。调用 `request.getRequestDispatcher` 时,你需要传入一个路径,这个路径是相对于当前请求的路径的。

- `"/"`:这是传递给 `request.getRequestDispatcher` 方法的路径。在这个例子中,`"/"` 表示应用程序的根路径。这意味着请求将被转发到应用程序的首页或登录页面,具体取决于应用程序的配置。

- `.forward(request, response)`:这是 `RequestDispatcher` 对象的一个方法,它将请求和响应对象作为参数。此方法将请求和响应对象传递给目标资源,这样目标资源就可以生成响应内容并将其发送回客户端。

在上下文中,`request.getRequestDispatcher("/").forward(request, response);` 这行代码的作用是:

1. 获取一个能够转发请求到应用程序根路径的 `RequestDispatcher` 对象。
2. 使用这个 `RequestDispatcher` 将当前的请求和响应对象转发到根路径。
3. 由于请求被转发,控制器中 `preHandle` 方法之后的代码不会被执行。
4. 用户的浏览器会收到一个转发到新页面的响应,通常是登录页面,用户可以在该页面进行登录操作。

这种转发是服务器端的,用户不会感知到 URL 的变化(除非他们查看浏览器的地址栏)。这与重定向(redirect)不同,重定向是通过发送一个新的响应给客户端,告诉浏览器去请求一个新的 URL。


 

@Override
public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**")  //所有请求都被拦截包括静态资源.excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**","/aa/**"); //放行的请求这段代码是 Spring Boot 应用中配置拦截器的一个典型例子。`InterceptorRegistry` 是 Spring MVC 提供的一个接口,用于注册拦截器(`HandlerInterceptor`)并配置它们的拦截规则。```java
@Override
public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()) // 注册自定义的拦截器.addPathPatterns("/**") // 设置拦截器拦截所有请求,包括静态资源.excludePathPatterns("/", "/login", "/css/**", "/fonts/**", "/images/**","/js/**", "/aa/**") // 设置不拦截的请求路径
}
```解释:1. `@Override` 注解表明该方法是对父类或接口中方法的重写。2. `public void addInterceptors(InterceptorRegistry registry)` 是一个方法,它接收一个 `InterceptorRegistry` 类型的参数。这个方法通常在配置类中实现,并且使用 `@Override` 注解标记,因为它重写了 `WebMvcConfigurer` 接口中的 `addInterceptors` 方法。3. `registry.addInterceptor(new LoginInterceptor())` 这行代码将一个名为 `LoginInterceptor` 的拦截器添加到 Spring MVC 的拦截器链中。`LoginInterceptor` 是一个自定义的拦截器类,它可能包含一些逻辑,比如检查用户是否登录、记录日志等。4. `.addPathPatterns("/**")` 指定拦截器应该拦截的请求路径。`"/**"` 是一个 Ant 风格的路径模式,表示匹配所有的请求路径。这意味着 `LoginInterceptor` 将对所有的请求进行拦截,包括对静态资源的请求。5. `.excludePathPatterns` 方法用于指定拦截器不应对哪些请求路径进行拦截。在这个例子中,它排除了以下几个路径:- `"/"`:应用的根路径,通常是首页。- `"/login"`:登录页面的路径。- `"/css/**"`:所有 `/css` 目录下的请求,包括子目录。- `"/fonts/**"`:所有 `/fonts` 目录下的请求。- `"/images/**"`:所有 `/images` 目录下的请求。- `"/js/**"`:所有 `/js` 目录下的请求。- `"/aa/**"`:所有 `/aa` 目录下的请求。通过这种方式,你可以灵活地控制拦截器的行为,确保它们只对需要进行特定处理的请求进行拦截,而不影响对静态资源和其他不需要拦截的请求的访问。这是一种常见的做法,用于确保安全性和性能的最佳实践,例如,通过拦截器实现用户身份验证和授权。`#spring.mvc.static-path-pattern=/static/**`是一个 Spring Boot 的配置属性,用于定义静态资源的映射路径。这个配置通常位于 `application.properties` 或 `application.yml` 配置文件中。在 Spring Boot 应用中,静态资源(如 HTML、CSS、JavaScript 文件等)通常由内置的 Tomcat 或其他嵌入式服务器提供。`spring.mvc.static-path-pattern` 属性指定了应用中哪些请求应该被视为静态资源请求,并告诉 Spring Boot 从哪里提供这些资源。这里的配置表示:- `static`:这是一个占位符,表示静态资源的根目录。
- `/**`:这是一个 Ant 风格的路径模式,表示匹配 `/static/` 路径下的所有子路径。换句话说,这个配置告诉 Spring Boot 将所有以 `/static/` 开头的请求映射为静态资源请求。例如,如果你有一个位于 `/static/css/style.css` 的 CSS 文件,你可以通过 `/static/css/style.css` 的 URL 来访问它。如果你的静态资源位于类路径(classpath)的 `/static` 目录下,这个配置就会自动生效。如果你希望使用不同的目录或路径模式,你可以修改这个属性的值。例如,如果你想要从 `/resources/static` 目录提供静态资源,并希望它们可以通过 `/static/**` 路径模式访问,你可以这样配置:```properties
spring.mvc.static-path-pattern=/static/**
```请注意,当使用 `#` 符号时,它通常表示这是一个注释,但在这个上下文中,它可能是配置文件中的一个注释掉的行,或者是在文档中用来说明的一个示例。在实际的 `application.properties` 文件中,你应该去掉 `#` 符号以激活这个配置。

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

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

相关文章

Python工具箱系列(五十一)

九宫格与词云 对图片进行九宫格切割,并且放到微信朋友圈曾经风靡一时。对于python来说,这个也非常简单。 from PIL import Image import mathdef ninerectanglegrid(inputfilename):"""实现九宫格切割Args:inputfilename (string): 输入…

golang import引用项目下其他文件内函数

初始化项目 go mod init [module名字] go mod init project 项目结构 go mod 文件 代码 需要暴露给外界使用的变量/函数名必须大写 在main.go中引入,当前项目模块名/要引用的包名 package mainimport (// 这里的路径开头为项目go.mod中的module"project/…

DHCP设置二

华为ensp模拟实验 准备工作 需要设备:路由器 一台 交换机 两台 pc两台 ip划分网段 :192.168.10.0 24 192.168.20.0 24 当我们准备好之后就可以开机了 开机实验 点击菜单栏小三角,开启设备。 输入system-view进入系统视图&#x…

深度解析:Elasticsearch检索请求原理

在上一篇文章中,我们学习了 Elasticsearch 的写入流程,今天我们来学习一下 Elasticsearch 的读取流程,当一个检索请求到达 Elasticsearch 之后是如何进行检索的呢? 下面先说一下一个总的检索流程。 1、客户端发送请求到任意一个…

【代码片】图像处理工具OpenCV、JAI、ImageJ、Thumbnailator和Graphics2D

Graphics2D图像压缩 import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File;public class ImageResolutionModifier {public static void main(String[] args) {// 输入图片路径和输出图片路径String inputImagePath …

卓翼飞思全国合作伙伴火热招募,共筑智能生态

摘要:市场有可为,政策高扶持 抢占AI高地,共筑智能生态 卓翼飞思全国合作伙伴招募计划 在人工智能的浪潮下,我们正见证一个由数据驱动、智能主导的新时代的到来。无人智能技术作为人工智能领域的重要分支,正在以其独特…

axios详解

文章目录 axios简介axios特性1. 基于 Promise2. 浏览器和 Node.js 都支持3. 拦截请求和响应(axios鉴权)4. 自动转换 JSON 数据5. 转换请求和响应数据6. 取消请求7. 广泛的配置选项8. 客户端支持防止 CSRF/XSRF9. 支持 HTTP 授权10. 良好的错误处理 axios…

Qt篇——Qt无法翻译tr()里面的字符串

最近遇到使用Qt语言家翻译功能时,ui界面中的中文都能够翻译成英文,但是tr("测试")这种动态设置给控件的中文,无法翻译(lang_English.ts文件中的翻译已经正确添加了tr()字符串的翻译)。 上网搜了很多资料&am…

Linux 常用命令(1)

😇作者介绍:一个有梦想、有理想、有目标的,且渴望能够学有所成的追梦人。 🎆学习格言:不读书的人,思想就会停止。——狄德罗 ⛪️个人主页:进入博主主页 🗼专栏系列:Linux 随笔集合 …

【漏洞复现】通天星CMSV6 admin 弱口令漏洞(CVE-2024-29666)

0x01 产品简介 CMSV6平台是基于车辆位置信息服务和实时视频传输服务的创新技术和开放运营理念。为GPS运营商车辆硬件设备制造商、车队管理企业等车辆运营相关企业提供核心基础数据服务。 0x02 漏洞概述 CMSV6 7.31.0.2、7.32.0.3版本中存在弱密码漏洞,未授权的攻…

【Linux】图文详解Xshell远程连接服务器:以Amazon EC2 VPS为例

文章目录 问题描述解决方案Q&A 问题描述 本地cmd或powershell使用ssh -i “your.pem” user_nameip_address是可以登录Amazon EC2云服务器的。 然而,当使用XShell以SSH加载PEM文件方式登录亚马逊EC2云服务器,一直出现输入密码的问题,如…

Tomcat启动闪退是为什么?

Tomcat启动闪退是一种常见问题,它可能由多种原因引起。以下是一些常见的解决步骤方法: 检查内存分配: Tomcat启动失败可能是因为分配给它的Java虚拟机(JVM)内存不足。你需要检查并适当调整catalina.sh或catalina.bat启…

小狐狸JSON-RPC:wallet_addEthereumChain(添加指定链)

wallet_addethereumchain(添加网络) var res await window.ethereum.request({"method": "wallet_addEthereumChain","params": [{"chainId": "0x64", // 链 ID (必填)"…

THS-Location斜杠区别详解

1、location和proxy_pass都带/,则真实地址不带location匹配目录 location /api/ { proxy_pass http://127.0.0.1:8080/; } 访问地址:www.test.com/api/upload-->http://127.0.0.1:8080/upload 2、location不带/,proxy_pass带/&#xf…

前端-包管理器

文章目录 前端工程化包管理器NpmNpm常用命令 YarnYarn 常用命令 pnpmpnpm常用指令 依赖项npm 和 Yarn 的比较npm yarn pnpm 对比jsDelivr CDN 前端工程化包管理器 包管理器是一种工具,它帮助开发者管理项目中的库和依赖项,如安装、更新、配置和卸载。在…

JavaEE 初阶篇-深入了解多线程等待与多线程状态

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 线程等待 1.1 线程等待 - join() 方法 1.1.1 main 线程中等待多个线程 1.1.2 main 线程等待 t2 线程且t2 线程等待 t1 线程 1.1.3 其他线程阻塞等待 main 线程 1.…

Webpack常见插件和模式

目录 目录 目录认识 PluginCleanWebpackPluginHtmlWebpackPlugin自定义模版 DefinePlugin的介绍 ( 持续更新 )Mode 配置 认识 Plugin Loader是用于特定的模块类型进行转换; Plugin可以用于执行更加广泛的任务,比如打包优化、资源管理、环境变量注入等 …

基于ThinkPHP+Uniapp开发的房产管理系统

一款基于ThinkPHPUniapp开发的房产管理系统,支持小程序、H5、APP;包含房客、房东、经纪人三种身份。核心功能有:新盘销售、房屋租赁、地图找房、房源代理、在线签约、电子合同、客户CRM跟进、经纪人收益、分享佣金等 多终端 Uniapp开发&…

系统开发实训小组作业week5 —— 用例描述与分析

目录 4.3 UC003电影浏览与查询 4.3.1 用例描述 4.3.2 活动图 4.3.3 界面元素 4.3.4 功能 4.4 UC004在线订票 4.4.1 用例描述 4.4.2 活动图 4.4.3 界面元素 4.4.4 功能 4.3 UC003电影浏览与查询 4.3.1 用例描述 用例号 UC003-01 用例名称 电影浏览与查询 用例描述…

Spring Boot 统一数据返回格式 分析 和 处理

目录 实现统一数据格式 测试 原因分析 解决方案 🎥 个人主页:Dikz12📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 实现统一数据格式 统⼀的数据返回格式使⽤ ControllerAdvice 和 Response…