登录认证--拦截器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不放行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("prehandle...");
return true;
}
//目标资源方法运行之前运行,true放行,false不放行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("postHandle...");
}
//视图渲染完毕之后运行
@Override
public 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 {
@Override
public 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.获取请求头中的token
String 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;
@Autowired
private TokenInterceptor tokenInterceptor;
@Override
public 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 {
}