Spring MVC的跨域访问

Posted Do_GH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring MVC的跨域访问相关的知识,希望对你有一定的参考价值。

在默认情况下,浏览器都存在同源策略。同源策略是浏览器的一种自我保护机制,不允许其他域的请求访问当前域,例如:

<script type="text/javascript">
	$(function () {
	    $("#btnGetPerson").click(function () {
	        $.ajax({
	            url : "http://192.168.0.1/restful/findAll",
	            type : "GET",
	            dataType : "JSON",
	            success : function (json) {
	                for (let i = 0; i < json.length; i++) {
	                    var person = json[i];
	                    $("#person").append("<h2>name:" + person.name + ";age:" + person.age + ";birthday:" + person.birthday + "</h2>")
	                }
	            }
	        })
	    });
	});
</script>

若当前的项目运行在本地通过Ajax去请求时会直接请求失败。一般我们所说的相同域指的是协议相同、域名相同、端口相同,若有其中一项不同都会产生跨域访问。

对于一些静态资源例如图片、CSS样式、JS是可以进行跨域访问的

CORS

对于一些复杂的大型项目,需要不同的系统之间互相访问获取资源,因此提出了CORS(跨域源资源共享 Cross-origin resource sharing),它是一份浏览器技术的规范,提供了Web服务从不同网域传来沙盒脚本的方法,以避开浏览器的同源策略

使用注解的形式添加CORS

示例:

@RestController
@RequestMapping("/restful")
@CrossOrigin(origins = {"http://localhost:8080"})
public class RestfulController {
	......
}

通过为类添加@CrossOrigin注解设置origins属性,指定需要访问本项目的域,若为多个可以使用,隔开,该属性支持通配符*若只配为*则所有域都可以访问该控制器。

跨域访问为非简单访问需要检测访问域是否可访问,当每次跨域访问时都先发送预检请求的话较为浪费资源且请求时间较长,所以可以设置maxAge属性,单位为秒。设置后可以保持预检请求的状态,在设置时间内不需要在每次访问时再发送预检请求。

使用配置文件添加CORS

    <mvc:cors>
        <mvc:mapping path="/restful/**"
                     allowed-origins="http://localhost:8080"
                     max-age="3600"/>
    </mvc:cors>

与注解操作相同可以通过配置设置访问的路径、设置允许其他域访问的地址和持久时间

以上是关于Spring MVC的跨域访问的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC 的跨域解决方案

Angular2/Spring Boot 允许 PUT 上的跨域

Spring Security系列教程解决Spring Security环境中的跨域问题

jQuery+ASP.NET MVC基于CORS实现带cookie的跨域ajax请求

#yyds干货盘点#跨域问题之Spring的跨域的方案

Spring Security ——跨域配置