|
|
@@ -1,185 +1,185 @@
|
|
|
-package com.fdkankan.manage.interceptor;
|
|
|
-
|
|
|
-import cn.hutool.core.util.StrUtil;
|
|
|
-import cn.hutool.extra.servlet.ServletUtil;
|
|
|
-import cn.hutool.http.ContentType;
|
|
|
-import cn.hutool.http.useragent.UserAgent;
|
|
|
-import cn.hutool.http.useragent.UserAgentUtil;
|
|
|
-import com.alibaba.fastjson.JSON;
|
|
|
-import com.alibaba.fastjson.JSONObject;
|
|
|
-import com.fdkankan.common.util.JwtUtil;
|
|
|
-import com.fdkankan.manage.bean.MenuBean;
|
|
|
-import com.fdkankan.manage.entity.OperLog;
|
|
|
-import com.fdkankan.redis.constant.RedisKey;
|
|
|
-import com.fdkankan.redis.util.RedisUtil;
|
|
|
-import io.jsonwebtoken.Claims;
|
|
|
-import java.util.Arrays;
|
|
|
-import java.util.Calendar;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.LinkedList;
|
|
|
-import java.util.Map;
|
|
|
-import java.util.Objects;
|
|
|
-import javax.servlet.http.HttpServletRequest;
|
|
|
-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.Pointcut;
|
|
|
-import org.aspectj.lang.reflect.MethodSignature;
|
|
|
-import org.springframework.beans.factory.annotation.Autowired;
|
|
|
-import org.springframework.beans.factory.annotation.Value;
|
|
|
-import org.springframework.data.mongodb.core.MongoTemplate;
|
|
|
-import org.springframework.stereotype.Component;
|
|
|
-import org.springframework.web.context.request.RequestContextHolder;
|
|
|
-import org.springframework.web.context.request.ServletRequestAttributes;
|
|
|
-import org.springframework.web.multipart.MultipartFile;
|
|
|
-
|
|
|
-@Component
|
|
|
-@Aspect
|
|
|
-@Slf4j
|
|
|
-public class VisitLogInterceptor {
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private RedisUtil redisUtil;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private MongoTemplate mongoTemplate;
|
|
|
-
|
|
|
- @Value("${server.servlet.context-path:null}")
|
|
|
- private String contextPath;
|
|
|
-
|
|
|
- // 切入点表达式
|
|
|
- @Pointcut("execution(public * com.fdkankan.manage.controller..*.*(..))")
|
|
|
- public void privilege() {
|
|
|
- }
|
|
|
-
|
|
|
- @Around("privilege()")
|
|
|
- public Object around(ProceedingJoinPoint pjp) throws Throwable {
|
|
|
-
|
|
|
- HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
|
|
|
-
|
|
|
- //获取客户端ip
|
|
|
- String clientIP = ServletUtil.getClientIP(request);
|
|
|
-
|
|
|
- //获取uri
|
|
|
- String uri = request.getRequestURI();
|
|
|
- if(StrUtil.isNotEmpty(contextPath)){
|
|
|
- uri = uri.replaceFirst(contextPath, "");
|
|
|
- }
|
|
|
-
|
|
|
- //获取请求方式
|
|
|
- String method = request.getMethod();
|
|
|
-
|
|
|
- //获取浏览器信息
|
|
|
- String browser = this.getBrowser(request);
|
|
|
-
|
|
|
- //获取参数
|
|
|
- String params = this.getParams(pjp, request);
|
|
|
-
|
|
|
- //获取操作路径
|
|
|
- String requestPath = null;
|
|
|
-// this.getRequestPath(uri);
|
|
|
-
|
|
|
- //放行
|
|
|
- Object result = pjp.proceed();
|
|
|
-
|
|
|
- //获取用户信息 如果已登录,从token中获取用户信息,如果是登录接口,查询数据库获取用户信息
|
|
|
- Map<String, Object> userInfo = this.getUserInfo(request, uri, result);
|
|
|
- Long userId = (Long)userInfo.get("userId");
|
|
|
- String userName = (String)userInfo.get("userName");
|
|
|
- String nickName = (String)userInfo.get("nickName");
|
|
|
-
|
|
|
- //写入mongodb
|
|
|
- OperLog operLog = OperLog.builder()
|
|
|
- .userId(userId)
|
|
|
- .userName(userName)
|
|
|
- .nickName(nickName)
|
|
|
- .requestPath(requestPath)
|
|
|
- .uri(uri)
|
|
|
- .method(method)
|
|
|
- .params(params)
|
|
|
- .ip(clientIP)
|
|
|
- .browser(browser)
|
|
|
- .requestTime(Calendar.getInstance().getTime())
|
|
|
- .build();
|
|
|
- mongoTemplate.insert(operLog);
|
|
|
-
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- private String getRequestPath(String uri){
|
|
|
- String hget = redisUtil.hget(RedisKey.MANAGE_MENU, uri);
|
|
|
- MenuBean menuBean = JSON.parseObject(hget, MenuBean.class);
|
|
|
- LinkedList<String> menuList = new LinkedList<>();
|
|
|
- this.getRequestPathHandler(menuList, menuBean);
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
- menuList.stream().forEach(str->sb.append("->").append(str));
|
|
|
- return sb.substring(2);
|
|
|
- }
|
|
|
-
|
|
|
- private void getRequestPathHandler(LinkedList list, MenuBean menuBean){
|
|
|
- list.addFirst("[" + menuBean.getName() + "]");
|
|
|
- if(Objects.isNull(menuBean.getParent())){
|
|
|
- return;
|
|
|
- }
|
|
|
- this.getRequestPathHandler(list, menuBean.getParent());
|
|
|
- }
|
|
|
-
|
|
|
- private Map<String, Object> getUserInfo(HttpServletRequest request, String uri, Object result){
|
|
|
- String token = null;
|
|
|
- boolean isLogin = uri.endsWith("login");
|
|
|
- if(isLogin){
|
|
|
- String resultStr = JSON.toJSONString(result);
|
|
|
- JSONObject jsonObject = JSON.parseObject(resultStr);
|
|
|
- JSONObject data = jsonObject.getJSONObject("data");
|
|
|
- token = data.getString("token");
|
|
|
- }else{
|
|
|
- token = request.getHeader("token");
|
|
|
- }
|
|
|
- Claims claims = JwtUtil.parseJWT(token);
|
|
|
- Integer userId = (Integer) claims.get("userId");
|
|
|
- String userName = (String)claims.get("userName");
|
|
|
- String nickName = (String)claims.get("nickName");
|
|
|
- Map<String, Object> userInfo = new HashMap<>();
|
|
|
- userInfo.put("userId", Long.valueOf(userId));
|
|
|
- userInfo.put("userName", userName);
|
|
|
- userInfo.put("nickName", nickName);
|
|
|
- return userInfo;
|
|
|
- }
|
|
|
-
|
|
|
- private String getParams(JoinPoint pjp, HttpServletRequest request){
|
|
|
-
|
|
|
- // 获取参数名称
|
|
|
- String[] parameterNamesArgs = ((MethodSignature) pjp.getSignature()).getParameterNames();
|
|
|
- //获取请求参数值
|
|
|
- Object[] args = pjp.getArgs();
|
|
|
-
|
|
|
- Map<String, Object> paramMap = new HashMap<>();
|
|
|
- String contentType = request.getContentType();
|
|
|
- if(ContentType.JSON.getValue().equals(contentType)){
|
|
|
- Arrays.stream(args).forEach(arg->paramMap.putAll((Map)arg));
|
|
|
- return JSON.toJSONString(paramMap);
|
|
|
- }else{
|
|
|
- for (int i = 0; i < args.length; i++) {
|
|
|
- if(args[i] instanceof MultipartFile){
|
|
|
- paramMap.put(parameterNamesArgs[i], ((MultipartFile) args[i]).getOriginalFilename());
|
|
|
- continue;
|
|
|
- }
|
|
|
- paramMap.put(parameterNamesArgs[i], args[i]);
|
|
|
- }
|
|
|
- }
|
|
|
- return JSON.toJSONString(paramMap);
|
|
|
- }
|
|
|
-
|
|
|
- private String getBrowser(HttpServletRequest request){
|
|
|
- String userAgentStr = request.getHeader("User-Agent");
|
|
|
- UserAgent userAgent = UserAgentUtil.parse(userAgentStr);
|
|
|
- String browserType = userAgent.getBrowser().toString();
|
|
|
- String browserVersion = userAgent.getVersion();
|
|
|
- String browserFormat = "%s(版本%s)";
|
|
|
- return String.format(browserFormat, browserType, browserVersion);
|
|
|
- }
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
+//package com.fdkankan.manage.interceptor;
|
|
|
+//
|
|
|
+//import cn.hutool.core.util.StrUtil;
|
|
|
+//import cn.hutool.extra.servlet.ServletUtil;
|
|
|
+//import cn.hutool.http.ContentType;
|
|
|
+//import cn.hutool.http.useragent.UserAgent;
|
|
|
+//import cn.hutool.http.useragent.UserAgentUtil;
|
|
|
+//import com.alibaba.fastjson.JSON;
|
|
|
+//import com.alibaba.fastjson.JSONObject;
|
|
|
+//import com.fdkankan.common.util.JwtUtil;
|
|
|
+//import com.fdkankan.manage.bean.MenuBean;
|
|
|
+//import com.fdkankan.manage.entity.OperLog;
|
|
|
+//import com.fdkankan.redis.constant.RedisKey;
|
|
|
+//import com.fdkankan.redis.util.RedisUtil;
|
|
|
+//import io.jsonwebtoken.Claims;
|
|
|
+//import java.util.Arrays;
|
|
|
+//import java.util.Calendar;
|
|
|
+//import java.util.Date;
|
|
|
+//import java.util.HashMap;
|
|
|
+//import java.util.LinkedList;
|
|
|
+//import java.util.Map;
|
|
|
+//import java.util.Objects;
|
|
|
+//import javax.servlet.http.HttpServletRequest;
|
|
|
+//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.Pointcut;
|
|
|
+//import org.aspectj.lang.reflect.MethodSignature;
|
|
|
+//import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+//import org.springframework.beans.factory.annotation.Value;
|
|
|
+//import org.springframework.data.mongodb.core.MongoTemplate;
|
|
|
+//import org.springframework.stereotype.Component;
|
|
|
+//import org.springframework.web.context.request.RequestContextHolder;
|
|
|
+//import org.springframework.web.context.request.ServletRequestAttributes;
|
|
|
+//import org.springframework.web.multipart.MultipartFile;
|
|
|
+//
|
|
|
+//@Component
|
|
|
+//@Aspect
|
|
|
+//@Slf4j
|
|
|
+//public class VisitLogInterceptor {
|
|
|
+//
|
|
|
+// @Autowired
|
|
|
+// private RedisUtil redisUtil;
|
|
|
+//
|
|
|
+// @Autowired
|
|
|
+// private MongoTemplate mongoTemplate;
|
|
|
+//
|
|
|
+// @Value("${server.servlet.context-path:null}")
|
|
|
+// private String contextPath;
|
|
|
+//
|
|
|
+// // 切入点表达式
|
|
|
+// @Pointcut("execution(public * com.fdkankan.manage.controller..*.*(..))")
|
|
|
+// public void privilege() {
|
|
|
+// }
|
|
|
+//
|
|
|
+// @Around("privilege()")
|
|
|
+// public Object around(ProceedingJoinPoint pjp) throws Throwable {
|
|
|
+//
|
|
|
+// HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
|
|
|
+//
|
|
|
+// //获取客户端ip
|
|
|
+// String clientIP = ServletUtil.getClientIP(request);
|
|
|
+//
|
|
|
+// //获取uri
|
|
|
+// String uri = request.getRequestURI();
|
|
|
+// if(StrUtil.isNotEmpty(contextPath)){
|
|
|
+// uri = uri.replaceFirst(contextPath, "");
|
|
|
+// }
|
|
|
+//
|
|
|
+// //获取请求方式
|
|
|
+// String method = request.getMethod();
|
|
|
+//
|
|
|
+// //获取浏览器信息
|
|
|
+// String browser = this.getBrowser(request);
|
|
|
+//
|
|
|
+// //获取参数
|
|
|
+// String params = this.getParams(pjp, request);
|
|
|
+//
|
|
|
+// //获取操作路径
|
|
|
+// String requestPath = null;
|
|
|
+//// this.getRequestPath(uri);
|
|
|
+//
|
|
|
+// //放行
|
|
|
+// Object result = pjp.proceed();
|
|
|
+//
|
|
|
+// //获取用户信息 如果已登录,从token中获取用户信息,如果是登录接口,查询数据库获取用户信息
|
|
|
+// Map<String, Object> userInfo = this.getUserInfo(request, uri, result);
|
|
|
+// Long userId = (Long)userInfo.get("userId");
|
|
|
+// String userName = (String)userInfo.get("userName");
|
|
|
+// String nickName = (String)userInfo.get("nickName");
|
|
|
+//
|
|
|
+// //写入mongodb
|
|
|
+// OperLog operLog = new OperLog();
|
|
|
+// operLog.setUserId(userId);
|
|
|
+// operLog.setUserName(userName);
|
|
|
+// operLog.setNickName(nickName);
|
|
|
+// operLog.setRequestPath(requestPath);
|
|
|
+// operLog.setUri(uri);
|
|
|
+// operLog.setMethod(method);
|
|
|
+// operLog.setParams(params);
|
|
|
+// operLog.setIp(clientIP);
|
|
|
+// operLog.setBrowser(browser);
|
|
|
+// operLog.setCreateTime(Calendar.getInstance().getTime());
|
|
|
+// mongoTemplate.insert(operLog);
|
|
|
+//
|
|
|
+// return result;
|
|
|
+// }
|
|
|
+//
|
|
|
+// private String getRequestPath(String uri){
|
|
|
+// String hget = redisUtil.hget(RedisKey.MANAGE_MENU, uri);
|
|
|
+// MenuBean menuBean = JSON.parseObject(hget, MenuBean.class);
|
|
|
+// LinkedList<String> menuList = new LinkedList<>();
|
|
|
+// this.getRequestPathHandler(menuList, menuBean);
|
|
|
+// StringBuilder sb = new StringBuilder();
|
|
|
+// menuList.stream().forEach(str->sb.append("->").append(str));
|
|
|
+// return sb.substring(2);
|
|
|
+// }
|
|
|
+//
|
|
|
+// private void getRequestPathHandler(LinkedList list, MenuBean menuBean){
|
|
|
+// list.addFirst("[" + menuBean.getName() + "]");
|
|
|
+// if(Objects.isNull(menuBean.getParent())){
|
|
|
+// return;
|
|
|
+// }
|
|
|
+// this.getRequestPathHandler(list, menuBean.getParent());
|
|
|
+// }
|
|
|
+//
|
|
|
+// private Map<String, Object> getUserInfo(HttpServletRequest request, String uri, Object result){
|
|
|
+// String token = null;
|
|
|
+// boolean isLogin = uri.endsWith("login");
|
|
|
+// if(isLogin){
|
|
|
+// String resultStr = JSON.toJSONString(result);
|
|
|
+// JSONObject jsonObject = JSON.parseObject(resultStr);
|
|
|
+// JSONObject data = jsonObject.getJSONObject("data");
|
|
|
+// token = data.getString("token");
|
|
|
+// }else{
|
|
|
+// token = request.getHeader("token");
|
|
|
+// }
|
|
|
+// Claims claims = JwtUtil.parseJWT(token);
|
|
|
+// Integer userId = (Integer) claims.get("userId");
|
|
|
+// String userName = (String)claims.get("userName");
|
|
|
+// String nickName = (String)claims.get("nickName");
|
|
|
+// Map<String, Object> userInfo = new HashMap<>();
|
|
|
+// userInfo.put("userId", Long.valueOf(userId));
|
|
|
+// userInfo.put("userName", userName);
|
|
|
+// userInfo.put("nickName", nickName);
|
|
|
+// return userInfo;
|
|
|
+// }
|
|
|
+//
|
|
|
+// private String getParams(JoinPoint pjp, HttpServletRequest request){
|
|
|
+//
|
|
|
+// // 获取参数名称
|
|
|
+// String[] parameterNamesArgs = ((MethodSignature) pjp.getSignature()).getParameterNames();
|
|
|
+// //获取请求参数值
|
|
|
+// Object[] args = pjp.getArgs();
|
|
|
+//
|
|
|
+// Map<String, Object> paramMap = new HashMap<>();
|
|
|
+// String contentType = request.getContentType();
|
|
|
+// if(ContentType.JSON.getValue().equals(contentType)){
|
|
|
+//// Arrays.stream(args).forEach(arg->paramMap.putAll((Map)arg));
|
|
|
+// return JSON.toJSONString(args[0]);
|
|
|
+// }else{
|
|
|
+// for (int i = 0; i < args.length; i++) {
|
|
|
+// if(args[i] instanceof MultipartFile){
|
|
|
+// paramMap.put(parameterNamesArgs[i], ((MultipartFile) args[i]).getOriginalFilename());
|
|
|
+// continue;
|
|
|
+// }
|
|
|
+// paramMap.put(parameterNamesArgs[i], args[i]);
|
|
|
+// }
|
|
|
+// }
|
|
|
+// return JSON.toJSONString(paramMap);
|
|
|
+// }
|
|
|
+//
|
|
|
+// private String getBrowser(HttpServletRequest request){
|
|
|
+// String userAgentStr = request.getHeader("User-Agent");
|
|
|
+// UserAgent userAgent = UserAgentUtil.parse(userAgentStr);
|
|
|
+// String browserType = userAgent.getBrowser().toString();
|
|
|
+// String browserVersion = userAgent.getVersion();
|
|
|
+// String browserFormat = "%s(版本%s)";
|
|
|
+// return String.format(browserFormat, browserType, browserVersion);
|
|
|
+// }
|
|
|
+//
|
|
|
+//}
|
|
|
+//
|