• 同源策略和解决跨域问题


    一、什么是同源

    1、什么是源

      源(origin)就是协议、域名、端口号。

      以上url的源就是:https://www.cnblogs.com:80

      若地址里面的协议、域名、端口号相同则属于同源

      以下是相对于 http://www.a.com/test/index.html 的同源检测
      • http://www.a.com/dir/page.html ----成功
      • http://www.child.a.com/test/index.html ----失败,域名不同
      • https://www.a.com/test/index.html ----失败,协议不同
      • http://www.a.com:8080/test/index.html ----失败,端口号不同

    2、什么是同源策略 ?

      同源策略是一个浏览器的安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方的资源。所以a.com下的js脚本采用ajax读取b.com里面的文件数据是会报错的。

     • 不受同源策略限制的:

      (1)、页面中的链接。重定向以及表单提交是不受同源策略影响的

      (2)、跨域的引入。但是js不能读写加载内容。如嵌入到页面中的<script src="...">    </script>,<img>,<link>,<iframe>等。


    二、跨域

    1、什么是跨域:

    受同源的影响。不同源的脚本不能操作其他源下的对象。要想操作不同源的对象就要跨域

    2、跨域的实现形式:

    • 降域 document.domain
    同源策略认为域和子域属于不同的域,如:
    child1.a.com 与 a.com,
    child1.a.com 与 child2.a.com,
    xxx.child1.a.com 与 child1.a.com
    两两不同源,可以通过设置 document.damain='a.com',浏览器就会认为它们都是同一个源。想要实现以上任意两个页面之间的通信,两个页面必须都设置documen.damain='a.com'。
    此方式的特点:
    1. 只能在父域名与子域名之间使用,且将 xxx.child1.a.com域名设置为a.com后,不能再设置成child1.a.com。
    2. 存在安全性问题,当一个站点被攻击后,另一个站点会引起安全漏洞。
    3. 这种方法只适用于 Cookie 和 iframe 窗口。

    • JSONP跨域
    JSONP和JSON并没有什么关系!
    JSONP的原理:(举例:a.com/jsonp.html想得到b.com/main.js中的数据)在a.com的jsonp.html里创建一个回调函数xxx,动态添加<script>元素,向服务器发送请求,请求地址后面加上查询字符串,通过callback参数指定回调函数的名字。请求地址为http://b.com/main.js?callback=xxx。在main.js中调用这个回调函数xxx,并且以JSON数据形式作为参数传递,完成回调。我们来看看代码:
    • // a.com/jsonp.html中的代码

     1 function addScriptTag(src) { 
     2var script = document.createElement('script'); 
     3 •    script.setAttribute("type","text/javascript"); 
     4 •    script.src = src; 
     5 •    document.body.appendChild(script);
     6 •    }
     7 •    window.onload = function () { 
     8 •    addScriptTag('http://b.com/main.js?callback=foo');
     9 •    } //window.onload是为了让页面加载完成后再执行
    10function foo(data) { 
    11 •    console.log(data.name+"欢迎您");
    12 •    };

    •//b.com/main.js中的代码
      foo({name:"hl"})

    •JSONP的缺点

    1. 使用这种方法,只要是个网站都可以拿到b.com里的数据,存在安全性问题。需要网站双方商议基础token的身份验证,这里不详述。
    2. 只能是GET,不能POST。
    3. 可能被注入恶意代码,篡改页面内容,可以采用字符串过滤来规避此问题。


    三、其他方法

    1. HTML5的postMessage方法
    2. window.name
    3. location.hash

  • 相关阅读:
    Spring配置文件中关于Shiro的配置
    关于Realm的源码分析
    配置SpringMVC配置
    Shiro的登录验证及授权多Realm情况【基于SpringMVC框架下】
    关于Nginx配置说明
    Hibernate中No row with the given identifier exists问题的原因及解决
    关于Shiro的角色授权
    关于Shiro的认证策略
    关于hibernate的cache总结及并发问题
    Shiro多Realm数据交互实现过程
  • 原文地址:https://www.cnblogs.com/lstcon/p/9847912.html
Copyright © 2020-2023  润新知