Spring Boot 怎样解决浏览器跨域问题?
查看完整题解
参考回答
直接回答
通常配置CORS,明确允许的源、方法、请求头和是否携带凭据,并让预检请求在合适位置处理。跨域是浏览器的同源访问约束,不能靠给服务器接口随便加一个通配头就解决全部问题。携带凭据时不能把allowedOrigins的通配星号当作任意源安全放行方案。
讲清原理
浏览器对某些请求先发OPTIONS预检,服务器说明是否允许,再决定浏览器能否发送或读取后续请求。安全过滤链和CORS处理顺序要配合,预检通常没有业务登录凭据,不能被错误地要求先登录。
可以用MVC全局或局部规则,也可与Security集成;避免互相冲突的重复配置。允许跨域读取不代表请求已被授权,反过来同源请求也仍可能需要CSRF防护。
例子与易错点
只允许实际前端源并测试允许与拒绝的Origin、预检和实际请求。生产源从受控配置提供,示例中的本机端口只是演示,不应直接复制为所有环境白名单。
以下为 Java 21 类成员示例,放入同一外部类中使用,依赖 Boot4.1.2 / Framework7.0.10。固定演示源,仅验证CORS处理器的预检,不代表登录授权已经通过。
static org.springframework.mock.web.MockHttpServletResponse preflight(String origin) throws java.io.IOException {
var config=new org.springframework.web.cors.CorsConfiguration();
config.setAllowedOrigins(java.util.List.of("https://front.example"));
config.setAllowedMethods(java.util.List.of("POST"));
config.setAllowedHeaders(java.util.List.of("Content-Type"));
config.setAllowCredentials(true);
var request=new org.springframework.mock.web.MockHttpServletRequest("OPTIONS","/api/orders");
request.addHeader("Origin",origin);
request.addHeader("Access-Control-Request-Method","POST");
request.addHeader("Access-Control-Request-Headers","Content-Type");
var response=new org.springframework.mock.web.MockHttpServletResponse();
new org.springframework.web.cors.DefaultCorsProcessor().processRequest(config,request,response);
return response;
}
相关题:第 29 题、第 46 题、第 53 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。