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

这几天在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。

时间: 2025-01-14 01:01:52

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

Ajax跨域、Json跨域、Socket跨域和Canvas跨域等同源策略限制的解决方法

同源是指同样的协议.域名.port,三者都同样才属于同域.不符合上述定义的请求,则称为跨域. 相信每一个开发者都曾遇到过跨域请求的情况,尽管情况不一样,但问题的本质都能够归为浏览器出于安全考虑下的同源策略的限制. 跨域的情形有非常多,最常见的有Ajax跨域.Socket跨域和Canvas跨域.以下列举一些我们常见的跨域情形下.某些浏览器控制台给出的错误提示: FireFox下的提示: 已阻止交叉源请求:同源策略不同意读取***上的远程资源.能够将资源移动到同样的域名上或者启用 CORS 来解决问

跨域和同源策略

浏览器在全局层面禁止了页面加载或执行与自身来源不同的域的任何脚本.同源策略允许页面从同一个站点加载和执行特定的脚本.浏览器通过对比每一个资源的协议.主机名和端口号来判断资源是否与页面同源.站外其他来源的脚本同页面的交互则被严格限制.跨域资源共享(Cross Origin Resource Sharing,CORS)是一个解决跨域问题的好方法,从而可以使用XHR从不同的源加载数据和资源.幸好,除CORS以外还有几个方法可以用来从外部的数据源将数据加载到应用中.我们将详细介绍其中的两种,第三种只会简

跨域之同源策略 Same-origin policy

同源策略是浏览器中最基本的隔离潜在恶意文件的安全策略,他限制了来自不同源(origin)的文档或脚本之间的相互作用. 何谓同源 在跨域之URL中介绍过一个URL的标准格式如下: 协议类型://服务器地址(必要时需加上端口号)/路径/文件名 对比URL的标准格式,这里的同源就是指: 协议类型相同(protocol) 服务器地址相同(host,也可以叫域名相同) 端口相同(port,一般默认为80) 下面是维基百科上的例子. 假如一个URL为http://www.example.com/dir/pa

Ajax跨域请求 同源策略与Jsonp

同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现.同源策略,它是由Netscape提出的一个著名的安全策略.现在所有支持JavaScript 的浏览器都会使用这个策略.所谓同源是指,域名,协议,端口相同.当一个浏览器的两个tab页中分别打开来 百度和谷歌的页面当浏览器的百度tab页执行一个脚本的时候会检查这个脚本是属于哪个

Django之跨域请求同源策略

同源策略: 首先基于安全的原因,浏览器是存在同源策略这个机制的,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. 而如果我们要跳过这个策略,也就是说非要跨域请求,那么就需要通过JSONP或者CORS来实现了. 一个源的定义 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源. 举个例子: 下表给出了相对http://a.xyz.com/dir/page.html同源检测的示例: URL 结果 原因 http://a.xyz.com/dir2/oth

【AD】【组策略】跨域转移组策略&可导入的组策略

跨域转移组策略&可导入的组策略 环境: AD PDC 均为:  Win2012 R2 客户端:Win7 x64 A 域:xifan.com B 域:abc.com 需求: 将A域的数个组策略,直接导入B域,简化B域组策略设置 操作步骤: 打开A域的PDC主机. 进入控制台-组策略管理-组策略对象: 导出图中所示所有组策略. 以"测试用-登陆脚本"为示例: 右击-备份 依次全部备份. 将其复制到B域abc.com的PDC内 新建数个组策略,命名与组策略完全一致. 右击登录脚本 注

浏览器拦截跨域请求处理方法(已阻止跨源请求:同源策略禁止读取远程资源)

原文地址:http://my.oschina.net/lichaoqiang/blog/317823 在浏览器请求中,出现跨域访问资源的问题,我们肯定会遇到.如果跨域请求被阻止,有可能导致css.js .ajax请求.font字体等资源出现无法正常访问的问题.接下来,就介绍下解决同源策略不允许读取远程资源的问题. 今天就谈下远程字体跨域的问题. 直接了当了说,解决此类问题,最直接的方法就是,就是给被请求的服务器,添加HTTP头响应头,这里提供两种添加HTTP头的方法: 第一种,就是在程序中添加H

利用servlet做转发,实现js跨域解决同源问题

做前端开发,避免不了跨域这个问题,跨域具体什么概念,不赘述,博客里太多.简单说下,我们用js发请求,不管post还是get,如果发请求的对象和当前web页面不在同一域名下,浏览器的同源策略会限制发请求,也就是说,如果单独写个HTML,用js发远程请求,是发布出去的,浏览器会认为这是不安全的,js在这里能做的很有限. 网上看了很多文章,小弟愚钝,只用js一直没解决这个问题,jQuery的Ajax据说可以,但是测试后发现不行,也许是浏览器版本的原因.有种方法是jsonp,但是好像需要服务器支持,我对

day 37 ajax跨域 浏览器同源测略

浏览器的同源策略 允许跨域: script img iframe 不允许跨域: ajax 跨域ajax <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>T1</h1> <input ty