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

Day51(21)-F:\硕士阶段\Java\课程代码\后端\web-ai-code\springboot-aop-quickstart

登录认证--拦截器Interceptor

image-20251130121926875

image-20251130122048923

image-20251130122152150

image-20251130124432636

令牌校验

image-20251130130810791

image-20251130131338342

image-20251130132229085

package com.itheima.Interceptor;import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;@Slf4j
@Component
public class DemoIntercepter implements HandlerInterceptor {//目标资源方法运行之前运行,true放行,false不放行@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.info("prehandle...");return true;}//目标资源方法运行之前运行,true放行,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...");}
}
package com.itheima.Interceptor;import com.itheima.utils.JwtUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;/*** 令牌校验的拦截器*/
@Slf4j
@Component
public class TokenInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//1.获取请求路径String requestURI = request.getRequestURI();//2.判断是否是login
//        if (requestURI.contains("/login")){
//            log.info("登录请求");
//            return true;
//        }//3.获取请求头中的tokenString token = request.getHeader("token");//4.判断token是否存在if (token==null||token.isEmpty()){log.info("令牌为空,响应401");response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);return false;}//5.校验try {JwtUtils.parseToken(token);} catch (Exception e) {log.info("令牌非法,响应401");response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);return false;}return true;}
}
package com.itheima.config;import com.itheima.Interceptor.DemoIntercepter;
import com.itheima.Interceptor.TokenInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** 配置类,底层封装了@component*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
//    @Autowired
//    private DemoIntercepter demoIntercepter;@Autowiredprivate TokenInterceptor tokenInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(tokenInterceptor).addPathPatterns("/**")//拦截所有请求.excludePathPatterns("/login");//不拦截什么请求}
}

AOP

image-20251130133135004

image-20251130133116518

image-20251130133558160

package com.itheima.aop;import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;@Slf4j
@Aspect//标识当前不是一个普通类,是AOP类
@Component
public class RecordTimeAspect {@Around("execution(* com.itheima.service.impl.*.*(..))")public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {//1.记录方法运行的开始时间long begin = System.currentTimeMillis();//2.执行原始的方法Object result = pjp.proceed();//3.记录方法运行的结束时间,记录耗时long end = System.currentTimeMillis();log.info("方法{}执行耗时:{}ms",pjp.getSignature(), end-begin);return result;}
}

image-20251130135602691

切入点一定是连接点,连接点不一定是接入点

image-20251130174428787

image-20251130174841492

实际调用的是代理对象的方法

image-20251130175728362

image-20251130180155723

package com.itheima.aop;import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;@Slf4j
@Aspect
@Component
public class MyAspect1 {@Pointcut("execution(* com.itheima.service.impl.*.*(..))")private void pt(){}//before是前置通知-目标方法运行之前@Before("pt()")public void before(){log.info("before...");}//环绕通知-目标方法执行之前和运行之后@Around("pt()")public Object around(ProceedingJoinPoint pjp) throws Throwable {log.info("around-before");Object proceed = pjp.proceed();log.info("around-after");return proceed;}//after是后置通知-目标方法运行之后@After("pt()")public void after(){log.info("after...");}//afterReturning是后置通知-目标方法运行之后,出现异常不会运行@AfterReturning("pt()")public void afterReturning(){log.info("afterReturning...");}//afterThrowing是后置通知-目标方法运行之后,出现异常才会运行@AfterThrowing("pt()")public void afterThrowing(){log.info("afterThrowing...");}
}

image-20251130183016742

image-20251130190924194

image-20251130191452584

image-20251130191858474

image-20251130193832284

package com.itheima.aop;import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;@Slf4j
@Component
@Order(2)
@Aspect
public class MyAspect5 {//前置通知
//    @Before("execution(public void com.itheima.service.impl.DeptServiceImpl.delete(java.lang.Integer))")//包名.类名,强烈不建议省略
//    @Before("execution( void com.itheima.service.impl.DeptServiceImpl.delete(java.lang.Integer))")//包名.类名,强烈不建议省略
//    @Before("execution( void delete(java.lang.Integer))")//包名.类名,强烈不建议省略//@Before("execution(* com.itheima.service.impl.DeptServiceImpl.delete(java.lang.Integer))")//包名.类名,强烈不建议省略//@Before("execution(* com.*.service.impl.DeptServiceImpl.delete(java.lang.Integer))")//包名.类名,强烈不建议省略//@Before("execution(* com.*.service.impl.*.*(java.lang.Integer))")//包名.类名,强烈不建议省略//@Before("execution(* com.*.service.impl.*.*(*))")//包名.类名,强烈不建议省略//@Before("execution(* com.*.service.impl.DeptServiceImpl.del*(java.lang.Integer))")//包名.类名,强烈不建议省略//@Before("execution(* com.itheima.service.impl.*.*e(*))")//包名.类名,强烈不建议省略//@Before("execution(* com..service.impl.DeptServiceImpl.*(..))")//包名.类名,强烈不建议省略//@Before("execution(* com.itheima.service.*.*(..))")//基于接口,所有的接口或者是类中的所有方法//匹配List与delete方法@Before("execution(* com.itheima.service.impl.DeptServiceImpl.list(..))||" +"execution(* com.itheima.service.impl.DeptServiceImpl.delete(..))")public void before(){log.info("MyAspect4 -> before ...");}}

image-20251130194029532

image-20251130194513652

@Before("@annotation(com.itheima.anno.LogOperation)")
public void before(){log.info("MyAspect4 -> before ...");
}
package com.itheima.anno;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogOperation {
}
http://www.zskr.cn/news/66492.html

相关文章:

  • 2025/11/30 今天没有自我学习
  • 初三 whk 记
  • set操作
  • 2025 补水嫩肤 + 水润双效沐浴露排行榜 TOP10,梵玢成沐浴首选!
  • 云南旅游,旅行社怎么选?看这份五大品牌榜就够了,权威数据+正规资质+定制服务+旅客口碑推荐
  • RustFS安全架构揭秘:其“内存安全”特性如何实现企业级数据可靠?
  • 过碳酸钠进口 CIF 价格 全球供应商及国内优质代理商名录:TOP榜单解析
  • 全弹性锂离子电池技术突破,可拉伸5000%
  • HTTP/2协议漏洞解析:通过HEADERS帧填充实现拒绝服务攻击
  • loj 515 贪心只能过样例
  • 《程序员修建之道:从小工到专家》阅读笔记3
  • CCPC2025 重庆站游记
  • Java项目中最常用的6个设计模式
  • IDEA中使用http协议
  • C语言结构体全面解析与内存优化 - 实践
  • ESP32C3开发指南(基于IDF):console控制台命令行交互功能 - 教程
  • vue+devtools下载地址
  • Google Benchmark:高性能C++代码基准测试框架
  • 2025年11月景区饮品供应商推荐:避坑要点与行业权威评测报告
  • 2025年11月景区饮品供应商推荐榜单:一份基于市场数据客观选择指南
  • 基于深度学习的PCB缺陷检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
  • 成膜助剂贸易公司TOP10优选,出口厂商与资质供应商清单权威推荐
  • 过碳酸钠哪家质量好?过碳酸钠供应商TOP10名单优选:销量领先欧盟标准供应商
  • 成膜助剂外贸公司推荐——出口厂商及资质供应商指南:实力解析
  • 过碳酸钠源头厂家有哪些?过碳酸钠源头厂家、供应商、生产厂家推荐:环保型可吨批!
  • 成膜助剂厂家权威推荐:成膜助剂出口厂商名录——有资质供应商与贸易公司
  • 详细介绍:线程安全单例模式与懒汉线程池的实现与优化
  • 真术相成:成都 AI 培训领域的权威机构,凭什么成为政企合作首选?
  • 《程序员修炼之道:从小工到专家》前五分之四观后感
  • NOIP 2025