关于跨域的解决方案 & Cookie
./Google\ Chrome --disable-web-security
在chrome快捷方式,目标里如下设置
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security
window.xdomain && xdomain.slaves 跨域解决方案:
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept, language, uniIdentifier"
什么是跨域?
简单的来说,出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,即“同源策略”。而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通信的效果。
具体策略限制情况可看下表:
| URL | 说明 | 允许通信 |
| http://www.a.com/a.js http://www.a.com/b.js |
同一域名下 | 允许 |
| http://www.a.com/lab/a.js http://www.a.com/script/b.js |
同一域名下不同文件夹 | 允许 |
| http://www.a.com:8000/a.js http://www.a.com/b.js |
同一域名,不同端口 | 不允许 |
| http://www.a.com/a.js https://www.a.com/b.js |
同一域名,不同协议 | 不允许 |
| http://www.a.com/a.js http://127.0.0.100/b.js |
域名和域名对应ip | 不允许 |
| http://www.a.com/a.js http://script.a.com/b.js |
主域相同,子域不同 | 不允许 |
| http://www.a.com/a.js http://a.com/b.js |
同一域名,不同二级域名(同上) | 不允许 |
| http://www.a.com/a.js http://www.b.com/b.js |
不同域名 | 不允许 |
CORS 跨域:
Apache Configure CORS Headers for Whitelist Domains
<IfModule mod_headers.c> SetEnvIfNoCase Origin "https?://(www\.)?(domain\.com|staging\.domain\.com)(:\d+)?$" ACAO=$0 Header set Access-Control-Allow-Origin %{ACAO}e env=ACAO </IfModule>
* http://domain.com
* https://domain.com
* http://www.domain.com
* https://www.domain.com
* http://staging.domain.com
* https://staging.domain.com
* http://www.staging.domain.com
* https://www.staging.domain.com
// cross domain for test env.
101.*.*.253 domain.com
172.18.64.34 www.domain.com
访问:[OK]
http://domain.com/s/wl/web/402/page/help/crossDomain.html?upenv=2
http://www.domain.com:36080/s/wl/web/402/page/help/crossDomain.html?upenv=2
PS:
Here's a good Article about your Question: http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/
If that's not good enough or doesn't work either you need a Proxy like this:https://raw.github.com/cowboy/php-simple-proxy/master/ba-simple-proxy.php
Then you can call the Proxy with Parameters like: http://www.example.com/ba-simple-proxy.php?url=https://api.example.com
http://stackoverflow.com/questions/9631155/specify-multiple-subdomains-with-access-control-origin
--------------------------------------------------------------------
本文目录:
1. Cookie 来由
2. Cookie 用途
3. 生命周期
4. Cookie 工作机制
5. Cookie 操作方法
6. Cookie几种读取区别
7. Cookie 跨域
1. Cookie 来由
进入互联网时代,大部分的应用都基于互联网,采用B/S模式或者B/S与C/S结合的方式处理。但是http协议是无状态的协议,一个应用可能需要记录用户的登录状态、操作行为等等,那么就需要一个令牌一样的东西,记录客户端机器的相应的数据,因而Cookie诞生了。
2. Cookie 用途
Cookie 是浏览器提供的一种机制, cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。在机器上体现为一个文本文件,cookie机制将信息以一个文本文件形式存储于用户硬盘,因此可以作为全局变量,这是它最大的一个优点。它可以用于以下几种场合。
1. 保留用户的登录状态
2. 跟踪用户的行为,进行相应的统计分析
3. 定制用户的应用界面
等等,Cookie使用场合太多了。在当前的互联网应用中,如果禁用了Cookie,那是不可想象的,几乎是寸步难行。
3. 生命周期
Cookie 变量虽然存放在Client 端机器上,却也不是永远不会消失的。可以通过Cookie 的过期时间来处理(以Java为例)。过期的时间类型为Int型值,
-1:表示本session有效,即在本浏览器打开的周期内有效,浏览器关闭后Cookie也被删除
>=0: 表示Cookie的有效器,以秒为单位设置cookie 最大的有效时间,明确值指定cookie 将在多少秒过后失效。注意,这个值是cookie 有效期满的最大值,不是当前cookie 的存在时间。
4. Cookie 工作机制
Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件 内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,对于 JSP而言也可以直接写入jsessionid,这样服务器可以知道该用户是否合法用户以及是否需要重新登录等。
其处理的步骤为:
步骤一:在服务器端创建Cookie(客户端也是可以的,在服务端创建安全性高,这里以E网打进为例)
我们创建了一个名字为 COOKIE_EUP_TMP 的Cookie来包含访问者的信息,创建Cookie时设置:
- Cookie cookie = new Cookie("COOKIE_EUP_TMP", "cookieValue");
- cookie.setDomain("cn.alisoft.com");
- cookie.setPath("/");
- cookie.setMaxAge(-1);
- this.getResponse().addCookie(cookie);
注意: 在实际传递过程中这个Cookie的值是经过了URLEncode方法的URL编码操作的。 这个含有Cookie值的HTTP Header被保存到浏览器的Cookie文件后,Header就通知浏览器将Cookie通过请求以忽略路径的方式返回到服务器,
完成浏览器的认证操作。
此外,我们使用了Cookie的一些属性来限定该Cookie的使用。例如:
Domain属性:能够在浏览器端对Cookie发送进行限定,具体到上面的例子,该Cookie只能传达室到指定的服务器上,而决不会跑到其他的如www.hp.com的Web站点上去。
Expires属性:则指定了该Cookie保存的时间期限,例如上面的Cookie在浏览器上只保存到1999年3月1日1秒。当然,如果浏览器上Cookie 太多,超过了系统所允许的范围,浏览器将自动对它进行删除。
Path属性:用来指定Cookie将被发送到服务器的哪一个目录路径下。
说明:浏览器创建了一个Cookie后,对于每一个针对该网站的请求,都会在Header中带着这个Cookie;不过,对于其他网站的请求Cookie是绝对不会跟着发送的。而且浏览器会这样一直发送,直到Cookie过期为止。
5. Cookie 操作方法
java的写Cookie的方法:
- Cookie cookie = new Cookie("COOKIE_EUP_TMP", "cookieValue");
- cookie.setDomain("cn.alisoft.com");
- cookie.setPath("/");
- cookie.setMaxAge(-1);
- this.getResponse().addCookie(cookie);
删除Cookie的方法:
指定 maxAge = 0 即可
PS:在实际的使用中,Cookie值需要经过加密进行处理的,而且不能存储过多的数据,否则会影响页面的浏览速度。在web应用中,一般把静态资源(JS,CSS,IMAGE)等资源和web应用的域名分开来处理,那么静态资源就不会带有Cookie,能极大的提高Web应用的浏览速度。
6. Cookie几种读取区别
下面以cn.alisoft.com域名为例,用几个域名来验证test.cn.alisoft.com,cn.alisoft.com,alisoft.com三个父子域名的读取区别:
步骤一、在域cn.alisoft.com 写入名称为:COOKIE_EUP_TMP 时效为:60*60 的Cookie
步骤二、在域cn.alisoft.com 新开浏览器执行读取,可读到 COOKIE_EUP_TMP 值
在域test.cn.alisoft.com 新开浏览器执行读取,可读到 COOKIE_EUP_TMP 值
在域alisoft.com 新开浏览器执行读取,读不到 COOKIE_EUP_TMP 值
另外我们增加Path的形式写入Cookie:
步骤一、在域cn.alisoft.com 写入名称为:COOKIE_EUP_TMP Path:/home 时效为:60*60 的Cookie
步骤二、在域cn.alisoft.com 新开浏览器执行读取,在home目录下,可读到 COOKIE_EUP_TMP 值
在域cn.alisoft.com 新开浏览器执行读取,在search目录下,读不到 COOKIE_EUP_TMP 值
结论:子域名可读父域名写入的Cookie,反之不行。如果设置了Path特性,那么只有这个Path路径下可读。

浙公网安备 33010602011771号