Cookie的跨域问题
被误解的HttpCookie.Domain属性
有人说可以利用HttpCookie.Domain属性实现跨域访问,假如在A站(A.com)中写B站(B.com)的cookie,如下所示
这其实是错误的,运行后通过浏览器查看,并没有成功写入B站的cookie(读取也是一样失败,由于浏览器的隐私策略限制,禁止读取非本域的cookie).
所以这个Domain属性,应该是可以跨子域,例如x.A.com和y.A.com,通过设置HttpCookie.Domain=“.A.com”,实现跨子域访问。
//A站a_setCookie.aspx (www.a.com)
HttpCookie cookie = new HttpCookie("key");
cookie.Value = key;
cookie.Domain = ".b.com";//这里指定的是B站
cookie.Path = "/";
cookie.Expires = DateTime.Now.AddHours();
filterContext.RequestContext.HttpContext.Response.Cookies.Add(cookie);
既然cookie无法跨域共享,那如何实现跨域访问呢?
可以利用script标签间接调用B站的页面,实现写入B站cookie的目的。
步骤一:先在B站(b_setCookie.aspx)下设置cookie的方法:
HttpCookie cookie = new HttpCookie("key");
cookie.Value = key;
cookie.Domain = ".b.com";//这里指定的是B站
cookie.Path = "/";
cookie.Expires = DateTime.Now.AddHours(1);
Response.Cookies.Add(cookie);
步骤二:由于<script>标签可以自动访问第三方网站,因此可以在A站的页面,例如a_setCookie.aspx的页面<head>标签内下设置如下:
<head><script src="http://www.b.com/b_setCookie.aspx" /></head>
以上步骤完毕,当访问A站的a_setCookie.aspx时,就会自动访问http://www.b.com/b_setCookie.aspx,实现写入B站cookie的目的。
测试B站cookie是否设置成功,B站下新建页面b_getCookie.aspx,读取B站的cookie
var key=Request.cookie["key"];
//或者
key=Request["key"];
注意:访问b_getCookie.aspx前,先访问A站的a_setCookie.aspx
注意浏览器的第三方 cookie 限制
所谓第三方 cookie,就是说你访问域名 A的一个页面,却接收到域名 B 的 cookie 设定指令。那么B就属于第三方,不同浏览器对于第三方cookie的限制有些区别,如下表
| IE | FIREFOX | CHROME | SAFARI | OPERA | |
|---|---|---|---|---|---|
| 限制第三方coookie | 是 | 否 | 否 | 是 | 否 |
使用p3p跨域设置Cookie
p3p((Platform for Privacy Preferences))介绍
http://baike.baidu.com/link?url=WVQp0aTUQgCoIzYm7rV_mur829NtWZCiSq9Kee_WusqmOWOQDwS2DNzw_S5M6UM-EcvNCliBHvYAV4kEjRBip_
为了消除这个限制,可以在b_setCookie.aspx加上如下设置
Response.Headers.Add("P3P", "CP=/"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR/"");
Cookie的跨域问题的更多相关文章
- 携带cookie的跨域访问
携带cookie的跨域解决方案 有的时候访问后台的请求需要携带cookie以供后台分析,比如jQuery的ajax请求: $.ajax({ url: a_cross_domain_url, xhrFi ...
- [php-cookie] cookie 请求跨域,如何共享
cookie 请求跨域的问题, 假设我有两个域名,一个 m.example.com,另一个是 www.example.com . 那么我需要如何设置 cookie 才可以在这两个域名都实现共享呢? / ...
- localStorage和cookie的跨域解决方案
原文转自:点我 前言 localStorage和cookie大家都用过,我前面也有文章介绍过,跨域大家也都了解,我前面也有文章详细描述过.但是localStorage和cookie的跨域问题,好多小伙 ...
- cookie解决跨域问题
v一.前言 随着项目模块越来越多,很多模块现在都是独立部署.模块之间的交流有时可能会通过cookie来完成.比如说门户和应用,分别部署在不同的机器或者web容器中,假如用户登陆之后会在浏览器客户端写入 ...
- cookie用法小结 cookie.setPath 跨域共享
1. JSP中Cookie的读写 Cookie的本质是一个键值对,当浏览器访问web服务器的时候写入在客户端机器上,里面记录一些信息.Cookie还有一些附加信息,比如域名.有效时间.注释等等. 下面 ...
- 跨域共享cookie和跨域共享session
转载自:http://blog.csdn.net/ahhsxy/article/details/7356128 这里所说的跨域,是指跨二级域名,而且这些域名对应的应用都在同一个app上, 比如我有以下 ...
- 后端设置Cookie前端跨域获取丢失问题(基于springboot实现)
1.跨域问题说明:后端域名为A.abc.com,前端域名为B.abc.com. 2.后端设置一个cookie发送给前台,domain应该是setDomain(“abc.com”),而不是setDoma ...
- Ajax跨域请求附带Cookie/Ajax跨域请求附带身份凭证
一.跨域请求中默认不带cookie等验证凭证 尤其对于post请求. 对于ajax请求,其中post,get都可以正常访问. withCredentials: false, // 允许携带cookie ...
- 使用Cookie实现跨域单点登录的原理
对于构建分布式系统来说业务功能的物理部署会随着新业务模块的增加而增加或改变物理部署的位置.而每个用户都有统一的帐号作为我们登录系统时的一个认证.当新业务或子系统部署在不同的物理机上,我们去访问不同的业 ...
随机推荐
- vue router 传参 获取不到query,params
千万要注意,获取query/params 是this.$route.query 不是this.$router.query!!!
- 一个工程实例来学习 Makefile
March 3, 2015 8:19 PM Makefile 文件的编写 学习前的准备 需要准备的工程目录结构如下: . ├── add │ ├── add_float.c │ ├── add ...
- AGC006 C Rabbit Exercise——思路(置换)
题目:https://agc006.contest.atcoder.jp/tasks/agc006_c 选了 i 位置后 x[ i ] = x[ i-1 ] + x[ i+1 ] - x[ i ] . ...
- Spring security 浅谈用户验证机制
step1:首先ApplicationUserDetailsService需要实现UserDetailsService接口(在 org.springframework.security.core.us ...
- Linux:课程安排、Linux简介、虚拟机安装、课前准备(常用设置和操作)
一.课程安排 1)Linux 的作用 商业服务器基本上都是 Linux: 开源软件都先支持 Linux: 大数据分析.机器学习首先选 Linux: 整个互联网地基靠Linux撑起来: Linux 系统 ...
- Annotation之三:自定义注解示例,利用反射进行解析
@Retention定义了该Annotation被保留的时间长短有3中RetentionPolicy.SOURCE源文件有效,RetentionPolicy.CLASS:在class文件中有效,Ret ...
- git rebase 与 merge(个人使用理解)
merge 是“合并”,rebase.cherry-pick 中文能理解成“重现” merge 一般是对于整个分支做处理,比如一个feature分支,功能开发完成经过测试了,我们会合并(merge)到 ...
- 测试php中的curl是否可使用
<?php $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,"http://www.baidu.com"); curl_seto ...
- S3C2440开发环境搭建(Ubuntu)
我的操作系统是 Ubuntu 1404.可以使用下面的命令查看系统的版本: cat /etc/issue 安装.配置.启动 ftp 服务 sudo apt-get install vsftpd 修改 ...
- java - 只输出中文,(不包含标点)
String a ="12dss显示,‘:()中文只"; StringBuffer b = new StringBuffer(); for(int i = 0;i<a.len ...