了解 Spring Boot 和 React 应用程序中的 CORS 错误
开发 Web 应用程序时使用 反应 对于前端和 春季启动 对于后端,开发人员面临的一个常见问题是臭名昭著的 CORS 错误。当浏览器出于安全原因阻止请求时,尤其是在尝试连接到托管在不同端口或域上的后端服务时,会发生此错误。在这种情况下,您正在处理 CORS 问题,同时进行 获取请求 从 React 到 Spring Boot API。
该错误消息通常表明浏览器阻止了您的请求,因为 访问控制允许来源 标头丢失或配置不正确。值得注意的是,像这样的工具 邮差 不要强制执行这些安全限制,这就是为什么您的请求可能在 Postman 中完美运行,但在浏览器中失败。
在您的场景中,错误消息表明预检请求未通过访问控制检查。当服务器的 CORS 策略中不允许或正确配置某些标头或方法时,通常会发生这种情况。虽然 CORS 配置似乎在服务器端就位,但它处理浏览器请求的方式可能存在特定问题。
本文将帮助您了解问题的根本原因,并指导您找到可能的解决方案来解决问题 CORS错误 在您的 React 和 Spring Boot 应用程序中。
命令 | 使用示例 |
---|---|
@WebMvcConfigurer | 用于配置 Web 设置(例如 CORS、拦截器和格式化程序)的 Spring Boot 注释。在此问题的上下文中,它用于定义允许特定来源和方法的 CORS 映射规则。 |
allowedOrigins() | 此方法是 CORS 配置的一部分,指定允许哪些源访问服务器。在这种情况下,它确保在“http://localhost:8081”上运行的前端可以与后端通信。 |
withCredentials() | 允许跨源请求包含 cookie 和 HTTP 身份验证等凭据的 Axios 配置。在处理需要用户特定数据的安全请求时,这一点至关重要。 |
MockMvcRequestBuilders.options() | Spring Boot 的 MockMvc 框架中的一个方法,用于模拟 HTTP OPTIONS 请求。这通常用于处理 CORS 中的预检请求,在发送实际请求之前检查服务器权限。 |
HttpHeaders.ORIGIN | 此标头在 CORS 中用于指定请求的来源。在跨源场景中,此信息从前端发送到服务器以验证源是否被允许。 |
MockMvcResultMatchers.header() | 这是单元测试中使用的一种方法,用于检查响应中的特定 HTTP 标头。它确保正确返回“Access-Control-Allow-Origin”标头以响应预检请求。 |
Authorization: Bearer | 在 Axios 请求中,此标头会传递 Bearer 令牌以进行身份验证。它确保后端可以验证发出请求的客户端的身份。 |
useEffect() | 在组件渲染后运行的 React Hook。在本例中,它用于触发对后端的 API 调用,在组件安装时获取项目数据。 |
axios.get() | Axios提供的一种发出HTTP GET请求的方法。在此场景中,它用于向 Spring Boot API 发送请求并检索项目数据。 |
处理 React 和 Spring Boot 应用程序中的 CORS 错误
上面提供的脚本旨在解决以下问题 CORS 错误 在 React 前端和 Spring Boot 后端设置中。当托管在“http://localhost:8081”上的前端尝试向托管在“http://localhost:8080”上的 Spring Boot API 发出 GET 请求时,会发生此错误。浏览器执行严格的安全规则来防止未经授权的跨域请求,这就是这些 CORS 策略存在的原因。这 WebMvc配置器 Spring Boot 后端配置中的类有助于定义允许特定来源和方法的 CORS 规则,最终解决问题。
在后端,“CorsConfig.java”文件定义了一个 Spring Boot 配置类。这 @豆 和 @覆盖 注解用于注入和自定义 CORS 配置。在“addCorsMappings()”方法中,“allowedOrigins()”函数显式允许来自“http://localhost:8081”的请求,确保浏览器将此源识别为可信源。包含“allowedMethods()”可确保允许所有 HTTP 方法,包括 GET、POST 和 OPTIONS。这一点至关重要,因为浏览器通常会发送预检 OPTIONS 请求来检查是否允许实际的 GET 请求。
在前端,React 使用以下方式处理请求 阿克西奥斯,一个流行的 HTTP 客户端。在“ProjectPage.tsx”文件的“fetchData”函数中,“axios.get()”函数向 Spring Boot 后端发送 GET 请求。 “withCredentials”选项设置为 true,允许 cookie 和身份验证凭据随请求一起发送。此外,还包含授权标头来传递用户的令牌,确保请求得到正确的身份验证。如果没有这些配置,浏览器将出于安全原因阻止该请求。
最后,单元测试文件“CorsTest.java”验证 CORS 配置是否按预期工作。此测试模拟对后端 API 的 HTTP OPTIONS 请求,该请求模拟浏览器发出的真实预检请求。该测试检查响应是否包含正确的标头,例如 访问控制允许来源,它允许来自前端的跨源请求。 `MockMvcResultMatchers.header()` 方法确保服务器正确响应预检请求。通过包含单元测试,开发人员可以确保其 CORS 配置在各种环境中可靠且功能正常。
通过配置调整解决 React + Spring Boot 中的 CORS 错误
方法一:在后端使用 Spring Boot CORS 配置
// CorsConfig.java
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/")
.allowedOrigins("http://localhost:8081")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.allowCredentials(true);
}
}
在 React 中使用 Axios 通过 Cookie 进行正确的 CORS 处理
方法 2:针对跨源请求的 React 前端 Axios 配置
// ProjectPage.tsx
const ProjectsPage = () => {
const [projectsData, setProjectsData] = useState<ProjectsData[]>([]);
const projectsUrl = 'http://localhost:8080/api/projects/admin/toinspection';
useEffect(() => { fetchData(); }, []);
const fetchData = async () => {
const token = Cookies.get('token');
try {
const response = await axios.get<ProjectsData[]>(projectsUrl, {
headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}` },
withCredentials: true
});
setProjectsData(response.data);
} catch (error) {
console.error("Error fetching projects:", error);
}
};
return (
<div>
<AdminPageTemplate type="projects" children=<AdminModContent data={projectsData} />/>
</div>
);
};
export default ProjectsPage;
在 Spring Boot 中使用单元测试测试 CORS 策略
方法 3:编写单元测试来验证 CORS 策略
// CorsTest.java
@RunWith(SpringRunner.class)
@WebMvcTest
public class CorsTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testCorsHeaders() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.options("/api/projects/admin/toinspection")
.header(HttpHeaders.ORIGIN, "http://localhost:8081")
.header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.header().exists("Access-Control-Allow-Origin"))
.andExpect(MockMvcResultMatchers.header().string("Access-Control-Allow-Origin", "http://localhost:8081"));
}
}
在安全和 API 设计的背景下探索 CORS
当处理 CORS(跨源资源共享) 在现代 Web 应用程序中,了解其背后的安全隐患至关重要。 CORS 是浏览器实施的一项安全措施,旨在防止恶意网站代表用户发出未经授权的 API 请求。这在前端和后端服务之间交换敏感数据(例如身份验证令牌和用户凭据)的场景中尤其重要。在 Spring Boot 后端设置 CORS 时,必须仅允许受信任的来源访问受保护的资源,从而使安全配置成为系统架构的关键要素。
另一个重要方面是处理预检请求,这是浏览器在实际 GET 或 POST 请求之前自动发出的请求。当客户端需要确认服务器是否允许跨域请求并支持特定标头或方法时,就会发生这种情况。在某些情况下,处理这些问题的配置错误 预检请求 可能会导致问题,导致 CORS 错误,即使实际请求在 Postman 等工具中运行良好。使用正确的标头和方法配置 Spring Boot 的“CorsRegistry”可确保正确处理预检请求,从而实现前端和后端之间的平滑交互。
此外,CORS 处理不应该是静态的或一刀切的。在微服务管理等动态环境中,不同的 API 可能有不同的安全要求。某些 API 可能只需要公开某些方法,而其他 API 可能需要对来源进行更严格的控制。这就是微调每个端点的 CORS 配置变得很重要的地方。正确的 CORS 管理还可以通过减少不必要的预检请求并确保流畅的用户交互来帮助优化 API 性能。
有关 React 和 Spring Boot 中 CORS 的常见问题
- 什么是 CORS,为什么需要它?
- CORS 是浏览器强制执行的一种安全机制,用于允许或阻止跨源请求。您需要它来确保只有受信任的来源才能访问您的 API。
- 如何在 Spring Boot 中启用 CORS?
- 在 Spring Boot 中,可以通过配置启用 CORS @WebMvcConfigurer 接口并使用指定允许的来源、方法和标头 allowedOrigins 和 allowedMethods。
- 为什么我的请求在 Postman 中有效,但在浏览器中失败?
- Postman 绕过了 CORS 等浏览器安全策略,但浏览器严格执行它们。确保您的服务器向浏览器发送正确的 CORS 标头。
- 什么是预检请求?
- 预检请求是自动的 OPTIONS 浏览器发送的请求,以检查服务器是否允许实际请求,特别是对于非简单的 HTTP 请求。
- 如何测试我的 CORS 设置?
- 您可以使用以下命令测试您的 CORS 配置 MockMvcRequestBuilders.options() 在单元测试中模拟预检请求并验证服务器响应。
关于 React 和 Spring Boot 中 CORS 的最终想法
解决 CORS 错误 在使用 React 和 Spring Boot 的应用程序中,需要清楚地了解浏览器强制执行的安全策略。通过在 Spring Boot 后端正确配置允许的来源和方法,大多数问题都可以避免。
此外,安全地处理请求中的令牌并确保发送正确的标头将确保前端和后端系统之间的顺利通信。本指南有助于解决开发人员面临的常见挑战,确保跨源请求的安全和功能。
React 和 Spring Boot 中的 CORS 解决方案的来源和参考
- 详细的处理信息 跨域资源共享 Spring Boot 应用程序中的错误可在官方 Spring 文档中找到。 Spring 框架 CORS 文档
- 要了解如何使用 Axios 在 React 应用程序中管理 CORS,可以参考此指南。 axios请求配置
- Baeldung 的这篇文章提供了有关在 Spring Boot 环境中配置 CORS 的见解。 Baeldung - Spring Boot CORS 指南
- Mozilla 开发者网络 (MDN) 全面解释了 CORS 及其在 Web 安全中的重要性。 MDN 网络文档 - CORS