一、跨域解释
1、什么是跨域
在前后端分离的应用中,前端代码和后端代码往往是部署在不同的服务器上,而浏览器为了保证用户的安全和隐私,设计了同源策略。同源策略意味着1个网站只能读取同域下的数据,同域指的是协议、域名、端口号三者都相同。当一个站点试图访问另一个站点下不同域的资源时,就会发生跨域(Cross Origin)。跨域一般会导致浏览器拦截请求,不允许跨域请求的执行。
2、为什么需要跨域
考虑一种可能性:对于前后端分离的复杂应用场景下,同一站点的服务端和客户端往往是不同的部署,所以就需要前端向其他服务器发起请求获取数据或其他的服务。例如,前端页面通过AJAX请求获取数据或者图片都需要通过跨域手段访问。
二、SpringBoot跨域方式
1、通过注解方式实现
在方法或类上添加@CrossOrigin注解即可实现跨域
@Controller @RequestMapping("/user") @CrossOrigin(origins = "*", maxAge = 3600) public class UserController { @PostMapping("addUser") public String addUser(@RequestBody User user) { // 添加用户 } }
2、通过配置文件方式实现
在SpringBoot工程的application.properties或application.yml文件中添加以下三个属性配置:
spring.mvc.allow-credentials=true spring.mvc.crossorigin.allowed-headers=* spring.mvc.crossorigin.allowed-methods=GET,POST
说明:
spring.mvc.allow-credentials=true:表示支持跨域cookie,需要配合前端设置withCredentials:true。
spring.mvc.crossorigin.allowed-headers:表示浏览器端需要预配的属性名称,例如X-Requested-With、Content-Type等。
spring.mvc.crossorigin.allowed-methods:表示允许访问接口的HTTP方法,例如GET、POST等。
3、通过WebMvcConfigurer方式实现
创建CorsConfiguration对象并设置属性后,注册到CorsRegistration对象(为了方便在全局配置跨域),最后enable CORS:
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/user/**") .allowedOrigins("*") .allowCredentials(true) .allowedMethods("GET", "POST"); } }
三、SpringBoot跨域的注意事项
1、精确定义allowed-origins
因为*会匹配所有来源,所以尽量精确,写入具体域名或者ip地址,不然很容易遭受CSRF跨站请求伪造的攻击。
2、优先选择前两种方式
避免在配置文件中写太多的跨域配置,尽量选择通过注解和WebMvcConfigurer方式进行跨域配置,这两种方式对单个方法或单个接口配置最方便。
3、前后端请求携带cookie需配置allow-credentials
如果前端在请求时带有cookie值,则需要后端进行允许跨域请求携带cookie,否则会被浏览器拦截。如果没有携带cookie则无需配置。
四、总结
SpringBoot跨域配置的方法有三种,通过注解、配置文件以及WebMvcConfigurer方式实现。合理配置SpringBoot跨域可以提高前后端开发效率和用户体验,并增强应用的安全性。在配置跨域时应注意合理精确定义allowed-origins、优先选择前两种方式、允许跨域请求携带cookie等方法。