解决Spring Boot中的跨域请求问题

本文涉及的产品
.cn 域名,1个 12个月
简介: 解决Spring Boot中的跨域请求问题

解决Spring Boot中的跨域请求问题

今天我们来探讨如何解决Spring Boot中的跨域请求问题。跨域请求(CORS)问题是前后端分离开发中常见的一个问题,当浏览器中的前端代码向不同域名的服务器发送请求时,浏览器会阻止请求以保护用户的安全。我们将介绍如何在Spring Boot应用中配置跨域请求,确保前端应用能够正常与后端通信。

1. 什么是跨域请求

跨域请求是指浏览器从一个域名向另一个不同域名发起的HTTP请求。现代浏览器基于安全考虑,会对跨域请求进行限制,这就是所谓的同源策略。跨域资源共享(CORS)是一种W3C标准,它允许服务器明确告诉浏览器允许哪些跨域请求。

2. 跨域请求的基本原理

当浏览器发起跨域请求时,会先发送一个预检请求(OPTIONS),以确定实际请求是否被允许。服务器需要在响应头中设置相关的CORS策略,告诉浏览器允许跨域访问。

3. 在Spring Boot中配置CORS

在Spring Boot中,有几种方法可以配置CORS。我们将介绍如何在控制器级别、全局配置和通过过滤器配置CORS。

3.1 在控制器级别配置CORS

可以在具体的控制器或方法上使用@CrossOrigin注解来配置CORS。

package cn.juwatech.controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
    @CrossOrigin(origins = "http://example.com")
    @GetMapping("/greet")
    public String greet() {
        return "Hello, World!";
    }
}

3.2 全局配置CORS

如果需要全局配置CORS,可以在WebMvcConfigurer中配置。

package cn.juwatech.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig {
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                        .allowedOrigins("http://example.com")
                        .allowedMethods("GET", "POST", "PUT", "DELETE")
                        .allowedHeaders("*")
                        .allowCredentials(true);
            }
        };
    }
}

3.3 通过过滤器配置CORS

可以自定义一个过滤器来配置CORS。

package cn.juwatech.config;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
@Component
public class CORSFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response,
                                    FilterChain filterChain) throws ServletException, IOException {
        response.setHeader("Access-Control-Allow-Origin", "http://example.com");
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            filterChain.doFilter(request, response);
        }
    }
}

4. 处理复杂的CORS请求

有时,我们可能需要处理更复杂的CORS请求,例如允许多个源、指定具体的头部等。我们可以在CorsRegistry中灵活配置。

package cn.juwatech.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig {
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                        .allowedOrigins("http://example.com", "http://anotherdomain.com")
                        .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                        .allowedHeaders("Content-Type", "Authorization")
                        .allowCredentials(true)
                        .maxAge(3600);
            }
        };
    }
}

5. 在Spring Security中配置CORS

如果你的应用使用了Spring Security,还需要在Spring Security配置中允许CORS。

package cn.juwatech.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.session.HttpSessionEventPublisher;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and().csrf().disable()
            .authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .httpBasic();
    }
    @Bean
    public HttpSessionEventPublisher httpSessionEventPublisher() {
        return new HttpSessionEventPublisher();
    }
}

6. 测试CORS配置

配置完成后,可以使用浏览器或者工具(如Postman)测试CORS配置是否正确。确保预检请求(OPTIONS)和实际请求都能够正确返回,并且浏览器不会报CORS错误。

7. 注意事项

在配置CORS时,需要注意安全问题。例如,允许所有源(*)是不安全的,应该尽量限制为可信任的域名。同时,允许的HTTP方法和头部也应该尽量少,以减少潜在的安全风险。

通过正确配置CORS,我们可以确保前后端分离的应用能够正常通信,从而提高开发效率和用户体验。

相关文章
|
16天前
|
安全 Java API
实现跨域请求:Spring Boot后端的解决方案
本文介绍了在Spring Boot中处理跨域请求的三种方法:使用`@CrossOrigin`注解、全局配置以及自定义过滤器。每种方法都适用于不同的场景和需求,帮助开发者灵活地解决跨域问题,确保前后端交互顺畅与安全。
|
5月前
|
缓存 Java 微服务
Spring Boot中的跨域请求处理
Spring Boot中的跨域请求处理
|
前端开发 Java
SpringBoot开发秘籍 - 处理跨域请求CORS
SpringBoot开发秘籍 - 处理跨域请求CORS
92 0
|
前端开发 Java 程序员
CORS跨域资源共享(三):@CrossOrigin/CorsFilter处理跨域请求示例及原理分析【享学Spring MVC】(下)
CORS跨域资源共享(三):@CrossOrigin/CorsFilter处理跨域请求示例及原理分析【享学Spring MVC】(下)
CORS跨域资源共享(三):@CrossOrigin/CorsFilter处理跨域请求示例及原理分析【享学Spring MVC】(下)
|
前端开发 Java Spring
CORS跨域资源共享(三):@CrossOrigin/CorsFilter处理跨域请求示例及原理分析【享学Spring MVC】(中)
CORS跨域资源共享(三):@CrossOrigin/CorsFilter处理跨域请求示例及原理分析【享学Spring MVC】(中)
CORS跨域资源共享(三):@CrossOrigin/CorsFilter处理跨域请求示例及原理分析【享学Spring MVC】(中)
|
XML 前端开发 Java
CORS跨域资源共享(三):@CrossOrigin/CorsFilter处理跨域请求示例及原理分析【享学Spring MVC】(上)
CORS跨域资源共享(三):@CrossOrigin/CorsFilter处理跨域请求示例及原理分析【享学Spring MVC】(上)
CORS跨域资源共享(三):@CrossOrigin/CorsFilter处理跨域请求示例及原理分析【享学Spring MVC】(上)
|
缓存 前端开发 安全
CORS跨域资源共享(一):模拟跨域请求以及结果分析,理解同源策略【享学Spring MVC】(中)
CORS跨域资源共享(一):模拟跨域请求以及结果分析,理解同源策略【享学Spring MVC】(中)
CORS跨域资源共享(一):模拟跨域请求以及结果分析,理解同源策略【享学Spring MVC】(中)
|
JSON 移动开发 前端开发
CORS跨域资源共享(一):模拟跨域请求以及结果分析,理解同源策略【享学Spring MVC】(上)
CORS跨域资源共享(一):模拟跨域请求以及结果分析,理解同源策略【享学Spring MVC】(上)
CORS跨域资源共享(一):模拟跨域请求以及结果分析,理解同源策略【享学Spring MVC】(上)
|
安全 JavaScript 前端开发
Springboot如何优雅的解决ajax+自定义headers的跨域请求
Springboot如何优雅的解决ajax+自定义headers的跨域请求
Springboot如何优雅的解决ajax+自定义headers的跨域请求
|
缓存 前端开发 安全
CORS跨域资源共享(一):模拟跨域请求以及结果分析,理解同源策略【享学Spring MVC】(下)
CORS跨域资源共享(一):模拟跨域请求以及结果分析,理解同源策略【享学Spring MVC】(下)