我在两台机子上一台机子配置用来写COOKIE 一台机子用来读COOKIE 为什么会读不到COOKIE呢 具体代码如下: 写COOKIE: protected void WriteCookie() { bool flag=true; string user = TextBoxUser.Text; //读取用户名 string password = TextBoxPassword.Text; //读取密码 if (Confirm(user, password) == true) //confirm方法用来验证用户合法性的 { string userRoles = UserToRole(user); //调用UserToRole方法来获取role字符串 if(flag) { FormsAuthentication.SetAuthCookie(userRoles,true); } else { FormsAuthentication.SetAuthCookie(userRoles, false); } FormsAuthenticationTicket ticket = new FormsAuthenticationTicket("GUID="+System.Guid.NewGuid()+",SSID="+Session.SessionID+",USID="+user, false, 460); string FunTicket = FormsAuthentication.Encrypt(ticket); HttpCookie UserCookie = Context.Response.Cookies[FormsAuthentication.FormsCookieName]; if (UserCookie != null) { UserCookie.Value=FunTicket; UserCookie.Domain = ".yeah.com"; Context.Response.Cookies.Add(UserCookie); //输出Cookie Response.Redirect("Default.aspx"); } } else { // 用户身份未被确认时的代码 } }
读COOKIE:
protected void ReadCookie() { if (Request.Cookies[FormsAuthentication.FormsCookieName] != null) { HttpCookie cookie = Request.Cookies[FormsAuthentication.FormsCookieName]; Response.Write("域:"+FormsAuthentication.CookieDomain+ " </br>");
string[] str = FormsAuthentication.Decrypt(cookie.Values[0]).Name.Split(','); if (str.Length > 0) { for (int i = 0; i < str.Length; i++) { string[] str1 = str[i].Split('='); Response.Write(str1[0] +"="+str1[1]+" </br>"); } } } }
用两个站点实现,一个写一个读,站点配置一样如下:
<?xml version="1.0"?> <!-- 注意: 除了手动编辑此文件以外,您还可以使用 Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的 “网站”->“Asp.Net 配置”选项。 设置和注释的完整列表在 machine.config.comments 中,该文件通常位于 /Windows/Microsoft.Net/Framework/v2.x/Config 中 --> <configuration> <appSettings/> <connectionStrings/> <system.web> <!-- 设置 compilation debug="true" 将调试符号插入 已编译的页面中。但由于这会 影响性能,因此只在开发过程中将此值 设置为 true。 --> <compilation debug="true"/> <!-- 通过 <authentication> 节可以配置 ASP.NET 使用的 安全身份验证模式, 以标识传入的用户。 --> <authentication mode="Forms"> <forms name=".MyCookie" domain=".yeah.com" loginUrl="/login.aspx" protection="All" timeout="480" path="/" requireSSL="false" slidingExpiration="true" enableCrossAppRedirects="false" cookieless="UseDeviceProfile"/> </authentication> <authorization> <allow users="*"/> </authorization> <!-- 如果在执行请求的过程中出现未处理的错误, 则通过 <customErrors> 节可以配置相应的处理步骤。具体说来, 开发人员通过该节可以配置 要显示的 html 错误页 以代替错误堆栈跟踪。
<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm"> <error statusCode="403" redirect="NoAccess.htm" /> <error statusCode="404" redirect="FileNotFound.htm" /> </customErrors> --> </system.web> </configuration>
请问我为什么取不到cookie
总结一些网友提出来的意见:
发表于:2008-02-25 16:10:538楼 得分:0 |
没办法共享吧. 除非是同一个顶级域名可以设置domain从而使2级域名共享 |
试试 topdomain.aspx,顶级生成cookie
-
HTML code
-
<% @ Page Language = " C# " %> <% HttpCookie hc = new HttpCookie( " OutByTopDomain " , " OutByTopDomain " + DateTime.Now.ToString()); hc.Expires = DateTime.Now.AddDays( 30 ); // 过期时间为30天 hc.Domain = " 你的顶级域名 " ; // 设置共享域,如aa.com,bb.aa.com等,可以设置为aa.com,这样可以在子域共享 Response.Cookies.Add(hc); %>
subdomain.aspx,子域读cookie
-
HTML code
-
<% @ Page Language = " C# " %> <% Response.Write( " 顶级域名产生的Cookie==| " + Response.Cookies[ " OutByTopDomain " ].Value + " |=== " ); %>
下面是msdn给出的例子 限制 Cookie 的域范围 默认情况下,Cookie 与特定域关联。例如,如果您的站点是 www.contoso.com,那么当用户向该站点请求任何页时,您编写的 Cookie 就会被发送到服务器。(这可能不包括带有特定路径值的 Cookie。)如果站点具有子域(例如,contoso.com、sales.contoso.com 和 support.contoso.com),则可以将 Cookie 与特定的子域关联。若要执行此操作,请设置 Cookie 的 Domain 属性,如此示例所示: Visual Basic 复制代码 Response.Cookies("domain").Value = DateTime.Now.ToString() Response.Cookies("domain").Expires = DateTime.Now.AddDays(1) Response.Cookies("domain").Domain = "support.contoso.com" C# 复制代码 Response.Cookies["domain"].Value = DateTime.Now.ToString(); Response.Cookies["domain"].Expires = DateTime.Now.AddDays(1); Response.Cookies["domain"].Domain = "support.contoso.com"; 当以此方式设置域时,Cookie 将仅可用于指定的子域中的页面。还可以使用 Domain 属性创建可在多个子域间共享的 Cookie,如下面的示例所示: Visual Basic 复制代码 Response.Cookies("domain").Value = DateTime.Now.ToString() Response.Cookies("domain").Expires = DateTime.Now.AddDays(1) Response.Cookies("domain").Domain = "contoso.com" C# 复制代码 Response.Cookies["domain"].Value = DateTime.Now.ToString(); Response.Cookies["domain"].Expires = DateTime.Now.AddDays(1); Response.Cookies["domain"].Domain = "contoso.com"; 随后 Cookie 将可用于主域,也可用于 sales.contoso.com 和 support.contoso.com 域。
发表于:2008-02-26 15:36:3613楼 得分:0 |
我一直不明白,www.sohu.com 和 www.17173.com 是怎样实现用户登录共享的,那位高手指点哈啊 这应该是单点登录。就是有一个登录服务器,所有的站点登录都是到此服务器登录,然后转到相应的站点。 而不是使用cookie来实现跨域的。 cookie只能实现同一主域下的各站点的写与读。 如果要实现不同主域之间的访问,请使用sso方案。 |
通过设置p3p头来实现跨域访问cookie
今天在w3网站上看到了一篇介绍p3p的文章(http://www.w3.org/TR/P3P/),利用这个可以实现跨域访问cookie,我也试验一下。 其实很简单:试验用了2个域名readlog.cn和diaor.com 首先在readlog.cn下放置一个文件setcookie.php 内容: PHP代码 header(’P3P: CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND
PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"’);//p3p setcookie("TestCookie","test",time()+3600,"/",".readlog.cn");//设置cookie 再放置一个readcookie.php 内容: 然后在diaor.com下放置setcookie.php ,内容: JavaScript代码 1. <script src="http://www.readlog.cn/setcookie.php"></script> 然后访问http://www.diaor.com/setcookie.php 抓取数据包可以发现,在readlog.cn域下生成了一个cookie ,名称是TestCookie,值是test 下面访问http://www.readlog.cn/readcookie.php 来验证一下,可以发现,cookie确实设置成功了。 有兴趣可以去掉header(’P3P: CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IN
D PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"’);这句,试一下就会发现cookie能设置,但是在readlog.cn读不到这个cookie。
利用js解决ajax跨域问题
由于安全性问题, ajax在进行请求数据时,不能跨域请求. 比如 在 www.a.com 下的页面, 无法ajax请求www.b.com/ajax.php的内容. 尽管这样的需求不多,但遇到了怎么办? 这里给出一个JS模拟ajax的方式实现跨域, 但仅仅局限于GET!
在 <script> 标签中, src的属性是可以设置非本域下的地址的. 借助此特点,即可模拟ajax的方式实现跨域. 假设 www.a.com 域名下的程序 需要通过ajax方式提交数据到 www.b.com 下的login.php?username=*&passwod=*实现登陆判断. 实现方式如下: 在www.a.com内动态创建JS的方式来加载www.b.com的内容,代码如下
- //此代码在www.a.com下
- var head = document.getElementsByTagName("head")[0];
- var js = document.createElement("script");
- js.src = "http://www.b.com/login.php?username=*&passwod=*";
- js.onload = js.onreadystatechange = function()
- {
- if (!this.readyState || this.readyState == "loaded" || this.readyState == "complete")
- {
- head.removeChild(js);
- //JS加载完毕了. 类似于ajax请求完成.
- //执行是否登陆成功的判断
- }
- }
- head.appendChild(js);
这只是一个简单的例子,需要b.com下的login.php做好配合,login.php通过GET取得传入值,并生成JS的登陆标记. JS加载完成后,根据JS标记判断登陆的状态,提示登陆成功或失败.即可完成要求,代码兼容常见浏览器. :)
当然缺陷也很明显,只能支持GET的方式提交数据. 下一次我会在说说ajax跨域POST的方法.
用JS或jQuery访问页面内的iframe,兼容IE/FF
js或者jQuery访问页面中的框架也就是iframe. 注意:框架内的页面是不能跨域的! 假设有两个页面,在相同域下. index.html 文件内含有一个iframe:
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
- <title>页面首页</title>
- </head>
- <body>
- <iframe src="iframe.html" id="koyoz" height="0" width="0"></iframe>
- </body>
- </html>
iframe.html 内容:
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
- <title>iframe.html</title>
- </head>
- <body>
- <div id="test">www.koyoz.com</div>
- </body>
- </html>
1. 在index.html执行JS直接访问:
- document.getElementById('koyoz').contentWindow.document.getElementById('test').style.color='red'
通过在index.html访问ID名为'koyoz'的iframe页面,并取得此iframe页面内的ID为'test'的对象,并将其颜色设置为红色.
此代码已经测试通过,能支持IE/firefox . 2. 在index.html里面借助jQuery访问:
- $("#koyoz").contents().find("#test").css('color','red');
此代码的效果和JS直接访问是一样的,由于借助于jQuery框架,代码就更短了.