Browse Source

feat: 添加token过期检查

weijianghai 11 months ago
parent
commit
b137e8a003

+ 2 - 0
src/main/java/com/example/config/web/CorsConfig.java

@@ -2,6 +2,7 @@ package com.example.config.web;
 
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
 import org.springframework.web.cors.CorsConfiguration;
 import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
 import org.springframework.web.filter.CorsFilter;
@@ -9,6 +10,7 @@ import org.springframework.web.filter.CorsFilter;
 /**
  * 跨域配置
  */
+@Profile({"test", "dev"})
 @Configuration
 public class CorsConfig {
 

+ 56 - 25
src/main/java/com/example/config/web/RequestLogHandlerInterceptor.java

@@ -82,20 +82,32 @@ public class RequestLogHandlerInterceptor implements HandlerInterceptor {
             token = parameters.get("token");
         }
         log.info("token: {}", token);
-//        if (!StringUtils.hasText(token)) {
-//            return forbidden(response);
-//        }
+        if (!StringUtils.hasText(token)) {
+            return forbidden(response);
+        }
         try {
             String urlDecodeToken = URLDecoder.decode(token, StandardCharsets.UTF_8);
             log.info("urlDecodeToken: {}", urlDecodeToken);
-            String decodeToken = AESUtil.decrypt(urlDecodeToken);
-            log.info("decodeToken: {}", decodeToken);
+            String decryptToken = AESUtil.decrypt(urlDecodeToken);
+            log.info("decryptToken: {}", decryptToken);
             Gson gson = new Gson();
-            Map<String, String> map = gson.fromJson(decodeToken, new TypeToken<Map<String, String>>() {
+            Map<String, String> map = gson.fromJson(decryptToken, new TypeToken<Map<String, String>>() {
             }.getType());
-//            if (!"FINANCE".equals(map.get("APP_ID")) || !StringUtils.hasText(map.get("LOGIN_ID"))) {
-//                return forbidden(response);
-//            }
+            if (!"FINANCE".equals(map.get("APP_ID"))
+                    || !StringUtils.hasText(map.get("LOGIN_ID"))
+                    || !StringUtils.hasText(map.get("TIME_STAMP"))
+                    || !StringUtils.hasText(map.get("EXPIRE_TIME"))
+            ) {
+                return forbidden(response);
+            }
+            LocalDateTime timeStamp = LocalDateTime.parse(map.get("TIME_STAMP"),
+                    DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+            int expireTime = Integer.parseInt(map.get("EXPIRE_TIME"));
+            LocalDateTime expireTimeStamp = timeStamp.plusSeconds(expireTime);
+            // token过期
+            if (now.isAfter(expireTimeStamp)) {
+                return unauthorized(response);
+            }
             Map<String, String> requestParameters = new HashMap<>();
             requestParameters.put("request_parameters", gson.toJson(parameters));
             requestParameters.put("request_body", body);
@@ -107,32 +119,31 @@ public class RequestLogHandlerInterceptor implements HandlerInterceptor {
             requestLogPo.setRequestParameters(gson.toJson(requestParameters));
             requestLogPo.setHeaders(gson.toJson(headers));
             requestLogPo.setAppId(map.get("APP_ID"));
-            setTimeStamp(map, requestLogPo);
             requestLogPo.setToken(urlDecodeToken);
+            requestLogPo.setTimeStamp(timeStamp);
+            requestLogPo.setExpireTime(expireTime);
+            requestLogPo.setExpireTimeStamp(expireTimeStamp);
             requestLogService.offer(requestLogPo);
         } catch (Exception e) {
             log.error("token解密失败: {} {}", token, e.getMessage(), e);
-//            return forbidden(response);
+            return forbidden(response);
         }
         return true;
     }
 
-    private void setTimeStamp(Map<String, String> map, RequestLogPo requestLogPo) {
-        String timeStamp = map.get("TIME_STAMP");
-        if (StringUtils.hasText(timeStamp)) {
-            try {
-                requestLogPo.setTimeStamp(LocalDateTime.parse(map.get("TIME_STAMP"),
-                        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
-            } catch (Exception e) {
-                log.warn("时间戳解析失败: {}", timeStamp);
-            }
-        }
-    }
-
     @Override
     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                                 @Nullable Exception ex) throws Exception {
-        log.info("响应 {}", response.getStatus());
+        if (!MyDispatcherServlet.UN_WRAPPER.contains(request.getRequestURI())) {
+            MyHttpServletResponseWrapper wrapper = (MyHttpServletResponseWrapper) response;
+            String responseString = new String(wrapper.toByteArray());
+//            log.info("响应 {}: {}", wrapper.getStatus(), responseString);
+            // 返回结果打印前500个字符
+            log.info("返回 {}: {}", wrapper.getStatus(),
+                    org.apache.commons.lang3.StringUtils.substring(responseString, 0, 500));
+        } else {
+            log.info("响应 {}", response.getStatus());
+        }
         StopWatch stopWatch = STOP_WATCH_THREAD_LOCAL.get();
         stopWatch.stop();
         log.info("耗时 {} ms", stopWatch.getTotalTimeMillis());
@@ -142,8 +153,28 @@ public class RequestLogHandlerInterceptor implements HandlerInterceptor {
     private boolean forbidden(HttpServletResponse response) throws IOException {
         response.setCharacterEncoding("UTF-8");
         response.setContentType("application/json; charset=utf-8");
-        byte[] bytes = new Gson().toJson(R.error(403, "没有权限访问")).getBytes();
+        String r = new Gson().toJson(R.error(403, "没有权限访问"));
+        byte[] bytes = r.getBytes();
         response.getOutputStream().write(bytes);
+        StopWatch stopWatch = STOP_WATCH_THREAD_LOCAL.get();
+        stopWatch.stop();
+        log.warn("返回 {}: {}", response.getStatus(), r);
+        log.info("耗时 {} ms", stopWatch.getTotalTimeMillis());
+        STOP_WATCH_THREAD_LOCAL.remove();
+        return false;
+    }
+
+    private boolean unauthorized(HttpServletResponse response) throws IOException {
+        response.setCharacterEncoding("UTF-8");
+        response.setContentType("application/json; charset=utf-8");
+        String r = new Gson().toJson(R.error(401, "请刷新页面或重新登录"));
+        byte[] bytes = r.getBytes();
+        response.getOutputStream().write(bytes);
+        StopWatch stopWatch = STOP_WATCH_THREAD_LOCAL.get();
+        stopWatch.stop();
+        log.info("返回 {}: {}", response.getStatus(), r);
+        log.info("耗时 {} ms", stopWatch.getTotalTimeMillis());
+        STOP_WATCH_THREAD_LOCAL.remove();
         return false;
     }
 }

+ 6 - 2
src/main/java/com/example/dao/common/RequestLogDao.java

@@ -24,7 +24,9 @@ request_parameters,
 headers,
 app_id,
 time_stamp,
-token
+token,
+expire_time,
+expire_time_stamp
 )
 values
 <foreach collection="list" item="item" index="index" separator=",">
@@ -37,7 +39,9 @@ values
 #{item.headers},
 #{item.appId},
 #{item.timeStamp},
-#{item.token}
+#{item.token},
+#{item.expireTime},
+#{item.expireTimeStamp}
 )
 </foreach>
 </script>

+ 8 - 0
src/main/java/com/example/entity/common/RequestLogPo.java

@@ -54,4 +54,12 @@ public class RequestLogPo {
      * 访问令牌
      */
     private String token;
+    /**
+     * 过期秒数,从token解密
+     */
+    private Integer expireTime;
+    /**
+     * 过期时间
+     */
+    private LocalDateTime expireTimeStamp;
 }

+ 19 - 5
src/main/java/com/example/service/house/HouseSiteStatService.java

@@ -49,6 +49,9 @@ public class HouseSiteStatService {
         }
         // 查询局址信息
         HouseSitePo houseSitePo = houseSiteStatDao.getHouseSiteBySiteIdAndYearMonth(endYearMonth, siteId);
+        if (houseSitePo == null) {
+            return null;
+        }
         vo.setSiteNum(houseSitePo.getSiteNum());
         vo.setSiteName(houseSitePo.getSiteName());
         vo.setAreaName(houseSitePo.getAreaName());
@@ -96,8 +99,13 @@ public class HouseSiteStatService {
         // 查询房屋维修费累计
         HouseSiteRepairInvestorStatPo houseSiteRepairInvestorStatPo
                 = houseSiteStatDao.getSiteRepairInvestorStat(startYearMonth, endYearMonth, siteId);
-        vo.setBuildingRepairSs(houseSiteRepairInvestorStatPo.getBuildingRepairSs());
-        vo.setBuildingRepairCx(houseSiteRepairInvestorStatPo.getBuildingRepairCx());
+        if (houseSiteRepairInvestorStatPo == null) {
+            vo.setBuildingRepairSs(BigDecimal.ZERO);
+            vo.setBuildingRepairCx(BigDecimal.ZERO);
+        } else {
+            vo.setBuildingRepairSs(houseSiteRepairInvestorStatPo.getBuildingRepairSs());
+            vo.setBuildingRepairCx(houseSiteRepairInvestorStatPo.getBuildingRepairCx());
+        }
         // 查询局址分月维修费
         List<HouseSiteRepairMonthPo> houseSiteRepairMonthPoList
                 = houseSiteStatDao.getHouseSiteRepairMonth(startYearMonth, endYearMonth, siteId);
@@ -114,9 +122,15 @@ public class HouseSiteStatService {
         // 查询局址房屋面积闲置率变化
         HouseSiteBuildingAreaIdleDiffPo houseSiteBuildingAreaIdleDiffPo
                 = houseSiteStatDao.getSiteBuildingAreaIdleDiff(startYearMonth, endYearMonth, siteId);
-        vo.setBuildingAreaIdleRatePast(houseSiteBuildingAreaIdleDiffPo.getBuildingAreaIdleRatePast());
-        vo.setBuildingAreaIdleRateNow(houseSiteBuildingAreaIdleDiffPo.getBuildingAreaIdleRateNow());
-        vo.setBuildingAreaIdleRateDiff(houseSiteBuildingAreaIdleDiffPo.getBuildingAreaIdleRateDiff());
+        if (houseSiteBuildingAreaIdleDiffPo == null) {
+            vo.setBuildingAreaIdleRatePast(BigDecimal.ZERO);
+            vo.setBuildingAreaIdleRateNow(BigDecimal.ZERO);
+            vo.setBuildingAreaIdleRateDiff(BigDecimal.ZERO);
+        } else {
+            vo.setBuildingAreaIdleRatePast(houseSiteBuildingAreaIdleDiffPo.getBuildingAreaIdleRatePast());
+            vo.setBuildingAreaIdleRateNow(houseSiteBuildingAreaIdleDiffPo.getBuildingAreaIdleRateNow());
+            vo.setBuildingAreaIdleRateDiff(houseSiteBuildingAreaIdleDiffPo.getBuildingAreaIdleRateDiff());
+        }
         return vo;
     }
 }

+ 6 - 6
src/main/resources/application-dev.yml

@@ -3,12 +3,12 @@ server:
 spring:
   datasource:
     driver-class-name: org.postgresql.Driver
-    username: postgres
-    password: Test!234
-    url: jdbc:postgresql://192.168.65.128:5432/financialdb
-#    username: finance
-#    password: Finance@unicom23
-#    url: jdbc:postgresql://172.16.107.5:5432/financialdb
+#    username: postgres
+#    password: Test!234
+#    url: jdbc:postgresql://192.168.65.128:5432/financialdb
+    username: finance
+    password: Finance@unicom23
+    url: jdbc:postgresql://172.16.107.5:5432/financialdb
 logging:
   level:
     com: