123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- package com.fdkankan.manage.aop;
- import cn.dev33.satoken.stp.StpUtil;
- 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.constant.ServerCode;
- import com.fdkankan.common.util.SecurityUtil;
- import com.fdkankan.manage.config.SaTokenConfigure;
- import com.fdkankan.manage.entity.SysLog;
- import com.fdkankan.manage.entity.SysUser;
- import com.fdkankan.manage.service.ISysLogService;
- import com.fdkankan.manage.service.ISysUserService;
- import com.fdkankan.manage.util.RsaUtils;
- import com.fdkankan.redis.util.RedisUtil;
- 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.http.HttpInputMessage;
- import org.springframework.stereotype.Component;
- import org.springframework.util.ObjectUtils;
- import org.springframework.util.StringUtils;
- import org.springframework.web.context.request.RequestContextHolder;
- import org.springframework.web.context.request.ServletRequestAttributes;
- import org.springframework.web.multipart.MultipartFile;
- import javax.servlet.http.HttpServletRequest;
- import java.util.*;
- @Component
- @Aspect
- @Slf4j
- public class VisitLogInterceptor {
- @Autowired
- ISysLogService sysLogService;
- @Autowired
- private ISysUserService userService;
- @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 requestPath = this.getRequestPath(uri);
- if(uri.contains("inner")){
- Object[] args = pjp.getArgs();
- String param = args[0] .toString();
- saveLog(null,"inner-api","inner-api","api调用",uri,method,param,clientIP,browser,"操作成功");
- return pjp.proceed();
- }
- //获取参数
- String params = this.getParams(pjp, request);
- //放行
- Object result = pjp.proceed();
- // if("GET".equals(method)){
- // return result;
- // }
- String msg = null;
- if(!ObjectUtils.isEmpty(result)){
- msg = JSON.toJSONString(result);
- }
- //获取用户信息 如果已登录,从token中获取用户信息,如果是登录接口,查询数据库获取用户信息
- Long userId =null;
- String userName =null;
- String nickName =null;
- try {
- userId = Long.valueOf(StpUtil.getExtra("userId").toString());
- userName = (String)StpUtil.getExtra("userName");
- nickName = (String)StpUtil.getExtra("nickName");
- }catch (Exception e){
- log.info("visitLog-error:{},{}",params,e);
- try {
- JSONObject paramObj = JSONObject.parseObject(params);
- userName = paramObj.getString("userName");
- SysUser sysUser = userService.getByUserName(userName);
- if(sysUser != null){
- userId = sysUser.getId();
- nickName = sysUser.getNickName();
- }
- }catch (Exception e1){
- }
- }
- //写入mongodb
- saveLog(userId,userName,nickName,requestPath,uri,method,params,clientIP,browser,"操作成功");
- return result;
- }
- private void saveLog(Long userId,String userName,String nickName,String requestPath,String uri,String method,String params,String clientIP,String browser,String msg){
- SysLog operLog = new SysLog();
- 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());
- operLog.setResult(msg);
- operLog.setOperationType("manage");
- sysLogService.save(operLog);
- }
- private String getRequestPath(String uri) {
- if(uri.contains("/login")){
- return "登录";
- }
- JSONObject jsonObject = SaTokenConfigure.manageMenuUrl.get(uri);
- if(StringUtils.isEmpty(jsonObject)){
- return null;
- }
- List<String> list = new ArrayList<>();
- getMenuName(list,jsonObject.getString("id"));
- Collections.reverse(list);
- StringBuilder requestPath = new StringBuilder();
- for (String path : list) {
- requestPath.append("[").append(path).append("]").append("->");
- }
- int i = requestPath.lastIndexOf("->");
- if(i < 0){
- return requestPath.toString();
- }
- return requestPath.substring(0,i);
- }
- private int getMenuName( List<String> list,String menuId){
- JSONObject jsonObject = SaTokenConfigure.manageMenuId.get(menuId);
- if(org.springframework.util.StringUtils.isEmpty(jsonObject)){
- return -1;
- }
- list.add( jsonObject.getString("name"));
- String parentId = jsonObject.getString("parentId");
- if(!StringUtils.isEmpty(parentId)){
- return getMenuName(list,parentId);
- }
- return 1;
- }
- private String getParams(JoinPoint pjp, HttpServletRequest request){
- try {
- // 获取参数名称
- String[] parameterNamesArgs = ((MethodSignature) pjp.getSignature()).getParameterNames();
- //获取请求参数值
- Object[] args = pjp.getArgs();
- Map<String, Object> paramMap = new HashMap<>();
- String contentType = request.getContentType();
- if(StringUtils.isEmpty(contentType)){
- return null;
- }
- if(ContentType.JSON.getValue().equals(contentType)){
- String param = args[0] .toString();
- return JSON.toJSONString(param);
- }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);
- }catch (Exception e){
- e.printStackTrace();
- }
- return null;
- }
- 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);
- }
- }
|