Day52(22)-F:\硕士阶段\Java\课程代码\后端\web-ai-code\web-ai-project02
AOP
package com.itheima.aop;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.Arrays;
@Slf4j
@Component
@Aspect
public class MyAspect6 {
@Before("execution(* com.itheima.service.*.*(..))")
public void before(JoinPoint joinPoint){
log.info("MyAspect -> before ...");
//1.获取目标对象
Object target = joinPoint.getTarget();
log.info("获取目标对象{}",target);
//2.获取目标类
String className = joinPoint.getTarget().getClass().getName();
log.info("获取目标类{}",className);
//3.获取目标方法
String methodName = joinPoint.getSignature().getName();
log.info("获取目标方法{}",methodName);
//4.获取目标方法参数
Object[] args = joinPoint.getArgs();
log.info("获取目标参数{}", Arrays.toString(args));
}
@Around("execution(* com.itheima.service.*.*(..))")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
log.info("around-before");
Object proceed = pjp.proceed();
log.info("around-after");
return proceed;
}
}
列编辑
alt+鼠标左键拖动
ThreadLocal线程数据共享
package com.itheima.utils;
public class CurrentHolder {
private static final ThreadLocal<Integer> CURRENT_LOCAL = new ThreadLocal<>();
public static void setCurrentId(Integer employeeId) {
CURRENT_LOCAL.set(employeeId);
}
public static Integer getCurrentId() {
return CURRENT_LOCAL.get();
}
public static void remove() {
CURRENT_LOCAL.remove();
}
}
package com.itheima.filter;
import com.itheima.utils.CurrentHolder;
import com.itheima.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
@Slf4j
@WebFilter(urlPatterns = "/*")
public class TokenFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//1.获取请求路径
String requestURI = request.getRequestURI();
//2.判断是否登录请求,如果路径中包含/login,说明是登录操作,放行
if (requestURI.contains("/login")){
log.info("登录请求,放行");
filterChain.doFilter(request,response);
return;
}
//3.获取请求头子的token
String token = request.getHeader("token");
//4.判断token是否存在,如果不存在,说明用户没有登录,返回错误信息(响应401状态码)
if(token==null||token.isEmpty()){
log.info("令牌为空,响应401");
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return;
}
//5.如果token存在,校验令牌,如果校验失败 - >返回错误信息(响应401状态码)
try {
Claims claims = JwtUtils.parseToken(token);//校验令牌
Integer empId = Integer.valueOf(claims.get("id").toString());
CurrentHolder.setCurrentId(empId);
log.info("当前登录员工的ID:{},将其存入ThreadLocal",empId);
} catch (Exception e) {
log.info("令牌非法");
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return;
}
//6.校验通过,放行
log.info("令牌合法,放行");
filterChain.doFilter(request,response);
//7.删除ThreadLocal中的数据
CurrentHolder.remove();
}
}
package com.itheima.aop;
import com.itheima.mapper.OperateLogMapper;
import com.itheima.pojo.OperateLog;
import com.itheima.utils.CurrentHolder;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.net.openssl.ciphers.Authentication;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.Arrays;
// OperateLogAspect.java
@Aspect
@Component
@Slf4j
public class OperateLogAspect {
@Autowired
private OperateLogMapper operateLogMapper;
@Around("@annotation(com.itheima.anno.Log)")
public Object logOperation(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
long startTime = System.currentTimeMillis();
//执行目标方法
Object result = proceedingJoinPoint.proceed();
//计算耗时
long endTime = System.currentTimeMillis();
long costTime = endTime - startTime;
//构建日志实体
OperateLog olog = new OperateLog();
olog.setOperateEmpId(getCurrentUserId());
olog.setOperateTime(LocalDateTime.now());
olog.setClassName(proceedingJoinPoint.getTarget().getClass().getName());
olog.setMethodName(proceedingJoinPoint.getSignature().getName());
olog.setMethodParams(Arrays.toString(proceedingJoinPoint.getArgs()));
olog.setReturnValue(result!=null?result.toString():"null");
olog.setCostTime(costTime);
//保存日志
log.info("记录操作日志{}",olog);
operateLogMapper.insert(olog);
return result;
}
private Integer getCurrentUserId(){
return CurrentHolder.getCurrentId();
}
}

浙公网安备 33010602011771号