跨域时前后端都会有的一个问题
什么是跨域?
- 一个请求是由协议,域名,端口,三部分组成的,任何一部分缺失,都属于跨域请求。
http://xxxxx:8080/
http: 协议
xxxxx:域名
8080:端口
跨域产生的原因
- 根本的原因是由于浏览器的同源政策
同源政策,百度百科给出了这么一段解释
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
通俗的说就是浏览器为了阻止来自同域名的js脚本和另一个域中的一些响应请求内容的交互。
在这里呢,我使用的是后端方式解决跨域问题:
解决的方式如下:
- 首先在config层下创建一个类 CrosConfig 用来编写跨域配置:
代码如下:
package com.an.server.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 解决跨域问题
*
* @author An
* @date 2022/2/22
*/
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
.allowCredentials(true)
.maxAge(3600)
.allowedHeaders("*");
}
}
然后在运行Spring Boot 项目的时候
就会自动允许跨域请求,但是这样会的搭建不安全
建议使用Nginx反向代理,以及也可以在前端配置跨域请求。
可能会出现配置跨域然后跨域问题还是没有解决
我遇到的问题:
- 在配置了跨域之后POST请求可以成功跨域,但是GET,DELETE等请求依然存在跨域问题,就很邪门,当时人都傻了,后来仔细研究发现,Spring Security框架是拦截跨域的,因为GET,DELETE请求是没有参数的,Security框架的安全机制会防止恶意多次请求。因此默认会被拦截。需要在Security中配置允许跨域。
可能出现的原因:
你的Spring Boot 项目中使用的安全框架是 Spring Security 那么Spring Security安全框架默认是拦截跨域的,因此你的跨域配置可能被Spring Security拦截了。
解决的方法:
在配置Spring Security的时候,复写configure(HttpSecurity http)
方法:
代码如下:
@Override
protected void configure(HttpSecurity http) throws Exception {
// 允许跨域
http.cors().and().csrf().disable();
}
然后重新运行Spring Boot项目!