关于跨域和同源策略的一点总结

这几天在chrome跑项目的时候遇到了一点问题,如下:

 

接着通过这个错误,引申出了在这次的问题中所要学习的东西:
    1.什么是跨域,什么情况下才会产生跨域呢?
    2.针对跨域有什么样子的解决办法?
    3.同源策略指的是?
    4.针对这次问题是如何产生的?
 
 
针对以上的问题,通过结合网上的资料,完成了下面的答案:
 
1.什么是跨域,什么情况下才会产生跨域呢?
    跨域指的是不同域名之间相互访问。例如我的电脑上有两个服务器192.168.0.11和192.168.0.12,如果第一个服务器上的页面要访问第二个服务器
就叫做跨域,或者http://www.baidu.com  要访问http://www.xxx.com 也是不同的域名,这种也叫跨域,所以无论是协议不同,端口不通,还是域名不同都会产生跨域。
    在java开发项目中,我们讲的跨域一般指的是js中的ajax请求跨域。
 
2.针对跨域如何解决
    1.利用jsonp,ajax请求,dataType为jsonp。首先需要理解,什么事jsonp,与json不同,json是一种数据封装格式,而jsonp应该理解为一种数据的传输模式,就是通过jsonp我们可以从一个域的页面上去取得另一个域页面上的元素。这种形式需要请求在服务端调整为返回callback([json-object])的形式。
    2.通过修改document.domain来跨子域。浏览器都有一个同源策略,其限制之一就是第一种方法中我们说的不能通过ajax的方法去请求不同源中的文档。它的第二个限制是浏览器中不同域的框架之间是不能进行js的交互操作的。有一点是,不同的框架之间是可以直接获取到window对象的,但是无法获取到属性和方法。我们就可以通过document.domain的将互相交互的两个页面都设置成相同的域名。
 
3.同源策略  
    同源策略指的是浏览器的一种规则,他是保障浏览器可以安全运行的功能,只有通过了检查,才允许被执行,所以回到这次项目上的原因,同源策略禁止了某个文件的访问,可是是该文件在跨域的时候由于违反了同源策略的规则而导致的禁止。
 
4.针对于这次的问题,通过chrome的抓包软件发现在访问assests的时候被禁止了,后面发现是配置文件拼写错误导致的,于是关于这次的问题总结出:
    IRIS Workflow System点击这个draw button向connectivity发送请求,这个请求本来是被cas忽视的,由于web.xml配置文件的文件名写错了,导致请求要经过cas,变成跨域请求,结果被驳回,就产生同源策略禁止的问题。
 
所以以下是对这次项目中遇到问题的总结:
关于在IRIS通过draw button打开text mode,在chrome浏览器中会出现error这个问题,错误原因是:
在web.xml CAS bypass配置中,assets 写成了assests,导致assets 中的文件在访问的时候会被CAS 拦截,然后被拦截的文件就会进行跳转,出现跳转到 CAS server 的跨域请求,而chrome 对于跨域访问,是拒绝访问的,浏览器控制台就会出现error。

过程是这样的:
1. IRIS 通过 draw button 向Connectivity 发送请求,Connectivity 返回text mode 的地址。
2. IRIS 在 iframe 打开对应的text mode页面,加载页面需要的js/css等文件,经过CAS 的时候发现assets 这个文件夹里面的文件没有设置成 CAS bypass。
3. CAS 就开始对这些文件进行拦截,跳转到https://cas.noss.pccw.com:8181/… 检查有没有登录过的ticket。
4. 在iframe指向的地址中,二级域名、端口、协议必须与主页面完全相同,否则就算跨域。这里的协议就和IRIS 不一样了,所以这个请求是一个跨域请求.
5. 在chrome中,对于跨域访问,只直接拒绝访问的,然后会在浏览器控制台出现error。

解决方法:
把web.xml 中的assests 改回 assets。
posted @ 2016-04-18 14:51  windy小强  阅读(743)  评论(0编辑  收藏  举报