Day52(22)-F:\硕士阶段\Java\课程代码\后端\web-ai-code\web-ai-project02

AOP

image-20251201122252006

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线程数据共享

image-20251201132912885

image-20251201135804836

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();
    }

}

image-20251201142210881

posted @ 2025-12-01 20:34  David大胃  阅读(2)  评论(0)    收藏  举报