跨域

跨域

浏览器的同源策略

跨域资源共享cors

跨域

在html中<a>, <form>, <img>, <script>, <iframe>, <link> 等标签以及 Ajax 都可以指向一个资源地址,当发起请求的域与请求的域不一样的时候就是跨域请求;

同域:协议+域名+端口号均相同

由于浏览器的同源策略,对跨域请求做出限制;

原因:

  • csrf攻击:跨站请求伪造,Cross-site request forgery ,攻击者盗用你的身份(session,cookie),以你的名义发送请求

同源策略

浏览器基本的安全策略

具体实现例子:

  • DOM层面,限制来自不同源的Document对象js对象获取当前对象的读取或设置这些属性
  • Cookie和xmlhttprequest层面的同源策略:禁止Ajax直接发起跨域请求(请求可以发送,结果北浏览器拦截,不展示),同时ajax不能携带域本网站不同源的cookie
  • img,scriptm等带有src属性的标签可以从不同域加载和执行资源

跨域解决方案

  • jSONP:
    • 利用同源策略的非绝对性,与服务端约定号一个回调函数名,服务端接收到请求吼,回传一段js,在js代码中调用约定号的回调函数,并且将参数进行传递,当网页接收到这段js后,就会执行这个回调函数
    • 只支持get请求
  • CORS Cross-Origin Resource Sharing

    • 跨源资源共享:它使用额外的http头来告诉浏览器,让web应用被准许访问来自不同源服务器上的指定的资源

      • 简单请求:在头信息中,增加一个origin字段(表明来自哪个源),服务器根据这个字段决定是否同意这次请求,请求成功回在response中待Access-Control-Allow_origin字段

      • 1
        2
        3
        4
        Access-Control-Allow-Origin: *	
        Access-Control-Allow-Credentials: true 是否允许发送cookie,服务端要同意接收cookie,要发送cookie的话,上面就不能是*,与请求页面一致的域名
        Access-Control-Expose-Headers: FooBar
        Content-Type: text/html; charset=utf-8
      • 非简单请求

    • 比较老的浏览器不支持

    • spring设置CORS(响应头加参数)

      • servlet Filter
      • CrossOrigin
      • 全局cors配置

参考文献

https://www.jianshu.com/p/f880878c1398

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS

https://www.jianshu.com/p/9203e9b14465

###