一、AOP实现日志和拦截TOKEN
代码如下:
import com.alibaba.fastjson.JSONObject;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* 五种通知的执行顺序为: 前置通知 → 环绕通知 → 后置通知 → 异常返回通知 → 返回通知,
* mpq
*
* @Description: 使用AOP统一处理Web请求日志
*/
@Aspect
@Component
public class WebControllerAop {
@Autowired
private LogService logService;
@Autowired
private RedisUtil redisUtil;
/**
* 指定切点
* 匹配 public * com.test.test.controller.*.*(..)) 下的所有类的所有方法
*/
@Pointcut("execution(public * com.test.test.controller.*.*(..))")
public void webLog() {
}
/**
* 前置通知方法
*/
@Before("webLog()")
public void before(JoinPoint joinPoint) {
}
/**
* 后置通知方法
*/
@After("webLog()")
public void myAfter(JoinPoint joinPoint) {
}
/**
* 环绕通知方法
*/
@Around("webLog()")
public Result<Object> onAround(ProceedingJoinPoint joinPoint) throws Throwable {
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest req = attributes.getRequest();
String token = req.getHeader("token");
String url = req.getRequestURI();
if ("/user".equals(url)) {
return warpLogUser(token, joinPoint, req);
}
return warpNoLogUser(token, joinPoint, req);
}
/**
* 处理token请求
*
* @param token
* @param joinPoint
* @return
* @throws Throwable
*/
private Result<Object> warpLogUser(String token, ProceedingJoinPoint joinPoint, HttpServletRequest request) throws Throwable {
Signature signature = joinPoint.getSignature();
if ("" == token) {
String phone = warpPhone((UserVo) joinPoint.getArgs()[0]);//token为空的时候获取用户手机号
Object proceed = joinPoint.proceed(joinPoint.getArgs());
logService.addService(request, phone, ((Result) proceed).getCode(), ((Result) proceed).getMsg(), signature.getName(), Arrays.toString(joinPoint.getArgs()));
return Result.success(((Result) proceed).getCode(), ((Result) proceed).getMsg(), ((Result) proceed).getData() == null ? "" : ((Result) proceed).getData());
}
Object userInfoString = redisUtil.get(token);
if (userInfoString == null) {
logService.addService(request, "", 2, "token过期,请从新登陆", signature.getName(), Arrays.toString(joinPoint.getArgs()));
return Result.error(2, "token过期,请从新登陆");
}
Map<String, Object> userInfoMap = wrapUserInfo(userInfoString);
logService.addService(request, (String) userInfoMap.get("phone"), 0, "登录成功-缓存登录", signature.getName(), Arrays.toString(joinPoint.getArgs()));
return Result.success(0, "登录成功", userInfoMap);
}
/**
* 处理一般请求
*
* @param token
* @param joinPoint
* @param request
* @return
* @throws Throwable
*/
private Result<Object> warpNoLogUser(String token, ProceedingJoinPoint joinPoint, HttpServletRequest request) {
Signature signature = joinPoint.getSignature();
String phone = "";
if (BaseUtil.isEmpty(token) || redisUtil.get(token) == null) {
logService.addService(request, phone, 2, "请退出登录后重试", signature.getName(), Arrays.toString(joinPoint.getArgs()));
return Result.error(2, "请退出登录后重试");
}
Map<String, Object> userInfoMap = wrapUserInfo(redisUtil.get(token));
request.setAttribute("userInfo", userInfoMap);
phone = (String) userInfoMap.get("phone");
try {
//执行方法体
Object proceed = joinPoint.proceed(joinPoint.getArgs());
//后置通知
logService.addService(request, phone, ((Result) proceed).getCode(), ((Result) proceed).getMsg(), signature.getName(), Arrays.toString(joinPoint.getArgs()));
return Result.success(((Result) proceed).getCode(), ((Result) proceed).getMsg(), ((Result) proceed).getData() == null ? "" : ((Result) proceed).getData());
} catch (CustomException customException) {
logService.addService(request, phone, customException.getCode(), customException.getMsg(), signature.getName(), Arrays.toString(joinPoint.getArgs()));
return Result.error(customException.getCode(), customException.getMsg());
} catch (Throwable throwable) {
logService.addService(request, phone, 9, throwable.getMessage(), signature.getName(), Arrays.toString(joinPoint.getArgs()));
return Result.error(9, throwable.getMessage());
}
}
private String warpPhone(UserVo parameter) {
return parameter.getPhone();
}
private Map<String, Object> wrapUserInfo(Object userInfoString) {
JSONObject jsonObject = JSONObject.parseObject(userInfoString.toString());
Map<String, Object> userInfo = new HashMap<>();
userInfo.put("id", jsonObject.get("id"));
userInfo.put("name", jsonObject.get("name"));
userInfo.put("sex", jsonObject.get("sex"));
userInfo.put("phone", jsonObject.get("phone"));
return userInfo;
}
}