zhizhijie
2026-09-20 b80bb7253a87931fea5a1a788fc4c6ffb204d245
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package com.trafficaudit.common.config;
 
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
 
import java.util.Arrays;
import java.util.List;
 
/**
 * 跨域配置:只允许配置中列出的来源(支持 * 通配)访问接口。
 * 浏览器发起 POST/PUT/DELETE 时会带 Origin 头(GET 不带),因此用局域网 IP 打开页面时,
 * 若该来源不在放行列表内会被 CorsFilter 判为非法并返回 403,表现为登录时提示“网络错误”。
 * 默认放行本机与内网网段的任意端口(本地开发、局域网访问、IP 方式访问 8090 同源部署都覆盖)。
 * 注意:不开启 allowCredentials(接口用 Bearer 令牌鉴权,不依赖 Cookie),避免任意站点携带凭证调用。
 */
@Configuration
public class CorsConfig {
 
    @Value("${app.cors.allowed-origins:http://localhost:*,http://127.0.0.1:*,http://192.168.*:*,http://10.*:*,http://172.*:*}")
    private String allowedOrigins;
 
    private List<String> originList() {
        return Arrays.asList(allowedOrigins.split(","));
    }
 
    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowedOriginPatterns(originList());
        config.setAllowedHeaders(Arrays.asList("Authorization", "Content-Type", "Accept", "X-Requested-With"));
        config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS"));
        config.setAllowCredentials(false);
        config.setMaxAge(3600L);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        return source;
    }
 
    @Bean
    public CorsFilter corsFilter() {
        return new CorsFilter(corsConfigurationSource());
    }
}