ControllerAround.java 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package com.mirage.mirageservice.aspect;
  2. import com.mirage.core.annotation.Auth;
  3. import com.mirage.core.annotation.WithOriginalResponse;
  4. import com.mirage.core.exception.AppRuntimeException;
  5. import com.mirage.core.meta.AppCode;
  6. import com.mirage.core.meta.AuthType;
  7. import com.mirage.core.meta.WebLogBean;
  8. import com.mirage.core.utils.AppResult;
  9. import com.mirage.core.utils.Constants;
  10. import com.mirage.core.utils.GsonUtil;
  11. import com.mirage.core.utils.RequestUtil;
  12. import com.mirage.mirageservice.domain.CsMinWechatUser;
  13. import com.mirage.mirageservice.meta.AppContext;
  14. import com.mirage.mirageservice.service.UserService;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.apache.commons.lang3.StringUtils;
  17. import org.aspectj.lang.ProceedingJoinPoint;
  18. import org.aspectj.lang.annotation.Around;
  19. import org.aspectj.lang.annotation.Aspect;
  20. import org.aspectj.lang.annotation.Pointcut;
  21. import org.aspectj.lang.reflect.MethodSignature;
  22. import org.springframework.core.annotation.Order;
  23. import org.springframework.data.redis.core.StringRedisTemplate;
  24. import org.springframework.stereotype.Component;
  25. import org.springframework.web.bind.annotation.RequestBody;
  26. import org.springframework.web.context.request.RequestContextHolder;
  27. import org.springframework.web.context.request.ServletRequestAttributes;
  28. import javax.annotation.Resource;
  29. import javax.servlet.http.HttpServletRequest;
  30. import java.lang.annotation.Annotation;
  31. import java.lang.reflect.Method;
  32. import java.lang.reflect.Parameter;
  33. /**
  34. * Created by hzlinhai on 2024/5/15.
  35. */
  36. @Component
  37. @Aspect
  38. @Order(value = 1)
  39. @Slf4j
  40. public class ControllerAround {
  41. @Resource
  42. private StringRedisTemplate stringRedisTemplate;
  43. @Resource
  44. private UserService userService;
  45. @Pointcut("within(com.mirage.mirageservice.controller..*) " +
  46. "&& (@annotation(org.springframework.web.bind.annotation.RequestMapping) " +
  47. "|| @annotation(org.springframework.web.bind.annotation.PostMapping))" +
  48. "|| @annotation(org.springframework.web.bind.annotation.GetMapping))")
  49. private void requestMapping() {
  50. }
  51. private <T extends Annotation> T getAnnotation(Class<?> clazz, Method method, Class<T> annoClazz) {
  52. T annotation = method.getAnnotation(annoClazz);
  53. if (annotation == null) {
  54. annotation = clazz.getAnnotation(annoClazz);
  55. }
  56. return annotation;
  57. }
  58. @Around("requestMapping()")
  59. public Object watchRequestMapping(ProceedingJoinPoint jp) {
  60. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  61. AppContext.start();
  62. WebLogBean.start();
  63. WebLogBean logBean = WebLogBean.get();
  64. logBean.setPath(request.getRequestURI());
  65. logBean.setIp(RequestUtil.getIp(request));
  66. logBean.setHeaders(RequestUtil.getHeaders(request));
  67. logBean.setParams(request.getParameterMap());
  68. Object result = null;
  69. try {
  70. Class<?> clazz = jp.getTarget().getClass();
  71. MethodSignature methodSignature = (MethodSignature) jp.getSignature();
  72. Method method = methodSignature.getMethod();
  73. Object[] args = jp.getArgs();
  74. Parameter[] parameters = method.getParameters();
  75. for (int i = 0; i < parameters.length; i++) {
  76. if (parameters[i].getAnnotation(RequestBody.class) != null) {
  77. logBean.setPayload(args[i]);
  78. break;
  79. }
  80. }
  81. long now = WebLogBean.get().getBeginTime();
  82. Auth auth = getAnnotation(clazz, method, Auth.class);
  83. WithOriginalResponse withOriginResponse = getAnnotation(clazz, method, WithOriginalResponse.class);
  84. boolean returnOriginData = withOriginResponse != null;
  85. String mirageAuth = request.getHeader("MIRAGE-AUTH");
  86. //BussinessAuth 附加Auth(admin) 作用
  87. AuthType authType = auth == null ? null : auth.value();
  88. long startUserFilterTime = System.currentTimeMillis();
  89. // 统一鉴权拦截
  90. if (authType != null) {
  91. CsMinWechatUser minWechatUser = null;
  92. switch (authType) {
  93. case COOKIES: {
  94. String debugMod = request.getHeader("MIRAGE-X-DEBUG");
  95. if(StringUtils.isNotBlank(debugMod)){
  96. // userAccount = userService.getUserByAccount("18814867496");
  97. }else{
  98. if(StringUtils.isBlank(mirageAuth)){
  99. throw new AppRuntimeException(AppCode.UNAUTHORIZED);
  100. }
  101. String sessionValue = stringRedisTemplate.boundValueOps(Constants.REDIS_MIRAGE_LOGIN_SESSION + mirageAuth).get();
  102. if(StringUtils.isBlank(sessionValue)){
  103. throw new AppRuntimeException(AppCode.UNAUTHORIZED);
  104. }
  105. minWechatUser = GsonUtil.fromJson(sessionValue, CsMinWechatUser.class);
  106. if(null == minWechatUser){
  107. throw new AppRuntimeException(AppCode.UNAUTHORIZED);
  108. }
  109. }
  110. break;
  111. }
  112. case OPEN: {
  113. break;
  114. }
  115. default: {
  116. throw new AppRuntimeException(AppCode.FORBIDDEN, "Unsupported Api.");
  117. }
  118. }
  119. // 鉴权信息设置进上下文
  120. AppContext.setUserInfo(minWechatUser);
  121. if(null != minWechatUser) {
  122. AppContext.setUid(minWechatUser.getId());
  123. logBean.setUid(minWechatUser.getId());
  124. }
  125. logBean.addProp("filterCostTimeTotal", System.currentTimeMillis() - startUserFilterTime);
  126. }
  127. result = jp.proceed();
  128. logBean.setResult(result);
  129. if (returnOriginData) {
  130. return result;
  131. }
  132. return new AppResult(result);
  133. } catch (AppRuntimeException e) {
  134. logBean.setCode(e.getCode());
  135. logBean.setError(e.getMessage());
  136. result = new AppResult(e.getCode(), e.getMessage());
  137. return result;
  138. } catch (Throwable e) {
  139. log.error("@alert@P0@1min-1@:服务异常#");
  140. log.error(e.getMessage(), e);
  141. logBean.setError(e.getMessage());
  142. logBean.setCode(AppCode.UNKNOWN.getCode());
  143. result = new AppResult(AppCode.UNKNOWN.getCode(), AppCode.UNKNOWN.getMessage());
  144. return result;
  145. } finally {
  146. logBean.setResult(result);
  147. AppContext.end();
  148. WebLogBean.end();
  149. }
  150. }
  151. }