发生跨域的条件
- 浏览器限制
- 发出的请求跨域
- XHR请求
解决方法
针对上面三个条件的解决方法
-
浏览器限制
可以修改浏览器设置,但是无意义,不能修改所有用户的浏览器设置。
-
发出的请求跨域
- 修改被调用方(返回头,让浏览器支持跨域)
- 修改调用方(代理服务器转发?)
-
XHR请求
JSON
JSONP
返回js代码,发出的请求时script
将callback值作为函数名返回。"_"参数防止被缓存。
jsonp只支持get请求。
被调用方解决
响应头增加字段,告诉浏览器允许跨域。
服务器端实现
Filter 解决方案
跨域请求,请求头增加了origin 字段
编写filter 增加response 字段
简单请求&非简单请求
预检命令
非简单请求,会有“预检命令”
预检命令会发送 content-type method,看服务器是否支持此类型跨域。
预检命令缓存
####带cookie的跨域
- 当代cookie 时,Acces-Control-Allow-Origin 不能为* 号
- 增加Access-Control-Allow-Credentials:3600
问题:Acces-Control-Allow-Origin 不能为* 那其他跨域怎么办呢?
可以在filter中 获取request的origin字段,然后设置到response的Acces-Control-Allow-Origin 。
nginx配置
- 包括增加 响应头、
- 将origin和自定义header返回
- 处理预检命令OPTIONS
apache配置
略
spring 框架解决方案
@CrossOrigin
调用方解决方案
代理服务器