Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

Spring Boot 怎样解决浏览器跨域问题?

先说出你的答案

定义边界、关键机制、一个反例;P8题再补容量、失败与验证。

查看完整题解

参考回答

直接回答

通常配置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 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。