当前位置: 首页 > news >正文

SpringBoot之HandlerInterceptor拦截器的使用

😀前言
本篇博文是关于拦截器-HandlerInterceptor的使用,希望你能够喜欢

🏠个人主页:晨犀主页
🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉
💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在此感谢啦😊

文章目录

  • 拦截器-HandlerInterceptor
    • 基本介绍
      • 基本步骤:
    • 拦截器应用实例
      • 需求:
      • 代码实现
    • 注意事项和细节
      • URI 和URL 的区别
        • 举例说明:
    • 😄总结

拦截器-HandlerInterceptor

基本介绍

在Spring Boot 项目中, 拦截器是开发中常用手段,要来做登陆验证、性能检查、日志记录等。

基本步骤:

√ 编写一个拦截器实现HandlerInterceptor 接口
√ 拦截器注册到配置类中(实现WebMvcConfigurer 的addInterceptors)
√ 指定拦截规则

拦截器应用实例

需求:

使用拦截器防止用户非法登录, 如图- 使用拦截器就不需要在每个方法验证了
浏览器输入: http://localhost:8080/manage.html , 如果用户没有登录,则返回登录界面.

image-20230813210700183

代码实现

  1. 创建com/my/usersys/interceptor/LoginInterceptor.javapackage com.
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {// 目标方法执行前被调用.@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//为了让小伙伴看到访问的URIString requestURI = request.getRequestURI();String requestURL = request.getRequestURL().toString();log.info("preHandle拦截到的请求的URI={}", requestURI);log.info("preHandle拦截到的请求的URL={}", requestURL);//进行登录的校验HttpSession session = request.getSession();Object loginAdmin = session.getAttribute("loginAdmin");if (null != loginAdmin) {//说明该用户已经成功登录//放行return true;}//拦截, 重新返回到登录页面request.setAttribute("msg", "你没有登录/请登录~~");request.getRequestDispatcher("/").forward(request, response);return false;}//目标方法执行完成以后调用@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {log.info("postHandle执行了...");}//页面渲染以后调用@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {log.info("afterCompletion执行了...");}
}
  1. 创建com/my/usersys/config/WebConfig.java
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {//注册自定义拦截器LoginInterceptorregistry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**") //拦截所有的请求.excludePathPatterns("/","/login","/images/**");//指定要放行的,后面可以根据业务需求,来添加放行的请求路径}
}
  1. 修改com/my/usersys/controller/AdminController.java , 去掉session 验证用户是否登录代码, 并完成测试, 注意看页面和后台日志.
//处理用户的请求到 manage.html@GetMapping("/manage.html")public String mainPage(Model model, HttpSession session) {log.info("进入mainPage()");//可以这里集合-模拟用户数据, 放入到request域中,并显示ArrayList<User> users = new ArrayList<>();users.add(new User(1, "关羽~", "666666", 20, "gy@sohu.com"));users.add(new User(2, "张飞", "666666", 30, "zf@sohu.com"));users.add(new User(3, "赵云", "666666", 22, "zy@sohu.com"));users.add(new User(4, "马超", "666666", 28, "mc@sohu.com"));users.add(new User(5, "黄忠", "666666", 50, "hz@sohu.com"));//放入model的数据默认到request域model.addAttribute("users", users);return "manage"; //这里才是我们的视图解析到 /templates/manage.html}

image-20230813211243822

image-20230813211311424

注意事项和细节

URI 和URL 的区别

URI = Universal Resource Identifier
URL = Universal Resource Locator
Identifier:标识符,Locator:定位器从字面上来看, URI 可以唯一标识一个资源, URL 可以提供找到该资源的路径

举例说明:

String requestURI = request.getRequestURI();
String requestURL = request.getRequestURL().toString();

注册拦截器, 依然可以使用如下方式

public class WebConfig /*implements WebMvcConfigurer*/ {//将我们的拦截器, 注入到容器中//@Override//public void addInterceptors(InterceptorRegistry registry) {////    //注册自定义拦截器LoginInterceptor//    registry.addInterceptor(new LoginInterceptor())//            .addPathPatterns("/**") //拦截所有的请求//            .excludePathPatterns("/","/login","/images/**");//指定要放行的,后面可以根据业务需求,来添加放行的请求路径//}@Beanpublic WebMvcConfigurer webMvcConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addInterceptors(InterceptorRegistry registry) {System.out.println("addInterceptors~~~");//注册拦截器registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/","/login","/images/**");}};}
}

😄总结

  1. URI 可以唯一标识一个资源, URL 可以提供找到该资源的路径。
  2. 拦截所有的请求时要注意哪些资源需要放行,防止无法请求。
  3. 拦截器注册到配置类中(实现WebMvcConfigurer 的addInterceptors),一定要指定拦截规则。

😁热门专栏推荐

Thymeleaf快速入门及其注意事项

Spring Initailizr–快速入门–SpringBoot的选择

带你了解SpringBoot支持的复杂参数–自定义对象参数-自动封装

Rest 优雅的url请求处理风格及注意事项

文章到这里就结束了,如果有什么疑问的地方请指出,诸大佬们一起来评论区一起讨论😁
希望能和诸大佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

相关文章:

SpringBoot之HandlerInterceptor拦截器的使用

&#x1f600;前言 本篇博文是关于拦截器-HandlerInterceptor的使用&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动…...

【共同缔造 情暖襄阳】 暑期关爱未成年人志愿服务活动合集(三)

结合2023年襄阳市民政局“共同缔造 情暖襄阳”社会工作服务项目&#xff0c;在襄阳市民政局、襄州区民政局支持下&#xff0c;襄州社工协会联合肖湾街道育红社区开展暑期“希望家园”志愿服务活动&#xff0c;关爱未成年人。 8月4日&#xff0c;为培育孩子们广泛的兴趣爱好和动…...

私密相册管家-加密码保护私人相册照片安全

App Store史上最安全、最强大、最卓越的私密相册App&#xff01;再也不用担心私密照片视频被别人看见了&#xff01;
私密相册为你提供多重密码保护机制、简单便捷的照片存储空间&#xff0c;完美地将你的私密照片远离一切恶意偷窥者的窥探&#xff01; 【产品功能】
 √ 支…...

webpack 热更新的实现原理

webpack 的热更新⼜称热替换&#xff08;Hot Module Replacement&#xff09;&#xff0c;缩写为HMR。这个机制可以做到不⽤刷新浏览器⽽将新变更的模块替换掉旧的模块。 原理&#xff1a; ⾸先要知道 server 端和 client 端都做了处理⼯作&#xff1a; 在 webpack 的 watch…...

OpenCV-Python中的图像处理-傅里叶变换

OpenCV-Python中的图像处理-傅里叶变换 傅里叶变换Numpy中的傅里叶变换Numpy中的傅里叶逆变换OpenCV中的傅里叶变换OpenCV中的傅里叶逆变换 DFT的性能优化不同滤波算子傅里叶变换对比 傅里叶变换 傅里叶变换经常被用来分析不同滤波器的频率特性。我们可以使用 2D 离散傅里叶变…...

阿里云FRP内网穿透挂载多台服务器

1. FRP介绍 FRP (Fast Reverse Proxy) 是比较流行的一款。FRP 是一个免费开源的用于内网穿透的反向代理应用&#xff0c;它支持 TCP、UDP 协议&#xff0c; 也为 http 和 https 协议提供了额外的支持。你可以粗略理解它是一个中转站&#xff0c; 帮你实现 公网 ←→ FRP(服务器…...

多店铺功能

(一) 系统管理&#xff1a;菜单权限、前台菜单、角色管理、职员管理、登录日志、操作日志、图片空间、商城消息、风格设置、计划任务 (二) 基础设置&#xff1a;商城配置、导航管理、广告管理、广告位置、银行管理、支付管理、地区管理、友情链接、快递管理、消息模板 (三) 会员…...

mysql主从复制搭建(一主一从)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言MySQL复制过程分为三部&#xff1a; 一、准备工作二、配置>主库Master三、配置>从库SlaveSlave_IO_Running: YesSlave_SQL_Running: Yes 四、测试至此&am…...

什么是Liquid UI?

热门议题&#xff1a; 1、企业如何快速解决人员移动办公的需求&#xff0c;比如在苹果安卓手机&#xff0c;平板电脑&#xff0c;MAC登录SAP。2、企业如何解决用户经常抱怨的流程复杂&#xff0c;操作繁琐&#xff0c;难以使用等问题 公司介绍&#xff1a; Synactive,Inc. 是…...

非常详细的相机标定(六)(2维坐标点转为3维坐标点)

根据提取的相机的参数&#xff0c;2维坐标点转为3维坐标点&#xff0c;代码如下&#xff1a; import argparse from argparse import RawTextHelpFormatter import numpy as np import cv2# 寻找焦点 def cam_calib_find_corners(img, rlt_dir, col, row):# 灰度化图片&#x…...

云计算虚拟仿真实训平台

一、云计算虚拟仿真系统概述 云计算虚拟仿真系统是一种基于云计算技术和虚拟化技术的系统&#xff0c;用于实现各种仿真和模拟任务。它可以提供强大的计算能力和资源管理&#xff0c;为用户提供灵活、高效、可扩展的仿真环境。 该系统通常由一组服务器、网络和存储设备组成&am…...

计算机网络:网络字节序

目录 一、字节序1.字节序概念2.字节序的理解&#xff08;1&#xff09;大端模式存储数据&#xff08;2&#xff09;小端模式存储数据 二、网络字节序 一、字节序 1.字节序概念 字节序&#xff1a;内存中存储多字节数据的顺序。 难道存储数据还要看顺序吗&#xff1f; yes。内…...

2023国赛数学建模A题思路分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…...

【Java】常见面试题:网络

目录 1. 为什么需要网络协议的分层&#xff1f;2. 【封装和分用】3. Socket套接字主要针对传输层协议划分为如下三类&#xff08;了解&#xff09;4. 简单说一下TCP和UDP的区别&#xff1a;5. TCP中的长短连接6. 应用层重点协议7. TCP可靠传输机制&#xff08;三次握手四次挥手…...

TTS | VocGAN声码器训练自己的数据集

哈喽&#xff0c;今天给大家介绍的是如何使用VocGAN声码器训练自己的数据集。 原文 VocGAN: A High-Fidelity Real-time Vocoder with a Hierarchically-nested Adversarial Network 想要论文解读&#xff0c;请参考我的这篇文章~ 本博客主要包括以下内容&#xff1a; 目录…...

nuxt3--prisma配置

目录 一、初始化二、修改配置三、创建数据库表四、安装Prisma客户端五、查询数据库 一、初始化 npm install prisma typescript ts-node types/node --save-devts-node 用来执行main函数更新数据库 根据实际情况安装&#xff0c;如果不需要的话只需要安装prisma tsconfig.json…...

学习ts(一)数据类型(基础类型和任意类型)

运行 起步安装 npm install typescript -g 运行tsc index.ts生成对应的js文件&#xff0c;然后使用node index.js执行js文件 为了方便运行还可以安装插件&#xff0c;ts-node index.ts运行即可 npm i ts-node -g npm init -y npm i types/node -D基本数据类型 // 1.字符…...

Qt 之 QPushButton,信号与槽机制

文章目录 前言一、QPushButton二、信号与槽机制总结 前言 一、QPushButton 当我们开发基于Qt框架的图形用户界面&#xff08;GUI&#xff09;应用程序时&#xff0c;经常需要在界面上添加按钮来实现用户交互。Qt提供了一个名为 QPushButton 的类作为按钮控件的实现。QPushButt…...

MySQL面试题一

MySQL 索引使用有哪些注意事项呢&#xff1f; 可以从两个维度回答这个问题&#xff1a; 索引哪些情况会失效&#xff0c;索引不适合哪些场景 索引哪些情况会失效 查询条件包含or&#xff0c;会导致索引失效。隐式类型转换&#xff0c;会导致索引失效&#xff0c; 例如age字…...

【Java】2021 RoboCom 机器人开发者大赛-高职组(复赛)题解

7-8 人工智能打招呼 号称具有人工智能的机器人&#xff0c;至少应该能分辨出新人和老朋友&#xff0c;所以打招呼的时候应该能有所区别。本题就请你为这个人工智能机器人实现这个功能&#xff1a;当它遇到陌生人的时候&#xff0c;会说&#xff1a;“Hello X, how are you?”其…...

使用electron-vue获取文件夹的路径

使用electron-vue获取文件夹的路径 记录一次开发过程中遇到的bug&#xff0c;我们的项目中需要将vue项目打包为桌面应用软件&#xff0c;为此我们引入了electron框架&#xff0c;在这个过程中&#xff0c;我们需要获取到用户电脑上面文件夹的绝对路径&#xff0c;用这篇文章记…...

剑指Offer14-II.剪绳子II C++

1、题目描述 给你一根长度为 n 的绳子&#xff0c;请把绳子剪成整数长度的 m 段&#xff08;m、n都是整数&#xff0c;n>1并且m>1&#xff09;&#xff0c;每段绳子的长度记为 k[0],k[1]…k[m - 1] 。请问 k[0]k[1]…*k[m - 1] 可能的最大乘积是多少&#xff1f;例如&am…...

2023企业微信0day漏洞复现以及处理意见

2023企业微信0day漏洞复现以及处理意见 一、 漏洞概述二、 影响版本三、 漏洞复现小龙POC检测脚本: 四、 整改意见 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#x…...

【IMX6ULL驱动开发学习】04.应用程序和驱动程序数据传输和交互的4种方式:非阻塞、阻塞、POLL、异步通知

一、数据传输 1.1 APP和驱动 APP和驱动之间的数据访问是不能通过直接访问对方的内存地址来操作的&#xff0c;这里涉及Linux系统中的MMU&#xff08;内存管理单元&#xff09;。在驱动程序中通过这两个函数来获得APP和传给APP数据&#xff1a; copy_to_usercopy_from_user …...

day-21 代码随想录算法训练营(19)二叉树part07

530.二叉搜索树的最小绝对差 思路一&#xff1a;二叉搜索树的中序遍历必为升序数组&#xff0c;加入数组后计算相邻两个数差值&#xff0c;即可求出最小绝对差 思路二&#xff1a;同样的思路&#xff0c;中序遍历&#xff0c;直接使用指针记录上一个节点&#xff0c;同时更新…...

【Vue3】依赖注入

provide 和 inject 是 Vue.js 中用于实现依赖注入的两个关联功能。它们允许你在祖先组件中提供数据&#xff0c;然后在子孙组件中注入这些数据&#xff0c;实现组件之间的数据共享和传递。 provide&#xff1a;provide 是一个选项&#xff0c;你可以在父组件中通过它来提供数据…...

Vue 引入 Element-UI 组件库

Element-UI 官网地址&#xff1a;https://element.eleme.cn/#/zh-CN 完整引入&#xff1a;会将全部组件打包到项目中&#xff0c;导致项目过大&#xff0c;首次加载时间过长。 下载 Element-UI 一、打开项目&#xff0c;安装 Element-UI 组件库。 使用命令&#xff1a; npm …...

照耀国产的星火,再度上新!

国产之光&#xff0c;星火闪耀 ⭐ 新时代的星火⭐ 多模态能力⭐ 图像生成与虚拟人视频生成⭐ 音频生成与OCR笔记收藏⭐ 助手模式更新⭐ 插件能力⭐ 代码能力⭐ 写在最后 ⭐ 新时代的星火 在这个快速变革的时代&#xff0c;人工智能正迅猛地催生着前所未有的革命。从医疗到金融…...

大语言模型LLM的一些点

LLM发展史 GPT模型是一种自然语言处理模型&#xff0c;使用Transformer来预测下一个单词的概率分布&#xff0c;通过训练在大型文本语料库上学习到的语言模式来生成自然语言文本。 GPT-1(117亿参数)&#xff0c;GPT-1有一定的泛化能力。能够用于和监督任务无关的任务中。GPT-2(…...

leetcode810. 黑板异或游戏(博弈论 - java)

黑板异或游戏 lc 810 - 黑板异或游戏题目描述博弈论 动态规划 lc 810 - 黑板异或游戏 难度 - 困难 原题链接 - 黑板异或游戏 题目描述 黑板上写着一个非负整数数组 nums[i] 。 Alice 和 Bob 轮流从黑板上擦掉一个数字&#xff0c;Alice 先手。如果擦除一个数字后&#xff0c;剩…...