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

第二十三节:学习拦截器或者使用AOP实现用户token参数请求检测(自学Spring boot 3.x的第六天)

这节记录下如何使用aop或者使用interceptor实现用户请求的是否带token,本文只是简单检查用户请求是否带参数token,并不对token的正确性进行验证。通常要从后台缓存中进行token校验。

第一种方式:拦截器方式

第一步:新建一个拦截器package,名称为interceptor,新建一个拦截器。

@Component
public class TokenInterceptor implements HandlerInterceptor {Logger logger = LoggerFactory.getLogger(TokenInterceptor.class);@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {logger.info("preHandle执行中");String token  = request.getHeader("token");if(StringUtils.isBlank(token)){throw new BussinessException("无token,参数错误");}if(!token.equals("ceshi")){throw new BussinessException("token参数错误");};return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {logger.info("postHandle执行中");HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {logger.info("afterCompletion执行中");HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}

第二步:在WebMvcConfigurer配置类中注册拦截器

@Overridepublic void addInterceptors(InterceptorRegistry registry) {WebMvcConfigurer.super.addInterceptors(registry);registry.addInterceptor(tokenInterceptor);//默认所有的url拦截}

第二种方式:使用AOP

编写一个aop类,添加上注解@Aspect和@Component。重写下面的方法

@Aspect
@Component
public class LoggerAspect {private static final Logger logger = LoggerFactory.getLogger(LoggerAspect.class);@Pointcut("execution(* cn.wcyf.wcai.controller.front.*.*(..))") // 定义切点public void pointcut() {}@Before("pointcut()")public void before() {logger.info("before方法中: ");}@After("pointcut()")public void after() {logger.info("after方法中: " );}@AfterReturning("pointcut()")public void afterReturn() {logger.info("AfterReturning方法中: " );}@AfterThrowing("pointcut()")public void threw() {logger.info("AfterThrowing方法中: " );}@Around("pointcut()")public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {logger.info("Around方法开始: " + proceedingJoinPoint.getSignature());try {ServletRequestAttributes attrs  = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();if(attrs!=null){HttpServletRequest request =  attrs.getRequest();String token = request.getHeader("token");if(StringUtils.isBlank(token)){throw new BussinessException("参数错误,token为空");}if(!token.equals("ceshi")){throw new BussinessException("token错误,这是aop测试");}}Object result = proceedingJoinPoint.proceed(); // 调用目标方法logger.info("Around方法结束: " + proceedingJoinPoint.getSignature() + ", 返回值: " + result);return result;} catch (Throwable ex) {logger.info("Around方法捕获异常: " + proceedingJoinPoint.getSignature() + ", 异常: " + ex.getMessage());throw ex; // 重新抛出异常,以便Spring可以正确处理}}
}

Object result = proceedingJoinPoint.proceed(); // 调用目标方法

这个代码可以执行调用目标方法,在这段代码前面可以实现前置通知,在这段代码后可以实现后置通知。

相关文章:

  • IDEA几大常用AI插件
  • springboot+satoken实现刷新token(值变化)
  • STL之stackqueue篇(上)探索C++ STL中的Queue与Stack——构建数据处理的基础框架
  • django drf to_representation
  • NVIDIA Hopper 架构深入
  • 刷题学习日记 (1) - SWPUCTF
  • Python FFmpeg 安装使用教程
  • k8s 1.28.2 集群部署 ingress 1.11.1 包含 admission-webhook
  • 优化后的版本
  • 【Vue】vue2项目打包后部署刷新404,配置publicPath ./ 不生效问题
  • 正则表达式中的贪婪模式和非贪婪模式
  • 小程序原生-利用setData()对不同类型的数据进行增删改
  • 《微信小程序实战(4) · 地图导航功能》
  • 【每天学个新注解】Day 10 Lombok注解简解(九)—@Accessors
  • 第十三届蓝桥杯真题Java c组C.纸张尺寸(持续更新)
  • canvas 五子棋游戏
  • Iterator 和 for...of 循环
  • jdbc就是这么简单
  • Rancher如何对接Ceph-RBD块存储
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 关于字符编码你应该知道的事情
  • 记一次和乔布斯合作最难忘的经历
  • 前端自动化解决方案
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 2017年360最后一道编程题
  • ionic入门之数据绑定显示-1
  • 国内开源镜像站点
  • 如何用纯 CSS 创作一个货车 loader
  • # C++之functional库用法整理
  • # Redis 入门到精通(九)-- 主从复制(1)
  • # SpringBoot 如何让指定的Bean先加载
  • #NOIP 2014# day.2 T2 寻找道路
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (04)odoo视图操作
  • (6)设计一个TimeMap
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (rabbitmq的高级特性)消息可靠性
  • (笔记自用)LeetCode:快乐数
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)德国人的记事本
  • (转载)Google Chrome调试JS
  • .axf 转化 .bin文件 的方法
  • .Net 知识杂记
  • .Net7 环境安装配置
  • .NET中winform传递参数至Url并获得返回值或文件
  • .Net中的设计模式——Factory Method模式
  • .so文件(linux系统)
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • [20150707]外部表与rowid.txt