From 48467740fa3144b073f9b679c3a9764f75e206b1 Mon Sep 17 00:00:00 2001
From: nidapeng <jp@doumee.com>
Date: 星期五, 26 四月 2024 18:25:04 +0800
Subject: [PATCH] 最新版本

---
 server/system_service/src/main/java/com/doumee/core/utils/Constants.java                       |    3 
 server/meeting/meeting_web/src/main/java/com/doumee/api/web/RoomsApi.java                      |   21 ---
 server/system_service/src/main/java/com/doumee/config/cloudfilter/CloudWebConfig.java          |   18 ++
 server/meeting/meeting_service/src/main/java/com/doumee/config/Jwt/WebMvcConfig.java           |    4 
 server/startsh/admin_start.sh                                                                  |    2 
 server/system_gateway/src/main/resources/bootstrap.yml                                         |    1 
 server/meeting/meeting_web/src/main/java/com/doumee/api/web/NoticeApi.java                     |    4 
 server/meeting/meeting_admin/src/main/java/com/doumee/api/cloud/CloudBookingsController.java   |   10 +
 server/meeting/meeting_web/src/main/java/com/doumee/api/web/MeetingApi.java                    |    8 -
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/cloud/CloudCarsController.java        |   13 +
 server/system_gateway/src/main/java/com/doumee/config/swagger/CustomWebFilterConfig.java       |   83 +++++++++++
 server/visits/dmvisit_web/src/main/java/com/doumee/api/web/InternalController.java             |   12 -
 server/system_service/src/main/java/com/doumee/config/cloudfilter/LoginHandlerInterceptor.java |   62 ++++++++
 server/system_service/src/main/java/com/doumee/config/annotation/LoginNoRequired.java          |   10 +
 server/system_gateway/src/main/java/com/doumee/config/GatewayFilterProperties.java             |   14 ++
 server/system_gateway/src/main/java/com/doumee/config/GlobalFilterConfig.java                  |   86 ++++++++++++
 server/system_gateway/src/main/java/com/doumee/config/GlobalErrorFilter.java                   |    1 
 server/system_gateway/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java                    |    7 
 server/visits/dmvisit_web/src/main/java/com/doumee/api/web/VisitorController.java              |    1 
 server/system_gateway/src/main/java/com/doumee/api/meeting/CloudBookingsController.java        |    3 
 server/system_gateway/src/main/resources/application.yml                                       |    7 +
 server/system_gateway/src/main/java/com/doumee/api/JwtAuthController.java                      |    8 
 22 files changed, 317 insertions(+), 61 deletions(-)

diff --git a/server/meeting/meeting_admin/src/main/java/com/doumee/api/cloud/CloudBookingsController.java b/server/meeting/meeting_admin/src/main/java/com/doumee/api/cloud/CloudBookingsController.java
index 13c076a..9195561 100644
--- a/server/meeting/meeting_admin/src/main/java/com/doumee/api/cloud/CloudBookingsController.java
+++ b/server/meeting/meeting_admin/src/main/java/com/doumee/api/cloud/CloudBookingsController.java
@@ -4,6 +4,7 @@
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.doumee.api.BaseController;
+import com.doumee.config.annotation.LoginNoRequired;
 import com.doumee.core.annotation.excel.ExcelExporter;
 import com.doumee.core.annotation.pr.PreventRepeat;
 import com.doumee.core.model.ApiResponse;
@@ -46,7 +47,7 @@
  */
 @Api(tags = "浼氳瀹ら瀹氫俊鎭〃")
 @RestController
-@RequestMapping("/cloud/bookings")
+@RequestMapping("/cloudService/bookings")
 public class CloudBookingsController extends BaseController {
 
     @Autowired
@@ -57,6 +58,13 @@
     public ApiResponse test() {
         return ApiResponse.success("浼氳瀹ゆ祴璇曟垚鍔�");
     }
+
+    @LoginNoRequired
+    @ApiOperation("娴嬭瘯缃戠")
+    @GetMapping("/testNoLogin")
+    public ApiResponse testNoLogin() {
+        return ApiResponse.success("浼氳瀹ょ鐞嗘祴璇曟棤闇�鐧诲綍鎴愬姛");
+    }
     @PreventRepeat
     @ApiOperation("鏂板缓")
     @PostMapping("/create")
diff --git a/server/meeting/meeting_service/src/main/java/com/doumee/config/Jwt/WebMvcConfig.java b/server/meeting/meeting_service/src/main/java/com/doumee/config/Jwt/WebMvcConfig.java
index 7abd7c7..70ad1ce 100644
--- a/server/meeting/meeting_service/src/main/java/com/doumee/config/Jwt/WebMvcConfig.java
+++ b/server/meeting/meeting_service/src/main/java/com/doumee/config/Jwt/WebMvcConfig.java
@@ -8,7 +8,6 @@
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.client.RestTemplate;
 import org.springframework.web.method.HandlerMethod;
@@ -18,9 +17,8 @@
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.lang.reflect.Method;
 
-@Configuration
+//@Configuration
 public class WebMvcConfig implements WebMvcConfigurer {
 
 
diff --git a/server/meeting/meeting_web/src/main/java/com/doumee/api/web/MeetingApi.java b/server/meeting/meeting_web/src/main/java/com/doumee/api/web/MeetingApi.java
index a0070b2..862878c 100644
--- a/server/meeting/meeting_web/src/main/java/com/doumee/api/web/MeetingApi.java
+++ b/server/meeting/meeting_web/src/main/java/com/doumee/api/web/MeetingApi.java
@@ -2,7 +2,6 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.doumee.config.Jwt.JwtTokenUtil;
-import com.doumee.config.annotation.LoginRequired;
 import com.doumee.core.annotation.trace.Trace;
 import com.doumee.core.model.ApiResponse;
 import com.doumee.core.model.PageWrap;
@@ -11,11 +10,9 @@
 import com.doumee.dao.business.model.Bookings;
 import com.doumee.dao.web.request.BookingsRequest;
 import com.doumee.dao.web.request.MeetingPageRequest;
-import com.doumee.dao.web.request.UserPageRequest;
 import com.doumee.dao.web.response.MeetingDetailResponse;
 import com.doumee.dao.web.response.MeetingListResponse;
 import com.doumee.dao.web.response.MonthDataResponse;
-import com.doumee.dao.web.response.UserResponse;
 import com.doumee.service.business.BookingsService;
 import com.doumee.service.system.SystemUserService;
 import io.swagger.annotations.Api;
@@ -52,7 +49,6 @@
     private SystemUserService systemUserService;
 
 
-    @LoginRequired
     @ApiOperation(value = "褰撴湀浼氳琛�", notes = "褰撴湀浼氳琛�")
     @GetMapping("/monthMeeting")
     @ApiImplicitParams({
@@ -73,7 +69,6 @@
         return  ApiResponse.success("鏌ヨ鎴愬姛",monthDataResponseList);
     }
 
-    @LoginRequired
     @ApiOperation("鎴戠殑浼氳鍒楄〃")
     @PostMapping("/myMeetingPage")
     @ApiImplicitParams({
@@ -97,7 +92,6 @@
     }
 
 
-    @LoginRequired
     @ApiOperation("鑾峰彇浼氳寮�闂ㄤ簩缁寸爜")
     @GetMapping("/getQrCode")
     @ApiImplicitParams({
@@ -137,7 +131,6 @@
 */
 
 
-    @LoginRequired
     @ApiOperation("浼氳棰勭害")
     @PostMapping("/reservationMeeting")
     @ApiImplicitParams({
@@ -149,7 +142,6 @@
         return ApiResponse.success("鎿嶄綔鎴愬姛",bookingsService.reservationMeeting(bookingsRequest));
     }
 
-    @LoginRequired
     @ApiOperation("鍙栨秷浼氳棰勭害")
     @GetMapping("/reservationCancel")
     @ApiImplicitParams({
diff --git a/server/meeting/meeting_web/src/main/java/com/doumee/api/web/NoticeApi.java b/server/meeting/meeting_web/src/main/java/com/doumee/api/web/NoticeApi.java
index 1d080df..a3ce84f 100644
--- a/server/meeting/meeting_web/src/main/java/com/doumee/api/web/NoticeApi.java
+++ b/server/meeting/meeting_web/src/main/java/com/doumee/api/web/NoticeApi.java
@@ -1,6 +1,5 @@
 package com.doumee.api.web;
 
-import com.doumee.config.annotation.LoginRequired;
 import com.doumee.core.annotation.trace.Trace;
 import com.doumee.core.model.ApiResponse;
 import com.doumee.core.model.PageData;
@@ -16,7 +15,6 @@
 
 @Api(tags = "娑堟伅閫氱煡淇′笟鍔�")
 @Trace(exclude = true)
-@LoginRequired
 @RestController
 @RequestMapping("/web/notice")
 @Slf4j
@@ -31,7 +29,6 @@
      * @param pageWrap
      * @return
      */
-    @LoginRequired
     @ApiOperation(value = "鏌ヨ鐢ㄦ埛閫氱煡", notes = "灏忕▼搴忕")
     @PostMapping("/findNoticePage")
     public ApiResponse<PageData<Notices>> findNoticePage(@RequestBody PageWrap<Notices> pageWrap){
@@ -57,7 +54,6 @@
     }
 
 
-    @LoginRequired
     @ApiOperation(value = "鏌ヨ閫氱煡璇︽儏", notes = "灏忕▼搴忕")
     @GetMapping("/getNoticeDetail")
     public ApiResponse<Notices> getNoticeDetail(@RequestParam Integer id){
diff --git a/server/meeting/meeting_web/src/main/java/com/doumee/api/web/RoomsApi.java b/server/meeting/meeting_web/src/main/java/com/doumee/api/web/RoomsApi.java
index 7205057..51d8af0 100644
--- a/server/meeting/meeting_web/src/main/java/com/doumee/api/web/RoomsApi.java
+++ b/server/meeting/meeting_web/src/main/java/com/doumee/api/web/RoomsApi.java
@@ -2,42 +2,26 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.doumee.config.Jwt.JwtTokenUtil;
-import com.doumee.config.Jwt.WebMvcConfig;
-import com.doumee.config.annotation.LoginRequired;
 import com.doumee.core.annotation.trace.Trace;
-import com.doumee.core.constants.ResponseStatus;
-import com.doumee.core.exception.BusinessException;
 import com.doumee.core.model.ApiResponse;
 import com.doumee.core.model.PageWrap;
-import com.doumee.core.utils.Constants;
-import com.doumee.core.utils.DateUtil;
 import com.doumee.core.utils.QrCodeUtils;
-import com.doumee.dao.business.model.Bookings;
 import com.doumee.dao.business.model.RoomTime;
-import com.doumee.dao.web.request.MeetingPageRequest;
 import com.doumee.dao.web.request.RoomTimeRequest;
 import com.doumee.dao.web.request.RoomsRequest;
-import com.doumee.dao.web.request.UserPageRequest;
 import com.doumee.dao.web.response.*;
-import com.doumee.service.business.BookingsService;
 import com.doumee.service.business.RoomTimeService;
 import com.doumee.service.business.RoomsService;
-import com.doumee.service.system.SystemUserService;
-import io.jsonwebtoken.JwtException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
-import io.swagger.models.auth.In;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * Created by IntelliJ IDEA.
@@ -59,7 +43,6 @@
     @Autowired
     private RoomTimeService roomTimeService;
 
-    @LoginRequired
     @ApiOperation("鑾峰彇浼氳瀹ゅ紑闂ㄤ簩缁寸爜")
     @GetMapping("/getQrCode")
     @ApiImplicitParams({
@@ -85,7 +68,6 @@
     }
 
 
-    @LoginRequired
     @ApiOperation("浼氳瀹ゅ垪琛�")
     @GetMapping("/roomsList")
     @ApiImplicitParams({
@@ -96,7 +78,6 @@
     }
 
 
-    @LoginRequired
     @ApiOperation("浼氳瀹ゆ椂闂村紑鏀惧垪琛�")
     @PostMapping("/getRoomUseTime")
     @ApiImplicitParams({
@@ -106,7 +87,6 @@
         return ApiResponse.success("鏌ヨ鎴愬姛",roomTimeService.getRoomUseTime(roomTimeRequest));
     }
 
-    @LoginRequired
     @ApiOperation("鎴戠殑浼氳瀹ゅ垪琛�")
     @PostMapping("/myRoomsPage")
     @ApiImplicitParams({
@@ -119,7 +99,6 @@
     }
 
 
-    @LoginRequired
     @ApiOperation("浼氳瀹よ鎯�")
     @GetMapping("/getRoomDetail")
     @ApiImplicitParams({
diff --git a/server/startsh/admin_start.sh b/server/startsh/admin_start.sh
index 5aa90d6..8e5d3ad 100644
--- a/server/startsh/admin_start.sh
+++ b/server/startsh/admin_start.sh
@@ -6,4 +6,4 @@
 log_file_path="/usr/local/jars/log/admin/info.log"
 log_file_error_path="/usr/local/jars/log/admin/error.log"
 
-nohup java -Xms512m -Xmx512m -Xmn512m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=10031 -jar /usr/local/jars/admin_interface.jar >"${log_file_path}" 2>"${log_file_error_path}" &
+nohup java -Xms2048m -Xmx2048m -Xmn2048m -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=1024m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=10031 -jar /usr/local/jars/admin_interface.jar >"${log_file_path}" 2>"${log_file_error_path}" &
diff --git a/server/system_gateway/src/main/java/com/doumee/api/JwtAuthController.java b/server/system_gateway/src/main/java/com/doumee/api/JwtAuthController.java
index 085f6e9..418e6f7 100644
--- a/server/system_gateway/src/main/java/com/doumee/api/JwtAuthController.java
+++ b/server/system_gateway/src/main/java/com/doumee/api/JwtAuthController.java
@@ -1,5 +1,6 @@
 package com.doumee.api;
 
+import com.doumee.config.annotation.LoginNoRequired;
 import com.doumee.config.jwt.JwtProperties;
 import com.doumee.config.jwt.JwtTokenUtil;
 import com.doumee.core.annotation.pr.PreventRepeat;
@@ -7,10 +8,12 @@
 import com.doumee.core.exception.BusinessException;
 import com.doumee.core.model.ApiResponse;
 import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.utils.Constants;
 import com.doumee.dao.system.dto.LoginDTO;
 import com.doumee.service.system.SystemLoginService;
 import com.doumee.service.system.SystemUserService;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.server.reactive.ServerHttpRequest;
@@ -24,7 +27,7 @@
  * JWT鑾峰彇浠ょ墝鍜屽埛鏂颁护鐗屾帴鍙�
  */
 @RestController
-@Api("閴存潈鐧诲綍鎺ュ彛")
+@Api(tags ="閴存潈鐧诲綍鎺ュ彛")
 public class JwtAuthController {
 
     @Resource
@@ -40,6 +43,7 @@
     @PreventRepeat(limit = 10, lockTime = 10000)
     @ApiOperation("鐧诲綍")
     @PostMapping("/login")
+    @LoginNoRequired
     public ApiResponse<String> login (@Validated @RequestBody LoginDTO dto, ServerWebExchange serverWebExchange) {
         try {
             ServerHttpRequest request = serverWebExchange.getRequest();
@@ -78,7 +82,7 @@
      */
     @GetMapping("/getUserInfo")
     @ApiOperation("鑾峰彇褰撳墠鐧婚檰鐢ㄦ埛")
-    public ApiResponse<LoginUserInfo> getUserInfo(@RequestHeader("userToken") String token){
+    public ApiResponse<LoginUserInfo> getUserInfo(@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
         try {
             LoginUserInfo user =jwtTokenUtil.getUserInfoByToken(token);
            if(user !=null){
diff --git a/server/system_gateway/src/main/java/com/doumee/api/meeting/CloudBookingsController.java b/server/system_gateway/src/main/java/com/doumee/api/meeting/CloudBookingsController.java
index fa3de84..5963a9e 100644
--- a/server/system_gateway/src/main/java/com/doumee/api/meeting/CloudBookingsController.java
+++ b/server/system_gateway/src/main/java/com/doumee/api/meeting/CloudBookingsController.java
@@ -1,6 +1,7 @@
 package com.doumee.api.meeting;
 
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModel;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -11,7 +12,7 @@
  */
 @RestController
 @RequestMapping("/gateway")
-@Api("娴嬭瘯鎺ュ彛")
+@Api(tags ="娴嬭瘯鎺ュ彛")
 public class CloudBookingsController  {
 
     @GetMapping("/test")
diff --git a/server/system_gateway/src/main/java/com/doumee/config/GatewayFilterProperties.java b/server/system_gateway/src/main/java/com/doumee/config/GatewayFilterProperties.java
new file mode 100644
index 0000000..4ee4ecb
--- /dev/null
+++ b/server/system_gateway/src/main/java/com/doumee/config/GatewayFilterProperties.java
@@ -0,0 +1,14 @@
+package com.doumee.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.LinkedHashSet;
+
+@Data
+@Component
+@ConfigurationProperties("gateway")
+public class GatewayFilterProperties {
+    private LinkedHashSet<String> skipLoginFilterUrls;
+}
diff --git a/server/system_gateway/src/main/java/com/doumee/config/GlobalErrorFilter.java b/server/system_gateway/src/main/java/com/doumee/config/GlobalErrorFilter.java
index 785748a..240a55b 100644
--- a/server/system_gateway/src/main/java/com/doumee/config/GlobalErrorFilter.java
+++ b/server/system_gateway/src/main/java/com/doumee/config/GlobalErrorFilter.java
@@ -20,6 +20,7 @@
         return chain.filter(exchange).onErrorResume(throwable -> {
             ServerHttpResponse response = exchange.getResponse();
             response.setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);
+
             response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
 
             String errorMessage = "{\"message\": \"" + throwable.getMessage() + "\"}";
diff --git a/server/system_gateway/src/main/java/com/doumee/config/GlobalFilterConfig.java b/server/system_gateway/src/main/java/com/doumee/config/GlobalFilterConfig.java
new file mode 100644
index 0000000..c3e2ea9
--- /dev/null
+++ b/server/system_gateway/src/main/java/com/doumee/config/GlobalFilterConfig.java
@@ -0,0 +1,86 @@
+package com.doumee.config;
+
+import com.doumee.core.utils.Constants;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.stereotype.Component;
+import org.springframework.util.AntPathMatcher;
+import org.springframework.util.PathMatcher;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+import javax.annotation.Resource;
+
+@Order(1)
+@Configuration
+public class GlobalFilterConfig implements GlobalFilter {
+    @Autowired
+    private RedisTemplate<String,Object> stringRedisTemplate;
+
+    @Resource
+    private GatewayFilterProperties notAuthUrlProperties;
+
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+           /* log.info("=================================================");
+            log.info("璁块棶鎺ュ彛涓绘満: {}", exchange.getRequest().getURI().getHost());
+            log.info("璁块棶鎺ュ彛绔彛: {}", exchange.getRequest().getURI().getPort());
+            log.info("璁块棶鎺ュ彛URL: {}", exchange.getRequest().getURI().getPath());
+            log.info("璁块棶鎺ュ彛鍙傛暟: {}", exchange.getRequest().getURI().getRawQuery());*/
+        String  url =exchange.getRequest().getURI().getPath();
+        if(!shouldSkip(url)){
+            String token = exchange.getRequest().getHeaders().getFirst(Constants.HEADER_USER_TOKEN);
+            if (token == null || token.isEmpty()) {
+                return unAuthorize(exchange);
+
+            }
+            String userInfo =(String) stringRedisTemplate.opsForValue().get(Constants.REDIS_TOKEN_KEY + token);
+            if (StringUtils.isBlank(userInfo)) {
+                return unAuthorize(exchange);
+            }
+            //鎶婃柊鐨� exchange鏀惧洖鍒拌繃婊ら摼
+            ServerHttpRequest request = exchange.getRequest().mutate().header(Constants.HEADER_USER_TOKEN, token).build();
+            ServerWebExchange newExchange = exchange.mutate().request(request).build();
+            return chain.filter(newExchange);
+        }
+        return chain.filter(exchange);
+    }
+    /**
+     * 鏂规硶瀹炵幇璇存槑:涓嶉渶瑕佽繃婊ょ殑璺緞
+     * <p>
+     * //     * @param currentUrl 褰撳墠璇锋眰璺緞
+     */
+    private boolean shouldSkip(String currentUrl) {
+        if(notAuthUrlProperties.getSkipLoginFilterUrls() == null || notAuthUrlProperties.getSkipLoginFilterUrls().size() ==0){
+            return  false;
+        }
+        PathMatcher pathMatcher = new AntPathMatcher();
+        for (String skipPath : notAuthUrlProperties.getSkipLoginFilterUrls()) {
+            if (pathMatcher.match(skipPath, currentUrl)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    // 杩斿洖鏈櫥褰曠殑鑷畾涔夐敊璇�
+    private Mono<Void> unAuthorize(ServerWebExchange exchange) {
+        // 璁剧疆閿欒鐘舵�佺爜涓�401
+        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
+        // 璁剧疆杩斿洖鐨勪俊鎭负JSON绫诲瀷
+        exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON);
+        // 鑷畾涔夐敊璇俊鎭�
+        String errorMsg = "{\"error\": \"" + "鐢ㄦ埛鏈櫥褰曟垨鐧诲綍瓒呮椂,璇烽噸鏂扮櫥褰�" + "\"}";
+        // 灏嗚嚜瀹氫箟閿欒鍝嶅簲鍐欏叆鍝嶅簲浣�
+        return exchange.getResponse()
+                .writeWith(Mono.just(exchange.getResponse().bufferFactory().wrap(errorMsg.getBytes())));
+    }
+}
\ No newline at end of file
diff --git a/server/system_gateway/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java b/server/system_gateway/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
index 460b974..1faef7c 100644
--- a/server/system_gateway/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
+++ b/server/system_gateway/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
@@ -2,6 +2,7 @@
 
 import com.alibaba.fastjson.JSONObject;
 import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.utils.Constants;
 import io.jsonwebtoken.Jwts;
 import io.jsonwebtoken.SignatureAlgorithm;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -96,7 +97,7 @@
             claims.setLoginDate(new Date());
             refreshedToken = generateTokenDo(claims);
             if(refreshedToken!=null){
-                redisTemplate.delete(token);//鍒犻櫎鑰佺殑token
+                redisTemplate.delete(Constants.REDIS_TOKEN_KEY+token);//鍒犻櫎鑰佺殑token
             }
         } catch (Exception e) {
             refreshedToken = null;
@@ -131,7 +132,7 @@
                 .setExpiration(expirationDate)
                 .signWith(SignatureAlgorithm.HS512, jwtProperties.getSecret())
                 .compact();
-        redisTemplate.opsForValue().set(token,JSONObject.toJSONString(userInfo),jwtProperties.getExpiration(), TimeUnit.MILLISECONDS);
+        redisTemplate.opsForValue().set(Constants.REDIS_TOKEN_KEY+token,JSONObject.toJSONString(userInfo),jwtProperties.getExpiration(), TimeUnit.MILLISECONDS);
         return token;
     }
 
@@ -144,7 +145,7 @@
     private LoginUserInfo getClaimsFromToken(String token) {
         LoginUserInfo claims;
         try {
-            String userInfo = (String) redisTemplate.opsForValue().get(token);
+            String userInfo = (String) redisTemplate.opsForValue().get(Constants.REDIS_TOKEN_KEY+token);
             claims = JSONObject.toJavaObject(JSONObject.parseObject(userInfo),LoginUserInfo.class);
         } catch (Exception e) {
             claims = null;
diff --git a/server/system_gateway/src/main/java/com/doumee/config/swagger/CustomWebFilterConfig.java b/server/system_gateway/src/main/java/com/doumee/config/swagger/CustomWebFilterConfig.java
new file mode 100644
index 0000000..7f92567
--- /dev/null
+++ b/server/system_gateway/src/main/java/com/doumee/config/swagger/CustomWebFilterConfig.java
@@ -0,0 +1,83 @@
+package com.doumee.config.swagger;
+
+import com.doumee.config.GatewayFilterProperties;
+import com.doumee.core.utils.Constants;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.util.AntPathMatcher;
+import org.springframework.util.PathMatcher;
+import org.springframework.web.server.ServerWebExchange;
+import org.springframework.web.server.WebFilter;
+import reactor.core.publisher.Mono;
+
+import javax.annotation.Resource;
+
+@Configuration
+public class CustomWebFilterConfig {
+    @Autowired
+    private RedisTemplate<String,Object> stringRedisTemplate;
+    @Resource
+    private GatewayFilterProperties notAuthUrlProperties;
+
+    @Bean
+    public WebFilter webFilter() {
+        return (exchange, chain) -> {
+            String  url =exchange.getRequest().getURI().getPath();
+            if(!shouldSkip(url)){
+                String token = exchange.getRequest().getHeaders().getFirst(Constants.HEADER_USER_TOKEN);
+                if (token == null || token.isEmpty()) {
+                    return unAuthorize(exchange);
+
+                }
+                String userInfo =(String) stringRedisTemplate.opsForValue().get(Constants.REDIS_TOKEN_KEY + token);
+                if (StringUtils.isBlank(userInfo)) {
+                    return unAuthorize(exchange);
+                }
+                //鎶婃柊鐨� exchange鏀惧洖鍒拌繃婊ら摼
+                ServerHttpRequest request = exchange.getRequest().mutate().header(Constants.HEADER_USER_TOKEN, token).build();
+                ServerWebExchange newExchange = exchange.mutate().request(request).build();
+                return chain.filter(newExchange);
+            }
+            return chain.filter(exchange);
+        };
+    }
+
+    /**
+     * 鏂规硶瀹炵幇璇存槑:涓嶉渶瑕佽繃婊ょ殑璺緞
+     * <p>
+     * //     * @param currentUrl 褰撳墠璇锋眰璺緞
+     */
+    private boolean shouldSkip(String currentUrl) {
+        if(notAuthUrlProperties.getSkipLoginFilterUrls() == null || notAuthUrlProperties.getSkipLoginFilterUrls().size() ==0){
+            return  false;
+        }
+        PathMatcher pathMatcher = new AntPathMatcher();
+        for (String skipPath : notAuthUrlProperties.getSkipLoginFilterUrls()) {
+            if (pathMatcher.match(skipPath, currentUrl)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    // 杩斿洖鏈櫥褰曠殑鑷畾涔夐敊璇�
+    private Mono<Void> unAuthorize(ServerWebExchange exchange) {
+        // 璁剧疆閿欒鐘舵�佺爜涓�401
+        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
+        // 璁剧疆杩斿洖鐨勪俊鎭负JSON绫诲瀷
+        exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON);
+        // 鑷畾涔夐敊璇俊鎭�
+        String errorMsg = "{\"error\": \"" + "鐢ㄦ埛鏈櫥褰曟垨鐧诲綍瓒呮椂,璇烽噸鏂扮櫥褰�" + "\"}";
+        // 灏嗚嚜瀹氫箟閿欒鍝嶅簲鍐欏叆鍝嶅簲浣�
+        return exchange.getResponse()
+                .writeWith(Mono.just(exchange.getResponse().bufferFactory().wrap(errorMsg.getBytes())));
+    }
+}
+
diff --git a/server/system_gateway/src/main/resources/application.yml b/server/system_gateway/src/main/resources/application.yml
index 9407396..82b4800 100644
--- a/server/system_gateway/src/main/resources/application.yml
+++ b/server/system_gateway/src/main/resources/application.yml
@@ -90,3 +90,10 @@
       timeout: PT3H  #琛ㄧず12灏忔椂
 
 
+gateway:
+  skipLoginFilterUrls:
+    - /meetingAdmin/**
+    - /visitsAdmin/**
+    - /login
+    - /doc.html
+    - /v2/api-docs/**
diff --git a/server/system_gateway/src/main/resources/bootstrap.yml b/server/system_gateway/src/main/resources/bootstrap.yml
index 083a9d5..59e04cc 100644
--- a/server/system_gateway/src/main/resources/bootstrap.yml
+++ b/server/system_gateway/src/main/resources/bootstrap.yml
@@ -52,6 +52,7 @@
       exposure:
         include: "*"
 
+
 knife4j:
   # 鑱氬悎swagger鏂囨。
   gateway:
diff --git a/server/system_service/src/main/java/com/doumee/config/annotation/LoginNoRequired.java b/server/system_service/src/main/java/com/doumee/config/annotation/LoginNoRequired.java
new file mode 100644
index 0000000..5ab3699
--- /dev/null
+++ b/server/system_service/src/main/java/com/doumee/config/annotation/LoginNoRequired.java
@@ -0,0 +1,10 @@
+package com.doumee.config.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({ElementType.METHOD,ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface LoginNoRequired {}
diff --git a/server/system_service/src/main/java/com/doumee/config/cloudfilter/CloudWebConfig.java b/server/system_service/src/main/java/com/doumee/config/cloudfilter/CloudWebConfig.java
new file mode 100644
index 0000000..086e792
--- /dev/null
+++ b/server/system_service/src/main/java/com/doumee/config/cloudfilter/CloudWebConfig.java
@@ -0,0 +1,18 @@
+package com.doumee.config.cloudfilter;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class CloudWebConfig implements WebMvcConfigurer {
+    @Autowired
+    private RedisTemplate<String,Object> stringRedisTemplate;
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(new LoginHandlerInterceptor(stringRedisTemplate))
+                .addPathPatterns("/cloudService/**");
+    }
+}
\ No newline at end of file
diff --git a/server/system_service/src/main/java/com/doumee/config/cloudfilter/LoginHandlerInterceptor.java b/server/system_service/src/main/java/com/doumee/config/cloudfilter/LoginHandlerInterceptor.java
new file mode 100644
index 0000000..bc6bc2f
--- /dev/null
+++ b/server/system_service/src/main/java/com/doumee/config/cloudfilter/LoginHandlerInterceptor.java
@@ -0,0 +1,62 @@
+package com.doumee.config.cloudfilter;
+
+import com.alibaba.fastjson.JSONObject;
+import com.doumee.config.annotation.LoginNoRequired;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.utils.Constants;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class LoginHandlerInterceptor implements HandlerInterceptor {
+
+    private RedisTemplate<String,Object> stringRedisTemplate;
+
+
+    // 鐢变簬璇ョ被鏈氦缁檚pring绠$悊锛屽洜姝や笉鑳戒娇鐢ㄨ嚜鍔ㄨ閰嶇殑鏂瑰紡鑾峰彇RedisTemplate瀵硅薄
+    public LoginHandlerInterceptor(RedisTemplate<String,Object> stringRedisTemplate) {
+        this.stringRedisTemplate = stringRedisTemplate;
+    }
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        HandlerMethod handlerMethod = (HandlerMethod) handler;
+        Class<?> beanType = handlerMethod.getBeanType();
+        if (!beanType.isAnnotationPresent(LoginNoRequired.class) || !handlerMethod.hasMethodAnnotation(LoginNoRequired.class)) {
+            //鑾峰彇token
+            String token = request.getHeader(Constants.HEADER_USER_TOKEN);  // 浠� http 璇锋眰澶翠腑鍙栧嚭 token
+            if (StringUtils.isNotBlank(token)) {
+                checkLogin(request,response);
+            } else {
+                throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"鏈櫥褰�");
+            }
+        }
+        return true;
+    }
+
+    private void checkLogin(HttpServletRequest request, HttpServletResponse response) {
+        String token = request.getHeader(Constants.HEADER_USER_TOKEN);
+        if (token == null || token.isEmpty()) {
+            throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"鏈櫥褰�");
+        }
+        String userinfo =(String) stringRedisTemplate.opsForValue().get(Constants.REDIS_TOKEN_KEY + token);
+        if (StringUtils.isBlank(userinfo)) {
+            throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"鏈櫥褰�");
+        }
+        LoginUserInfo user = JSONObject.toJavaObject(JSONObject.parseObject(userinfo),LoginUserInfo.class );
+        if(user ==null ){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐢ㄦ埛鐧婚檰宸插け鏁堬紝璇烽噸鏂扮櫥闄嗭紒");
+        }
+    }
+
+    //    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+//        UserContext.removeUser();
+    }
+}
\ No newline at end of file
diff --git a/server/system_service/src/main/java/com/doumee/core/utils/Constants.java b/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
index 2c34035..22ab110 100644
--- a/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
+++ b/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -18,7 +18,8 @@
 import java.util.regex.Pattern;
 
 public class Constants {
-
+    public static final String HEADER_USER_TOKEN = "dm_user_token";
+    public static final String REDIS_TOKEN_KEY = "token_";
     public static final String[]  ALL_SPELL_LIST_FIRST = new String[]{"A", "B", "C", "D", "E", "F", "G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
     public static final int ZERO = 0 ;
     public static final int ONE = 1 ;
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/cloud/CloudCarsController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/cloud/CloudCarsController.java
index 5e48302..fc80da1 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/cloud/CloudCarsController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/cloud/CloudCarsController.java
@@ -1,6 +1,7 @@
 package com.doumee.api.cloud;
 
 import com.doumee.api.BaseController;
+import com.doumee.config.annotation.LoginNoRequired;
 import com.doumee.core.annotation.excel.ExcelExporter;
 import com.doumee.core.annotation.pr.PreventRepeat;
 import com.doumee.core.model.ApiResponse;
@@ -25,18 +26,24 @@
  */
 @Api(tags = "杞﹁締鎺ュ彛")
 @RestController
-@RequestMapping("/cloud/cars")
+@RequestMapping("/cloudService/cars")
 public class CloudCarsController extends BaseController {
 
     @Autowired
     private CarsService carsService;
     @Autowired
     private HkSyncVehicleFromHKServiceImpl hkSyncVehicleFromHKService;
-    @PreventRepeat
     @ApiOperation("娴嬭瘯缃戠")
     @GetMapping("/test")
     public ApiResponse test() {
-        return ApiResponse.success("璁垮绠$悊娴嬭瘯鎴愬姛");
+        return ApiResponse.success("璁垮绠$悊娴嬭瘯鎺堟潈鎴愬姛");
+    }
+
+    @LoginNoRequired
+    @ApiOperation("娴嬭瘯缃戠")
+    @GetMapping("/testNoLogin")
+    public ApiResponse testNoLogin() {
+        return ApiResponse.success("璁垮绠$悊娴嬭瘯鏃犻渶鐧诲綍鎴愬姛");
     }
 
     @PreventRepeat
diff --git a/server/visits/dmvisit_web/src/main/java/com/doumee/api/web/InternalController.java b/server/visits/dmvisit_web/src/main/java/com/doumee/api/web/InternalController.java
index f36f20b..f4dff7e 100644
--- a/server/visits/dmvisit_web/src/main/java/com/doumee/api/web/InternalController.java
+++ b/server/visits/dmvisit_web/src/main/java/com/doumee/api/web/InternalController.java
@@ -1,7 +1,5 @@
 package com.doumee.api.web;
 
-import com.alibaba.fastjson.JSONObject;
-import com.doumee.config.annotation.LoginRequired;
 import com.doumee.core.annotation.trace.Trace;
 import com.doumee.core.model.ApiResponse;
 import com.doumee.core.model.PageData;
@@ -20,12 +18,8 @@
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
-
-import javax.validation.Valid;
-import java.util.List;
 
 /**
  * Created by IntelliJ IDEA.
@@ -57,7 +51,6 @@
         return ApiResponse.success("鐧诲綍鎴愬姛",wxAuthorizeVO);
     }
 
-    @LoginRequired
     @ApiOperation(value = "鍐呴儴浜哄憳棣栭〉", notes = "H5")
     @GetMapping("/internalHome")
     @ApiImplicitParams({
@@ -68,7 +61,6 @@
     }
 
 
-    @LoginRequired
     @ApiOperation("浠诲姟涓績")
     @PostMapping("/taskCenter")
     @ApiImplicitParams({
@@ -79,7 +71,6 @@
         return ApiResponse.success(visitsService.taskCenter(pageWrap));
     }
 
-    @LoginRequired
     @ApiOperation("璁垮璁板綍璇︽儏")
     @GetMapping("/visitDetail")
     @ApiImplicitParams({
@@ -91,7 +82,6 @@
     }
 
 
-    @LoginRequired
     @ApiOperation(value = "浜哄憳鍒嗛〉",notes = "鍙嫓璁垮唴閮ㄤ汉鍛�")
     @PostMapping("/memberList")
     @ApiImplicitParams({
@@ -101,7 +91,6 @@
         return ApiResponse.success(memberService.getVisitedMemberList(pageWrap));
     }
 
-    @LoginRequired
     @ApiOperation(value = "璁垮璁板綍鎻愪氦", notes = "鍐呴儴浜哄憳鎻愪氦")
     @PostMapping("/createVisit")
     @ApiImplicitParams({
@@ -112,7 +101,6 @@
         return ApiResponse.success("鏌ヨ鎴愬姛", visitsService.createFk(visits,false));
     }
 
-    @LoginRequired
     @ApiOperation(value = "瀹℃壒娴佽褰曞鎵�", notes = "鍐呴儴浜哄憳")
     @PostMapping("/auditApprove")
     @ApiImplicitParams({
diff --git a/server/visits/dmvisit_web/src/main/java/com/doumee/api/web/VisitorController.java b/server/visits/dmvisit_web/src/main/java/com/doumee/api/web/VisitorController.java
index 92ded6e..2a4a690 100644
--- a/server/visits/dmvisit_web/src/main/java/com/doumee/api/web/VisitorController.java
+++ b/server/visits/dmvisit_web/src/main/java/com/doumee/api/web/VisitorController.java
@@ -1,6 +1,5 @@
 package com.doumee.api.web;
 
-import com.doumee.config.annotation.LoginRequired;
 import com.doumee.core.annotation.trace.Trace;
 import com.doumee.core.model.ApiResponse;
 import com.doumee.core.utils.Constants;

--
Gitblit v1.9.3