Spring MVC跨资源访问
如果觉得写的还可以,点个赞支持一下笔者呗!你们的点赞和关注会让笔者更新更快哦!!笔者会持续更新关于Java和大数据有关的文章
浏览器的同源策略
- 同源策略阻止从一个域加载的脚本去获取另一个域上的资源
- 只要协议、域名、端口有任何一个不同,都被当作是不同的域
- 浏览器Console看到Access-Control-Allow-Origin就代表跨域了
同源策略示例
源URL |
目标URL |
直接访问? |
htp:/xx.com:8080/test |
不能 |
|
不能 |
||
不能 |
||
不能 |
||
http://localhost |
不能 |
|
可以 |
举个例子:我们把如下文件放到桌面上
再把ajax请求的url路径换至全路径名
直接在桌面上打开html文件
此时和原来的访问路径产生不同源的情况
此时再点击网页的按钮来触发ajax请求时发现并不会响应。
浏览器console出现错误原因
HTML中允许跨域的标签
- <img>显示远程图片
- <script> 加载远程JS
- <link>加载远程CSS
Spring MVC解决跨域访问
注意:这只是在浏览器中解决跨域访问,例如小程序端,app端等则需要另外的设置。
如果只是个别的Controller需要对外提供服务时,跨域注解比较合适。如果是专用于对外提供web API服务,则全局跨域配置更合适。
如果注解和全局都设置,则优先以跨域注解为准。
@CrossOrigin - Controller跨域注解
@CrossOrigin(origins = "*",maxAge = 3600)这种不推荐使用,因为*表示所有http,https协议,端口等都能对此资源进行访问。其中maxAge表示设置预检请求的缓存时间为3600s。(非简单请求(PUT,DELETE)发送前需要发送预检请求,设置缓存时间就表示在缓存时间内如果再次进行非简单请求发送时不会再发送预检请求)
@CrossOrigin(origins = {"http://localhost:8080","http://www.zjc.com"})
这表示http://localhost:8080, http://www.zjc.com发送的跨域访问是被允许的。比如http://localhost:8080/restful
"/restful") (origins= {"http://localhost:8080","http://www.zjc.com"}) (//@CrossOrigin(origins = "*",maxAge = 3600)publicclassRestfulController { }
注意:如果你要跨域访问,同时在你的ajax请求中的url要设置全访问路径。
如下表示ajax从默认的端口的/restful/persons中访问
<mvc:cors> - Spring MVC全局跨域配置
在Spring MVC配置文件中添加如下设置:
其中mapping path="/restful/**" 表示外部可以访问此资源的restful下的所有资源。
<mvc:cors><mvc:mappingpath="/restful/**"allowed-origins="http://localhost:8080,http://www.zjc.com"max-age="3600"/></mvc:cors>