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

【Java EE进阶 --- SpringBoot】统一功能处理(拦截器)


🚀 欢迎来到我的CSDN博客:Optimistic _ chen
一名热爱技术与分享的全栈开发者,在这里记录成长,专注分享编程技术与实战经验,助力你的技术成长之路,与你共同进步!


🚀我的专栏推荐:

专栏内容特色适合人群
🔥C语言从入门到精通系统讲解基础语法、指针、内存管理、项目实战零基础新手、考研党、复习
🔥Java基础语法系统解释了基础语法、类与对象、继承Java初学者
🔥Java核心技术面向对象、集合框架、多线程、网络编程、新特性解析有一定语法基础的开发者
🔥Java EE 进阶实战Servlet、JSP、SpringBoot、MyBatis、项目案例拆解想快速入门Java Web开发的同学
🔥Java数据结构与算法图解数据结构、LeetCode刷题解析、大厂面试算法题面试备战、算法爱好者、计算机专业学生

🚀我的承诺:
✅ 文章配套代码:每篇技术文章都提供完整的可运行代码示例

✅ 持续更新:专栏内容定期更新,紧跟技术趋势

✅ 答疑交流:欢迎在文章评论区留言讨论,我会及时回复(支持互粉)


🚀 关注我,解锁更多技术干货!
⏳ 每天进步一点点,未来惊艳所有人!✍️ 持续更新中,记得⭐收藏关注⭐不迷路 ✨

📌 标签:#技术博客  #编程学习  #Java  #C语言  #算法  #程序员

文章目录

  • 什么是拦截器
  • 拦截器的使用
    • 定义拦截器
    • 注册拦截器
    • 拦截路径
    • 拦截流程
  • 适配器模式
    • 设配器实现
  • 完结撒花!🎉

什么是拦截器

拦截器是Spring框架提供的核心功能之一,主要用来拦截用户请求,在指定方法前后,根据业务需要执行预先设定好的代码。

通俗的讲:程序员提前定义的一些逻辑,在用户请求响应前后执行, 这个操作包括很多方面,比如前端发来请求操作时,在服务器响应之前先判断用户有没有登录,如果有就返回响应,如果没有则进行拦截,拒绝响应并给出原因。

在这里插入图片描述

拦截器的使用

定义拦截器

我们自定义一个拦截器,实现HandlerInterceptor接口

@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.info("preHandle目标为方法执行前");//这里拦截器进行判断//true:放行,false:拦截return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {log.info("preHandle目标为方法执行后");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {log.info("preHandle目标为视图执行后");}
}

注册拦截器

定义后,再来注册拦截器,实现WebMvcConfigurer接口,并重写addInterceptors方法

@Configuration
public class WebConfig implements WebMvcConfigurer {
//我们自定义的拦截器对象@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//注册自定义拦截器对象registry.addInterceptor(loginInterceptor).addPathPatterns("/**");//表示拦截所有请求}
}

拦截器通过后:
在这里插入图片描述
拦截器拦截请求:
在这里插入图片描述
客户端没有得到响应,服务端控制台也拦截了请求。

拦截路径

在完成对拦截器的基本设置后,我们对拦截器还需要通过 addPathPatterns() 方法设置拦截器的拦截路径要拦截的请求也可以通过 excludePathPatterns() 方法设置拦截器不拦截的路径要通过的请求)

registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/user/login");//设置拦截器拦截的请求路径

拦截流程

正常情况下,我们程序直接从controller层去调用接口,但是现在有了拦截器,我们在执行controller层方法前,请求会被拦截器拦截,通过preHandle() 方法的判断返回一个布尔类型的值。
如果返回true,表示此次请求正常执行;反之则拒绝执行。请求中方法执行完毕后,再去执行postHandle()和afterCompletion() 方法,最后返回给客户端。

适配器模式

适配器模式也叫包装模式,可以将一个类的接口转换成我们期望的另一个接口。

简单来说:就说目标类不能直接使用,我们通过重新包装,适配调用方使用,使两个接口能够兼容。

正常情况,两个类可以合作无间,正常兼容
在这里插入图片描述
但是也有特例,比如车辆上的充电口,部分汽车中的充电口不允许充电线直接使用,需要一个转换器,一侧连接汽车充电口,另一侧连接充电线,最终完成充电。

设配器实现

Target:目标接口,希望能直接使用的接口
Adaptee:适配者,但是与Target不兼容
Adapter:适配器类,此模式的核心通过继承或者引用适配者的对象,把适配者转为目标接口
client:需要使用适配器的对象

举个例子:@Sl4j 注解,我们只需要调用Sl4j的接口就行,不需要知道它是怎么实现的。

//客户端需要使用log4j,那么就使用Sl4j和log4j的适配器(如果之后需要使用其他的api,只需要更换适配器即可)
public class Sl4j{public static void main(String[] args){Sl4jApi sl4jApi=new Sl4jApiLog4JAdapter(new Log4j());}  
}//Sl4j和log4j的适配器(转换类)
class Slf4jLog4JAdapter implements Slf4jApi{private Log4j log4j;public Slf4jLog4JAdapter(Log4j log4j) {this.log4j = log4j;}@Overridepublic void log(String message) {log4j.log4jLog(message);}
}//log4j接口:适配者
class Log4j{void log4jLog(String message){System.out.println("Log4j打印:"+message);}
}//sl4j接口:目标接口
interface Slf4jApi{void log(String message);
}

总的来说:适配器的核心就是:

1. 客户端只关心目标接口(能兼容的接口)
2. 适配器在中间做转换工作
3. 适配者提供实际功能但接口不兼容

注意:适配器模式可以看作⼀种"补偿模式",⽤来补救设计上的缺陷.所以它更多应用在版本升级等场景。

完结撒花!🎉

如果这篇博客对你有帮助,不妨点个赞支持一下吧!👍
你的鼓励是我创作的最大动力~

想获取更多干货? 欢迎关注我的专栏 → optimistic_chen
📌 收藏本文,下次需要时不迷路!

我们下期再见!💫 持续更新中……


悄悄说:点击主页有更多精彩内容哦~ 😊

http://www.dtcms.com/a/552815.html

相关文章:

  • 主流数据分析工具全景对比:Excel / Python / R / Power BI / Tableau / Qlik / Snowflake
  • 从被动防御到主动管控:雷池SafeLine的远程安全运营之道
  • 人体静电消除器安全设计 蒙冬智能
  • 我想要个网站深圳最新招聘
  • Hybrid OCR-LLM框架用于在大量复杂密集企业级文档信息提取
  • 仙居做网站在哪里做项目网格化管理方案
  • ubuntu部署whisper+speaker_large+qwen【一】
  • 四大主流平台深度测评:2025企业自动化运维平台选型指南,自动化巡检平台适配关键场景
  • 计算机毕业设计 基于Python的热门游戏推荐系统的设计与实现 Django 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
  • 每周读书与学习->JMeter主要元件详细介绍(三)逻辑控制器
  • QML学习笔记(四十八)QML与C++交互:QML中可实例化C++对象
  • 深信服上网行为 SANGFOR_AC_v11.0_AD域密码认证配置
  • RKNN-Toolkit2入门
  • 服务器公网IP、私网IP、弹性IP是什么?区别与应
  • 无锡哪家做网站好怎么做公司网站文案
  • php做网站架构图建站时候源码有验证怎么办
  • 10. 引用计数
  • 利用DeepSeek辅助改写luadbi-duckdb支持日期和时间戳数据类型
  • 用 Redis 的 List 存储库存队列,并通过 LPOP 原子性出队来保证并发安全案例
  • 定制开发开源AI智能名片S2B2C商城系统:新零售革命下云零售模式的创新实践
  • WebForms Validation
  • AI智能办公系统/企业OA办公/DeepSeek办公应用★pc/公众号/H5/App/小程序
  • 破局冷轧困境:RFID 赋能钢厂高效安全升级
  • 线程同步机制及三大不安全案例
  • Leetcode438. 找到字符串中所有字母异位词
  • 站内推广和站外推广的区别wordpress采集生成用户插件
  • 高清的网站制作iis7.0搭建网站
  • 使用 Docker Compose 部署 Spring Boot 应用:SmartAdmin 实战指南
  • 徐州建设企业网站网站建设与网站制作
  • 拆解ASP.NET MVC 视图模型:为 View 量身定制的 “数据小票“