SpringBoot后端解决跨域问题
对于跨域问题从下面四个方面进行描述
1、从什么时候就跨域了?
一个项目的地址是:http://localhost:8183//jiajiawen
另一个项目地址是:http://localhost:8183//jiajiawen
2、什么原因引起的
当第一个项目需要访问第二个项目的就会出现跨域问题。跨域问题主要是源自于浏览器的同源策略。同源即域名,协议,端口**均相同,只要有一个不同,就是跨域
3、解决——CORS
关于跨域问题的解决前端有很多的方法,这里主要描述后端解决跨域问题。
(1)建立两个跨域的项目
建立一个cors-costumer项目,地址是http://localhost:8183//jiajiawen
建立一个cors-provider项目,地址是http://localhost:8182/jiajiawen
(2)cors-costumer访问cors-provider项目
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
window.onload=function () {
// 这里可以测试post,改接口,该请求发送方法
var url="http://localhost:8182/jiajiawen/cors/test3";
var request=new XMLHttpRequest();
request.onload=function () {
if(request.status==200){
displayContent(request.responseText)
}
};
request.open("GET",url);
request.send(null)
}
function displayContent(content) {
var p=document.getElementById("content");
p.innerHTML=content;
}
</script>
</head>
<body>
<div id="content">
</div>
</body>
</html>
(3)cors-provider相应的接口
// @CrossOrigin(value="http://localhost:8183")
@GetMapping("/test3")
public String test3(){
System.out.println("请求到达3");
return "getTest";
}
// @CrossOrigin(value="http://localhost:8183")
@PostMapping("/test4")
public String test4(){
System.out.println("请求到达4");
return "post";
}
在这种情况下,前端无法将请求发送到cors-provider的后端接口上,是因为浏览器的同源策略将请求拦截了!
浏览器提示:
(4)利用@CrossOrigin注解
对于后端接口可以忽视同源问题,只要在方法上添加@CrossOrigin注解,并指明忽视注解的地址即可。
@CrossOrigin(value="http://localhost:8183")
@GetMapping("/test3")
public String test3(){
System.out.println("请求到达3");
return "getTest";
}
正常访问,对于post方法也一样!
(5)在配置类中重写addCorsMappings方法
当全局忽视的时候就可以重写addCorsMappings方法
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:8183")
.allowedMethods("*")
.allowedHeaders("*");
}
}
4、存在的问题
无法避免SRF(Cross-site request forgery)跨站请求伪造