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

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 {@Overridepublic 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.获取请求头子的tokenString 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 {@Autowiredprivate 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

http://www.jsqmd.com/news/57443/

相关文章:

  • Redis 数据类型分布式锁
  • ESP32-LVGL 开发笔记(三):性能监控
  • 2025 阿联酋经济部商标注册平台 TOP4 实测:流程、费用与使用指南全解析
  • 2025 墨西哥商标注册渠道怎么选?3 大主流渠道测评 + 避坑指南
  • 2025年8款免费AI论文写作神器推荐!毕业论文轻松搞定
  • Typora的基础使用 - Edward
  • DP题单-衔接版
  • TCP/IP是什么?OSI又是什么? - 实践
  • 实用指南:(ACP广源盛)GSV6155---带嵌入式微控制器(MCU)和电源传输(PD)控制器的 Type-C/DisplayPort 1.4 信号中继器
  • 敏捷冲刺随笔-5
  • 美国商标注册代理公司哪家强?2025 实测榜单,注册成功率一目了然
  • 2025 国际商标注册平台测评:8 大头部机构实力排行 + 适配指南
  • 2025 印尼商标注册服务商哪家好?3大平台测评,帮你避开 90% 的坑
  • 从赋能到共创:技术负责人的团队赋能五层次模型
  • 【数位之和】除法和取余的使用
  • 基于空间变化单层神经网络先验的贝里标量-图像回归
  • 20251130-学习第一天
  • zy_蓝桥杯_C++学习系列一_语法基础
  • Spring Framework源码解析——AsyncConfigurer - 实践
  • 20232415 2025-2026-1 《网络与系统攻防技术》实验八实验报告
  • Linux 进程资源占用分析指南 - 指南
  • 租房买房必看5这种“恶山”格局,让你努力工作也存不住钱,背后小人不断!
  • python笔记-条件判断
  • AI自动视频剪辑的开源模型盘点
  • 日总结 33
  • STM32 Cmake平台上对print进行串口重定向的方法
  • Github 学生认证保姆级教程 - 狼人:
  • 【口碑好的/比较好的/靠谱的】螺杆挤出机公司/工厂/厂家推荐/排行榜 哪家好/强/靠谱
  • liunx材料及目录管理和vim编辑
  • 游戏_CS_地图