PageProcessAspect.java 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. package com.java110.api.aop;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.java110.core.context.IPageData;
  4. import com.java110.core.context.PageData;
  5. import com.java110.core.log.LoggerFactory;
  6. import com.java110.utils.constant.CommonConstant;
  7. import com.java110.utils.exception.FilterException;
  8. import com.java110.utils.util.StringUtil;
  9. import org.aspectj.lang.JoinPoint;
  10. import org.aspectj.lang.ProceedingJoinPoint;
  11. import org.aspectj.lang.annotation.*;
  12. import org.slf4j.Logger;
  13. import org.springframework.http.HttpMethod;
  14. import org.springframework.http.HttpStatus;
  15. import org.springframework.http.ResponseEntity;
  16. import org.springframework.stereotype.Component;
  17. import org.springframework.web.context.request.RequestContextHolder;
  18. import org.springframework.web.context.request.ServletRequestAttributes;
  19. import javax.servlet.http.Cookie;
  20. import javax.servlet.http.HttpServletRequest;
  21. import javax.servlet.http.HttpServletResponse;
  22. import java.io.BufferedReader;
  23. import java.io.IOException;
  24. import java.io.InputStream;
  25. import java.io.InputStreamReader;
  26. import java.util.Enumeration;
  27. import java.util.HashMap;
  28. import java.util.Map;
  29. /**
  30. * 数据初始化
  31. * Created by wuxw on 2018/5/2.
  32. */
  33. @Aspect
  34. @Component
  35. public class PageProcessAspect {
  36. private static Logger logger = LoggerFactory.getLogger(PageProcessAspect.class);
  37. @Pointcut("execution(public * com.java110..*.*Controller.*(..)) ")
  38. public void dataProcess() {
  39. }
  40. /**
  41. * 初始化数据
  42. *
  43. * @param joinPoint
  44. * @throws Throwable
  45. */
  46. @Before("dataProcess()")
  47. public void deBefore(JoinPoint joinPoint) throws Throwable {
  48. // 接收到请求,记录请求内容
  49. ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  50. HttpServletRequest request = attributes.getRequest();
  51. IPageData pd = null;
  52. String reqData = "";
  53. String userId = "";
  54. String userName = "";
  55. String appId = "";
  56. String sessionId = request.getSession().getId();
  57. appId = request.getHeader("APP_ID");
  58. if (StringUtil.isEmpty(appId)) {
  59. appId = request.getHeader("APP-ID");
  60. }
  61. logger.debug("请求头信息:" + request.getHeaderNames());
  62. if ("POST,PUT".contains(request.getMethod())) {
  63. InputStream in = request.getInputStream();
  64. BufferedReader reader = new BufferedReader(new InputStreamReader(in));
  65. //reader.
  66. StringBuffer sb = new StringBuffer();
  67. String str = "";
  68. while ((str = reader.readLine()) != null) {
  69. sb.append(str);
  70. }
  71. reqData = sb.toString();
  72. }
  73. //对 get情况下的参数进行封装
  74. else {
  75. Map<String, String[]> params = request.getParameterMap();
  76. if (params != null && !params.isEmpty()) {
  77. JSONObject paramObj = new JSONObject();
  78. for (String key : params.keySet()) {
  79. if (params.get(key).length > 0) {
  80. String value = "";
  81. for (int paramIndex = 0; paramIndex < params.get(key).length; paramIndex++) {
  82. value += (params.get(key)[paramIndex] + ",");
  83. }
  84. value = value.endsWith(",") ? value.substring(0, value.length() - 1) : value;
  85. paramObj.put(key, value);
  86. }
  87. continue;
  88. }
  89. reqData = paramObj.toJSONString();
  90. }
  91. }
  92. // 获取 userId
  93. if (request.getAttribute("claims") != null && request.getAttribute("claims") instanceof Map) {
  94. Map<String, String> userInfo = (Map<String, String>) request.getAttribute("claims");
  95. if (userInfo.containsKey(CommonConstant.LOGIN_USER_ID)) {
  96. userId = userInfo.get(CommonConstant.LOGIN_USER_ID);
  97. userName = userInfo.get(CommonConstant.LOGIN_USER_NAME);
  98. }
  99. }
  100. // 获取组件名称 和方法名称
  101. String url = request.getRequestURL() != null ? request.getRequestURL().toString() : "";
  102. String componentCode = "";
  103. String componentMethod = "";
  104. if (url.contains("callComponent")) { //组件处理
  105. String[] urls = url.split("/");
  106. if (urls.length == 6) {
  107. componentCode = urls[4];
  108. componentMethod = urls[5];
  109. } else {
  110. componentCode = "api";
  111. componentMethod = "callApi";
  112. }
  113. } else if (url.contains("flow")) { //流程处理
  114. String[] urls = url.split("/");
  115. if (urls.length == 5) {
  116. componentCode = urls[4];
  117. }
  118. }
  119. Map<String, Object> headers = new HashMap<>();
  120. Enumeration reqHeaderEnum = request.getHeaderNames();
  121. while (reqHeaderEnum.hasMoreElements()) {
  122. String headerName = (String) reqHeaderEnum.nextElement();
  123. headers.put(headerName.toLowerCase(), request.getHeader(headerName));
  124. }
  125. pd = PageData.newInstance().builder(userId, userName, this.getToken(request), reqData, componentCode, componentMethod, url, sessionId, appId, headers);
  126. pd.setMethod(request.getMethod().equals("GET") ? HttpMethod.GET : HttpMethod.POST);
  127. logger.debug("切面 获取到的pd=" + JSONObject.toJSONString(pd));
  128. request.setAttribute(CommonConstant.CONTEXT_PAGE_DATA, pd);
  129. //调用链
  130. //Java110TraceFactory.createTrace(componentCode + "/" + componentMethod, headers);
  131. }
  132. @AfterReturning(returning = "ret", pointcut = "dataProcess()")
  133. public void doAfterReturning(Object ret) throws Throwable {
  134. // 处理完请求,返回内容
  135. }
  136. //后置异常通知
  137. @AfterThrowing("dataProcess()")
  138. public void throwException(JoinPoint jp) {
  139. }
  140. //后置最终通知,final增强,不管是抛出异常或者正常退出都会执行
  141. @After("dataProcess()")
  142. public void after(JoinPoint jp) throws IOException {
  143. // 接收到请求,记录请求内容
  144. ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  145. HttpServletRequest request = attributes.getRequest();
  146. //记录调用链
  147. //Java110TraceFactory.putAnnotations(TraceAnnotationsDto.VALUE_CLIENT_RECEIVE);
  148. PageData pd = request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA) != null ? (PageData) request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA) : null;
  149. //保存日志处理
  150. if (pd == null) {
  151. return;
  152. }
  153. //写cookies信息
  154. writeCookieInfo(pd, attributes);
  155. }
  156. //环绕通知,环绕增强,相当于MethodInterceptor
  157. @Around("dataProcess()")
  158. public Object around(ProceedingJoinPoint pjp) {
  159. try {
  160. Object o = pjp.proceed();
  161. return o;
  162. } catch (Throwable e) {
  163. logger.error("执行方法异常", e);
  164. return new ResponseEntity("内部异常" + e.getLocalizedMessage(), HttpStatus.BAD_REQUEST);
  165. }
  166. }
  167. /**
  168. * 获取TOKEN
  169. *
  170. * @param request
  171. * @return
  172. */
  173. private String getToken(HttpServletRequest request) throws FilterException {
  174. String token = "";
  175. if (request.getCookies() == null || request.getCookies().length == 0) {
  176. return token;
  177. }
  178. for (Cookie cookie : request.getCookies()) {
  179. if (CommonConstant.COOKIE_AUTH_TOKEN.equals(cookie.getName())) {
  180. token = cookie.getValue();
  181. }
  182. }
  183. return token;
  184. }
  185. /**
  186. * 写cookie 信息
  187. *
  188. * @param pd 页面封装信息
  189. * @param attributes
  190. * @throws IOException
  191. */
  192. private void writeCookieInfo(IPageData pd, ServletRequestAttributes attributes) throws IOException {
  193. // 这里目前只写到组件级别,如果需要 写成方法级别
  194. if (!StringUtil.isNullOrNone(pd.getToken()) && "login".equals(pd.getComponentCode())) {
  195. HttpServletResponse response = attributes.getResponse();
  196. Cookie cookie = new Cookie(CommonConstant.COOKIE_AUTH_TOKEN, pd.getToken());
  197. cookie.setHttpOnly(true);
  198. cookie.setPath("/");
  199. response.addCookie(cookie);
  200. response.flushBuffer();
  201. }
  202. }
  203. }