TOR网络中Spring后端与Angular前端API调用CORS异常排查求助
TOR环境下Spring+Angular应用的CORS与API调用问题
问题描述
我知道这可能和已有问题类似,也查过相关内容,但还是解决不了。我的架构是Spring Web Java后端给Angular前端提供API服务,已经在Apache2里给Java和Angular配置了代理,TOR配置完成后洋葱地址能正常访问,但API响应出问题了:
- TOR浏览器拦截所有前端API调用
- OPTIONS请求报错:
CORS Allow Origin Not Matching Origin - POST请求报错:
NS_ERROR_DOM_BAD_URI - GET请求返回200状态码,但还是被浏览器拦截,页面加载不了内容
请求头信息
OPTIONS /coin/fees?get=true HTTP/1.1 Host: myonionUrlHere.onion User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:109.0) Gecko/20100101 Firefox/115.0 Accept: */* Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br Access-Control-Request-Method: POST Access-Control-Request-Headers: content-type Origin: null Connection: keep-alive Sec-Fetch-Dest: empty Sec-Fetch-Mode: cors Sec-Fetch-Site: cross-site Pragma: no-cache Cache-Control: no-cache
响应头信息
HTTP/1.1 200 Vary: Origin Vary: Access-Control-Request-Method Vary: Access-Control-Request-Headers Access-Control-Allow-Origin: null Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS Access-Control-Allow-Headers: content-type Access-Control-Expose-Headers: Access-Control-Allow-Origin Access-Control-Allow-Credentials: true Access-Control-Max-Age: 1800 Allow: GET, HEAD, POST, PUT, DELETE, OPTIONS, PATCH Content-Length: 0 Date: Sun, 28 Jan 2024 06:25:56 GMT
问题分析
核心问题是请求头中的Origin: null。这种情况通常发生在前端页面通过file://协议本地加载,而非通过洋葱地址的HTTP协议访问。TOR浏览器对跨域安全限制更严格,即便后端返回Access-Control-Allow-Origin: null,浏览器仍会因为安全策略拦截请求。
解决方案
1. 确保前端通过洋葱地址正常加载
检查Angular前端是否通过http://myonionUrlHere.onion访问,而非本地文件或其他协议。确认Apache2配置正确映射洋葱地址到前端服务,让页面通过洋葱域名的HTTP协议加载,此时Origin会自动设置为洋葱地址,而非null。
2. 调整Spring后端CORS配置
不要硬编码Access-Control-Allow-Origin: null,改为允许洋葱地址的Origin,或动态匹配请求Origin:
静态允许洋葱地址示例
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://myonionUrlHere.onion") // 替换为你的洋葱地址 .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .allowedHeaders("*") .allowCredentials(true) .maxAge(1800); } }
动态匹配Origin示例
@Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedHeader("*"); config.addAllowedMethod("*"); // 允许所有符合洋葱域名模式的Origin,或直接指定你的洋葱地址 config.setAllowedOriginPatterns(Collections.singletonList("*.onion")); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); }
3. 检查Apache2代理配置
确保代理转发时保留Origin请求头,未被修改或移除。示例配置片段:
ProxyPass /api http://localhost:8080/api ProxyPassReverse /api http://localhost:8080/api # 确保Origin头自然传递,不要手动清空 # 若需强制设置,可添加:RequestHeader set Origin "http://myonionUrlHere.onion"
4. 临时调整TOR浏览器安全等级(仅测试用)
若只是临时测试,可降低TOR浏览器安全等级:菜单 → 设置 → 隐私与安全 → 安全等级改为"标准"。但不建议长期使用,优先从根源解决CORS问题。
内容的提问来源于stack exchange,提问作者Gladiator9120
相关产品推荐
相关产品推荐

