跨域问题
一、概念
1、跨域:
是指浏览器对于javascript的同源策略的限制。换句话说这个就是同源策略的保护机制。
例如a.cn下面的js不能调用b.cn中的js对象或数据(因为a.cn和b.cn是不同域),所以跨域就出现了。
2、同源策略:
是指在JS的Ajax请求协议、IP/域名、端口这三项与浏览器上的url地址完全相同,则满足同源策略,既不会出现跨域问题。
列举一些跨域请求,如下:
演示:http://study.cn/json/jsonp/jsonp.html | ||
请求地址 | 形式 | 结果 |
http://study.cn/test/a.html | 同一域名,不同文件夹 | 成功 |
http://study.cn/json/jsonp/jsonp.html | 同一域名,统一文件夹 | 成功 |
http:// |
不同域名,文件路径相同 | 失败 |
http://study.cn |
同一域名,不同端口 | 失败 |
|
同一域名,不同协议 | 失败 |
二、突破跨域限制的解决方案
1、 跨域源资源共享(CORS):
CORS即Cross Origin Resource Sharing(跨域源资源共享),通俗说就是我们所熟知的跨域请求。众所周知,在以前,跨域可以采用代理、JSONP等方式,而在Modern浏览器面前,这些终将成为过去式,因为有了CORS。
CORS在最初接触的时候只大概了解到,通过服务器端设置Access-Control-Allow-Origin响应头,即可使指定来源像访问同源接口一样访问跨域接口,最近在使用CORS的时候,由于需要传输自定义Header信息,发现原来CORS的规范定义远不止这些。
CORS可以分成两种:
1、简单请求
HEAD、GET、POST
这类简单请求,只需要一次请求,后端响应的head部分携带一下信息就可以通过
Access-Control-Allow-Origin:*
Access-Control-Allow-Methods: HEAD,GET,POST
Access-Control-Max-Age: 3600
Access-Control-Expose-Headers:Origin, X-Requested-With, Content-Type, Accept
当你需要访问额外的信息时,就需要在 Access-Control-Expose-Headers 这一项当中填写并以逗号进行分隔。
2、复杂请求
PUT,PATCH, DELETE, OPTIONS等
这类复杂的跨域问题,表面上看起来和简单请求使用上差不多,但实际上浏览器发送了不止一个请求。
1、首先,发送的是一种OPTIONS的"预请求",单服务端返回"预回应"结果为通过(告诉前端我是否允许你跨域访问某资源)
2、 然后,发送最终想要发送的跨域资源请求。
预请求实际上是对服务端的一种权限请求的询问,只有当预请求通过,前端才会实际发送最终的请求。
这类复杂请求,需要最少一次以上的请求,后端响应的head部分携带一下信息才可以通过。
Access-Control-Allow-Origin:*
Access-Control-Allow-Methods: PUT,PATCH,DELETE,OPTIONS
Access-Control-Max-Age: 3600
Access-Control-Expose-Headers:Origin, X-Requested-With, Content-Type, Accept
同理,当你需要访问额外的信息时,也需要在 Access-Control-Expose-Headers 这一项当中填写并以逗号进行分隔。Allow-Method中添加options和Expose-Headers添加Origin,都是为了后端正确响应"预请求"的。所以一定注意不要遗漏了,否则必然导致复杂跨域请求不成功。
三、跨域问题解决方案
Spring MVC 4.2版本后提供了完善的跨域解决方案,具体实体方式如下:
1、application.xml 添加如下配置
<?xml version="1.0" encoding="UTF-8"?> <mvc:annotation-driven /> <mvc:cors> |
2、web.xml 添加如下配置,作用是开启OPTIONS请求,因为默认SpringMVC是关闭了OPTIONS请求的。
<!-- springMvc --> <servlet> <servlet-name>springMvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>dispatchOptionsRequest</param-name> <param-value>true</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springMvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> |
相关推荐
NULL 博文链接:https://nethub2.iteye.com/blog/2333782
本篇文章主要介绍了详解Spring MVC CORS 跨域 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
本文主要介绍了spring MVC cors跨域实现源码解析。具有很好的参考价值,下面跟着小编一起来看下吧
springmvc跨域处理,和过滤器方式跨域处理的主要代码,整体系统基于springboot框架搭建
就是我的前端和后端是放在不同的服务器上的,然后使用opst请求的时候报错,所以通过查找相关的资料终于解决了,下面这篇文章主要给大家介绍了关于Spring MVC中自带的跨域问题解决方法的相关资料,需要的朋友可以参考...
本文介绍了 CORS 的知识以及如何在 Spring MVC 中配置 CORS,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
跨域问题是我们大家在开发中会经常遇到的一个问题,所以下面这篇文章主要给大家介绍了关于Spring MVC中处理ajax请求的跨域问题与注意事项的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面...
主要介绍了Spring实现处理跨域请求代码详解,具有一定借鉴价值,需要的朋友可以了解下。
spring mvc 实现存文本和多附件同时上传
uploadify的demo,解决spring MVC上传配置冲突。保留springmvc的配置,修改controller中的代码。
1.spring MVC + spring +mybatis,是标准的MVC设计模式,将整个系统划分为显示层,Controller层,Service层,DAO层四层使用Spring MVC负责请求的转发和视图管理spring实现业务对象管理,mybatis作为数据对象的持久...
Jsonp(JSON with Padding)是资料格式 json 的一种“使用模式”,可以让网页从别的网域获取资料。 本资料 是 spring MVC系统中用jsonp进行跨域解析。可实现前后台交互。
主要介绍了详解spring mvc 请求转发和重定向,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Spring MVC + REST + Spring Data JPA + Hibernate 为跨域资源共享(CORS)添加了CORSFilter,从其他服务器访问Service Server。 添加了对 JSON + XML 的响应支持,根据请求类型和接受标头值。
本篇文章主要介绍了详解SpringMVC解决跨域的两种方案,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
利用springMvc 实现的简单的单点登录Demo,内含三个小Mavn项目分别是 1、认证中心SSOServer 2、子系统1SSOClient1 3、子系统2SSOClient2 文章请参考 http://blog.csdn.net/qq_31183297/article/details/79419222
URL 映射、文件上传、JSON 解析、JSR303 验证框架、跨域访问、通用错误处理 2018-2018031401:04-ch04-view 第四章《视图技术》学习源码 Beetl 模版引擎、JSON 技术 2018-2018062501:05-ch05-data 第五章...
主要介绍了Springmvc ajax跨域请求处理方法实例详解,需要的朋友可以参考下
可是我刚刚学会了最基本的 spring-mvc 用法,根本不知道怎么加上 callback 网上到时找到一些可行的代码,差不多这个样子: @RequestMapping(method=RequestMethod.GET,value=getProjectStatusList,produces=text/...
Token避免了Session机制带来的海量信息存储问题,也避免了Cookie机制的一些安全性问题,在现代移动互联网场景、跨域访问等场景有广泛的用途。 也是目前最主流的客户信息的保留方式。 提示:IT是一个要多动手的职业,...