李学强 5 ay önce
ebeveyn
işleme
f01848a14f

+ 2 - 0
kxs-admin/src/main/resources/application.yml

@@ -41,6 +41,8 @@ gateway:
   #不校验验证码的客户端
   ignore-clients:
     - admin
+  #跨域过滤器 空为全部放行
+  allow-domains:
 
 # swagger 配置
 swagger:

+ 5 - 1
kxs-system/src/main/java/com/kxs/system/biz/config/GatewayConfigProperties.java

@@ -1,6 +1,5 @@
 package com.kxs.system.biz.config;
 
-import com.kxs.system.biz.filter.ValidateCodeGatewayFilter;
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 
@@ -21,4 +20,9 @@ public class GatewayConfigProperties {
 	 */
 	private List<String> ignoreClients;
 
+	/**
+	 * 跨域白名单
+	 */
+	private List<String> allowDomains;
+
 }

+ 19 - 2
kxs-system/src/main/java/com/kxs/system/biz/config/SysConfigAutoConfiguration.java

@@ -2,10 +2,11 @@ package com.kxs.system.biz.config;
 
 import cn.hutool.crypto.symmetric.AES;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.kxs.system.biz.event.SysLogListener;
-import com.kxs.system.biz.filter.RequestDecoderFilter;
 import com.kxs.common.core.constant.SecurityConstants;
 import com.kxs.common.log.config.LxqLogProperties;
+import com.kxs.system.biz.event.SysLogListener;
+import com.kxs.system.biz.filter.GlobalCorsFilter;
+import com.kxs.system.biz.filter.RequestDecoderFilter;
 import com.kxs.system.biz.filter.ValidateCodeGatewayFilter;
 import com.kxs.system.biz.service.SysLogService;
 import lombok.RequiredArgsConstructor;
@@ -38,12 +39,28 @@ public class SysConfigAutoConfiguration {
         return new SysLogListener(sysLogService, logProperties);
     }
 
+    /**
+     * 验证码过滤器
+     */
     @Bean
     public FilterRegistrationBean<ValidateCodeGatewayFilter> imageCodeFilterRegistration(RedisTemplate<String, Object> redisTemplate, ObjectMapper objectMapper) {
 
         FilterRegistrationBean<ValidateCodeGatewayFilter> registration = new FilterRegistrationBean<>();
         registration.setFilter(new ValidateCodeGatewayFilter(redisTemplate, objectMapper, gatewayConfigProperties));
         registration.addUrlPatterns(SecurityConstants.OAUTH_TOKEN_URL);
+        registration.setOrder(Integer.MIN_VALUE + 2);
+        return registration;
+    }
+
+    /**
+     * 跨域过滤器
+     */
+    @Bean
+    public FilterRegistrationBean<GlobalCorsFilter> corsFilterRegistration() {
+
+        FilterRegistrationBean<GlobalCorsFilter> registration = new FilterRegistrationBean<>();
+        registration.setFilter(new GlobalCorsFilter(gatewayConfigProperties));
+        registration.addUrlPatterns("/*");
         registration.setOrder(Integer.MIN_VALUE);
         return registration;
     }

+ 57 - 0
kxs-system/src/main/java/com/kxs/system/biz/filter/GlobalCorsFilter.java

@@ -0,0 +1,57 @@
+package com.kxs.system.biz.filter;
+
+import com.kxs.system.biz.config.GatewayConfigProperties;
+import jakarta.servlet.*;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+
+import java.io.IOException;
+
+/**
+ * @author Apple
+ */
+@RequiredArgsConstructor
+public class GlobalCorsFilter implements Filter {
+
+
+    private final GatewayConfigProperties configProperties;
+
+
+
+
+    @Override
+    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
+            throws IOException, ServletException {
+        HttpServletRequest request = (HttpServletRequest)servletRequest;
+        HttpServletResponse response = (HttpServletResponse)servletResponse;
+
+
+        // 获取客户端原始请求域
+        String origin = request.getHeader("Origin");
+        String originDomain = removeHttp(origin);
+        if(configProperties.getAllowDomains().isEmpty() || configProperties.getAllowDomains().contains(originDomain)){
+            // 在响应对象中,添加CROS协议相关的header属性
+            response.setHeader("Access-Control-Allow-Origin", origin);
+            response.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE,HEAD,PUT,PATCH");
+            response.setHeader("Access-Control-Max-Age", "3600");
+            response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept,Authorization,authorization");
+            response.setHeader("Access-Control-Allow-Credentials","true");
+        }
+        if ("OPTIONS".equalsIgnoreCase((request).getMethod())) {
+            response.setStatus(HttpServletResponse.SC_OK);
+            return;
+        }
+        //继续往下传递
+        filterChain.doFilter(servletRequest, servletResponse);
+    }
+
+
+    /**
+     * 移除http协议头部
+     */
+    public static String removeHttp(String url){
+        return url.replace("http://", "").replace("https://", "");
+    }
+
+}