当前位置: 首页 > 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.gsyq.cn/news/67763.html

相关文章:

  • Redis 数据类型分布式锁
  • Typora的基础使用 - Edward
  • DP题单-衔接版
  • 从赋能到共创:技术负责人的团队赋能五层次模型
  • Spring Framework源码解析——AsyncConfigurer - 实践
  • 提交BUG时的几点注意事项
  • 12/1
  • Github 学生认证保姆级教程 - 狼人:
  • 【口碑好的/比较好的/靠谱的】螺杆挤出机公司/工厂/厂家推荐/排行榜 哪家好/强/靠谱
  • 游戏_CS_地图
  • 2025/12/1
  • 20231326《密码系统设计》十二周预习报告
  • 证券公司客户经理哪家服务好?2024年服务质量评测结果出炉
  • 某中心在NAACL 2024的30多篇论文技术概览
  • 英语背单词 专八词汇 中英对照 2025年12月
  • 人工智能之数据分析 Matplotlib:第七章 项目实践
  • 市面上正规的到家按摩电话排名哪家强?口碑机构一览
  • 市面上最好的抗撕裂聚氨酯包胶轮公司排行榜哪家好
  • 杭州公司注册银行开户哪家强?本地机构实力盘点
  • NeurIPS 2025 | 港中文提出COS3D:多模态融合语言与分割,创造开放词汇3D分割新范式! - 详解
  • 花,草,还有世界
  • 到家按摩app有哪些?几款热门平台推荐
  • 北京家事律师事务所有哪些?相关机构信息参考
  • 12.1
  • 北京知名家事律所排名:专注婚姻家庭法律服务机构推荐
  • 朝阳区离婚律师事务所推荐:区域内专业机构参考
  • 2025 年 12 月红木家具权威推荐榜:匠心实木与雅致软装,甄选传世家居臻品
  • 朝阳区婚姻律师事务所推荐:聚焦家事法律服务的专业参考
  • 海淀区离婚律师事务所推荐:聚焦婚姻家事法律服务的机构参考
  • 西城区离婚律师事务所推荐:婚姻家事法律服务机构盘点