跨域总结

发生跨域的条件

  1. 浏览器限制
  2. 发出的请求跨域
  3. XHR请求

解决方法

针对上面三个条件的解决方法

  1. 浏览器限制

    可以修改浏览器设置,但是无意义,不能修改所有用户的浏览器设置。

  2. 发出的请求跨域

    • 修改被调用方(返回头,让浏览器支持跨域)
    • 修改调用方(代理服务器转发?)
  3. 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

调用方解决方案

代理服务器

猜你喜欢

转载自my.oschina.net/u/1245414/blog/1799124