瀏覽代碼

feat:接口拦截打印日志

wangzaijun 7 月之前
父節點
當前提交
89aef13d2f

+ 7 - 18
service-base/src/main/java/com/simuwang/shiro/core/jwt/JwtFilter.java

@@ -44,7 +44,7 @@ public class JwtFilter extends AccessControlFilter {
      * onAccessDenied()是没有携带JwtToken的时候进行账号密码登录,登录成功允许访问,登录失败拒绝访问
      * onAccessDenied()是没有携带JwtToken的时候进行账号密码登录,登录成功允许访问,登录失败拒绝访问
      */
      */
     @Override
     @Override
-    protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception {
+    protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) {
         /*
         /*
          * 1. 返回true,shiro就直接允许访问url
          * 1. 返回true,shiro就直接允许访问url
          * 2. 返回false,shiro才会根据onAccessDenied的方法的返回值决定是否允许访问url
          * 2. 返回false,shiro才会根据onAccessDenied的方法的返回值决定是否允许访问url
@@ -53,23 +53,11 @@ public class JwtFilter extends AccessControlFilter {
         return false;
         return false;
     }
     }
 
 
-
-    /**
-     * @param servletRequest
-     * @param servletResponse
-     * @return 返回结果为true表明登录通过
-     * @throws Exception
-     */
     @Override
     @Override
     protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
     protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
-        /*
-         *  跟前端约定将jwtToken放在请求的Header的Authorization中,Authorization:token
-         */
+        // 跟前端约定将jwtToken放在请求的Header的Authorization中,Authorization:token
         HttpServletRequest request = (HttpServletRequest) servletRequest;
         HttpServletRequest request = (HttpServletRequest) servletRequest;
         String requestURI = request.getRequestURI();
         String requestURI = request.getRequestURI();
-        if (this.logger.isInfoEnabled()) {
-            this.logger.info("{} onAccessDenied方法被调用", requestURI);
-        }
         List<String> whitelist = this.properties.getWhitelist();
         List<String> whitelist = this.properties.getWhitelist();
         if (CollUtil.isNotEmpty(whitelist)) {
         if (CollUtil.isNotEmpty(whitelist)) {
             for (String path : whitelist) {
             for (String path : whitelist) {
@@ -83,27 +71,28 @@ public class JwtFilter extends AccessControlFilter {
         }
         }
         String token = request.getHeader(JwtContext.HEADER);
         String token = request.getHeader(JwtContext.HEADER);
         if (StrUtil.isBlank(token)) {
         if (StrUtil.isBlank(token)) {
-            this.onLoginFail(servletResponse, "请先登录后操作");
+            this.onLoginFail(servletResponse, requestURI, "请先登录后操作");
             return false;
             return false;
         }
         }
         Claims claims;
         Claims claims;
         try {
         try {
             claims = this.jwtContext.getClaimsByToken(token);
             claims = this.jwtContext.getClaimsByToken(token);
         } catch (ExpiredJwtException e) {
         } catch (ExpiredJwtException e) {
-            this.onLoginFail(servletResponse, "登录已过期,请重新登录");
+            this.onLoginFail(servletResponse, requestURI, "登录已过期,请重新登录");
             return false;
             return false;
         }
         }
         String username = claims.getSubject();
         String username = claims.getSubject();
         String validToken = this.jwtContext.getUserCache(username);
         String validToken = this.jwtContext.getUserCache(username);
         if (!token.equals(validToken)) {
         if (!token.equals(validToken)) {
-            this.onLoginFail(servletResponse, "token非法");
+            this.onLoginFail(servletResponse, requestURI, "token非法");
             return false;
             return false;
         }
         }
         return true;
         return true;
     }
     }
 
 
     //登录失败要执行的方法
     //登录失败要执行的方法
-    private void onLoginFail(ServletResponse response, String msg) throws IOException {
+    private void onLoginFail(ServletResponse response, String url, String msg) throws IOException {
+        this.logger.warn("接口{} 认证或授权错误:{}", url, msg);
         HttpServletResponse httpServletResponse = (HttpServletResponse) response;
         HttpServletResponse httpServletResponse = (HttpServletResponse) response;
         httpServletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
         httpServletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
         httpServletResponse.setCharacterEncoding("utf-8");
         httpServletResponse.setCharacterEncoding("utf-8");

+ 4 - 0
service-deploy/pom.xml

@@ -19,6 +19,10 @@
             <groupId>org.springframework.boot</groupId>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-undertow</artifactId>
             <artifactId>spring-boot-starter-undertow</artifactId>
         </dependency>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
 
 
         <dependency>
         <dependency>
             <groupId>com.simuwang</groupId>
             <groupId>com.simuwang</groupId>

+ 81 - 0
service-deploy/src/main/java/com/simuwang/deploy/components/ApiAop.java

@@ -0,0 +1,81 @@
+package com.simuwang.deploy.components;
+
+import cn.hutool.core.exceptions.ExceptionUtil;
+import com.smppw.common.pojo.ResultVo;
+import jakarta.servlet.http.HttpServletRequest;
+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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+@Order(1)
+@Aspect
+@Component
+public class ApiAop {
+    private static final String controller = "org.springframework.stereotype.Controller";
+    private static final String deleteMapping = "org.springframework.web.bind.annotation.DeleteMapping";
+    private static final String getMapping = "org.springframework.web.bind.annotation.GetMapping";
+    private static final String patchMapping = "org.springframework.web.bind.annotation.PatchMapping";
+    private static final String postMapping = "org.springframework.web.bind.annotation.PostMapping";
+    private static final String putMapping = "org.springframework.web.bind.annotation.PutMapping";
+    private static final String requestMapping = "org.springframework.web.bind.annotation.RequestMapping";
+    private static final String restController = "org.springframework.web.bind.annotation.RestController";
+    private static final String REQUEST_METHODS = " @annotation(" + getMapping + ") || @annotation(" + postMapping
+            + ") || @annotation(" + requestMapping + ") || @annotation(" + deleteMapping + ") || @annotation("
+            + putMapping + ") || @annotation(" + patchMapping + ") ";
+    private static final String AOP = "(@within(" + restController + ") && (" + REQUEST_METHODS + ")) || (@within("
+            + controller + ") && ( " + REQUEST_METHODS + "))";
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    @Pointcut(AOP)
+    public void pointcut() {
+    }
+
+    @Around("pointcut()")
+    public Object spentTime(ProceedingJoinPoint thisJoinPoint) throws Throwable {
+        ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        HttpServletRequest request = sra.getRequest();
+        String url = request.getServletPath();
+        Object[] args = thisJoinPoint.getArgs();
+        if (this.logger.isInfoEnabled()) {
+            this.logger.info("接口{} 请求参数{} 开始请求", url, getArgsStr(url, args));
+        }
+
+        long start = System.currentTimeMillis();
+        Object obj = thisJoinPoint.proceed(args);
+
+        if (this.logger.isInfoEnabled()) {
+            this.logger.info("接口{} 请求结束,耗时{} ms", url, (System.currentTimeMillis() - start));
+        }
+        if (null == obj) {
+            return ResultVo.ok(null);
+        }
+        return obj;
+    }
+
+    private String getArgsStr(String url, Object[] args) {
+        if (args != null) {
+            StringBuilder str = new StringBuilder();
+            try {
+                for (Object o : args) {
+                    if (o == null) {
+                        continue;
+                    }
+                    String name = o.getClass().getSimpleName();
+                    String data = o.toString();
+                    str.append(", ").append(data).append("(").append(name).append(")");
+                }
+                return str.toString().replaceFirst(",", "");
+            } catch (Exception e) {
+                logger.warn("解析接口{} 参数异常\n{}", url, ExceptionUtil.stacktraceToString(e));
+            }
+        }
+        return null;
+    }
+}

+ 6 - 0
service-deploy/src/main/resources/application.yml

@@ -14,6 +14,12 @@ server:
     include-binding-errors: on_param
     include-binding-errors: on_param
     include-stacktrace: on_param
     include-stacktrace: on_param
 
 
+# 日志配置
+logging:
+  level:
+    com.simuwang.base.mapper: debug
+  config: classpath:logback.xml
+
 spring:
 spring:
   application:
   application:
     name: data-daq
     name: data-daq

+ 11 - 0
service-manage/src/main/java/com/simuwang/manage/dto/UserInfoVO.java

@@ -25,6 +25,17 @@ public class UserInfoVO {
      */
      */
     private UserMenuTreeDTO menuTree;
     private UserMenuTreeDTO menuTree;
 
 
+    public UserInfoVO() {
+    }
+
+    public UserInfoVO(Integer userId, String username, List<UserRoleDTO> roles, UserMenuTreeDTO menuTree) {
+        this();
+        this.userId = userId;
+        this.username = username;
+        this.roles = roles;
+        this.menuTree = menuTree;
+    }
+
     public Integer getUserId() {
     public Integer getUserId() {
         return userId;
         return userId;
     }
     }

+ 29 - 0
service-manage/src/main/java/com/simuwang/manage/dto/UserMenuTreeDTO.java

@@ -1,5 +1,8 @@
 package com.simuwang.manage.dto;
 package com.simuwang.manage.dto;
 
 
+import cn.hutool.core.collection.ListUtil;
+import com.simuwang.base.pojo.dos.SysMenuDO;
+
 import java.util.List;
 import java.util.List;
 
 
 /**
 /**
@@ -22,6 +25,32 @@ public class UserMenuTreeDTO {
 
 
     private List<UserMenuTreeDTO> children;
     private List<UserMenuTreeDTO> children;
 
 
+    public UserMenuTreeDTO() {
+        this.children = ListUtil.list(false);
+    }
+
+    public UserMenuTreeDTO(Integer id, String name, List<UserMenuTreeDTO> children) {
+        this();
+        this.id = id;
+        this.name = name;
+        this.children = children;
+    }
+
+    public UserMenuTreeDTO(SysMenuDO menuDO) {
+        this();
+        this.id = menuDO.getMenuId();
+        this.name = menuDO.getMenuName();
+        this.pid = menuDO.getParentId();
+        this.code = menuDO.getPerms();
+        this.sort = menuDO.getOrderNum();
+        this.path = menuDO.getPath();
+        this.component = menuDO.getComponent();
+        this.query = menuDO.getQuery();
+        this.menuType = menuDO.getMenuType();
+        this.visible = menuDO.getVisible();
+        this.icon = menuDO.getIcon();
+    }
+
     public Integer getId() {
     public Integer getId() {
         return id;
         return id;
     }
     }

+ 12 - 26
service-manage/src/main/java/com/simuwang/manage/service/SystemService.java

@@ -2,7 +2,6 @@ package com.simuwang.manage.service;
 
 
 import com.simuwang.base.pojo.dos.SysMenuDO;
 import com.simuwang.base.pojo.dos.SysMenuDO;
 import com.simuwang.base.pojo.dos.SysRoleDO;
 import com.simuwang.base.pojo.dos.SysRoleDO;
-import com.simuwang.base.pojo.dos.SysUserDO;
 import com.simuwang.base.service.UserAuthService;
 import com.simuwang.base.service.UserAuthService;
 import com.simuwang.base.utils.TreeUtil;
 import com.simuwang.base.utils.TreeUtil;
 import com.simuwang.manage.dto.UserInfoVO;
 import com.simuwang.manage.dto.UserInfoVO;
@@ -28,41 +27,28 @@ public class SystemService {
         this.userAuthService = userAuthService;
         this.userAuthService = userAuthService;
     }
     }
 
 
+    /**
+     * 获取当前用户的权限角色信息
+     *
+     * @return /
+     */
     public UserInfoVO getUserInfo() {
     public UserInfoVO getUserInfo() {
         ShiroUser shiroUser = (ShiroUser) SecurityUtils.getSubject().getPrincipal();
         ShiroUser shiroUser = (ShiroUser) SecurityUtils.getSubject().getPrincipal();
         Integer userId = shiroUser.getUserId();
         Integer userId = shiroUser.getUserId();
         String username = shiroUser.getUsername();
         String username = shiroUser.getUsername();
+        // 用户角色信息转换
         List<SysRoleDO> roleList = this.userAuthService.listUserRoleByUserId(userId);
         List<SysRoleDO> roleList = this.userAuthService.listUserRoleByUserId(userId);
         List<UserRoleDTO> roles = roleList.stream()
         List<UserRoleDTO> roles = roleList.stream()
                 .map(e -> new UserRoleDTO(e.getRoleId(), e.getRoleName(), e.getRoleKey()))
                 .map(e -> new UserRoleDTO(e.getRoleId(), e.getRoleName(), e.getRoleKey()))
                 .distinct().collect(Collectors.toList());
                 .distinct().collect(Collectors.toList());
+        // 用户权限处理
         List<SysMenuDO> menuList = this.userAuthService.listUserMenuByUserId(userId);
         List<SysMenuDO> menuList = this.userAuthService.listUserMenuByUserId(userId);
-        List<UserMenuTreeDTO> tempList = menuList.stream().map(e -> {
-            UserMenuTreeDTO dto = new UserMenuTreeDTO();
-            dto.setId(e.getMenuId());
-            dto.setPid(e.getParentId());
-            dto.setSort(e.getOrderNum());
-            dto.setName(e.getMenuName());
-            dto.setCode(e.getPerms());
-            dto.setMenuType(e.getMenuType());
-            dto.setIcon(e.getIcon());
-            dto.setPath(e.getPath());
-            dto.setComponent(e.getComponent());
-            dto.setVisible(e.getVisible());
-            return dto;
-        }).collect(Collectors.toList());
+        List<UserMenuTreeDTO> tempList = menuList.stream().map(UserMenuTreeDTO::new).collect(Collectors.toList());
+        // 菜单列表转树结构
         List<UserMenuTreeDTO> trees = TreeUtil.list2Tree(tempList, UserMenuTreeDTO::getId, UserMenuTreeDTO::getPid,
         List<UserMenuTreeDTO> trees = TreeUtil.list2Tree(tempList, UserMenuTreeDTO::getId, UserMenuTreeDTO::getPid,
                 UserMenuTreeDTO::getChildren, UserMenuTreeDTO::setChildren, 0);
                 UserMenuTreeDTO::getChildren, UserMenuTreeDTO::setChildren, 0);
-        UserMenuTreeDTO root = new UserMenuTreeDTO();
-        root.setId(0);
-        root.setName("全部菜单");
-        root.setChildren(trees);
-
-        UserInfoVO vo = new UserInfoVO();
-        vo.setUserId(userId);
-        vo.setUsername(username);
-        vo.setRoles(roles);
-        vo.setMenuTree(root);
-        return vo;
+        UserMenuTreeDTO root = new UserMenuTreeDTO(0, "全部菜单", trees);
+        // 返回的数据结构构建
+        return new UserInfoVO(userId, username, roles, root);
     }
     }
 }
 }