none
cookie的疑惑 RRS feed

  • 问题

  • “web浏览器第一次访问asp.net站点,asp.net返回html代码,另外,还返回一个带唯一ID的cookie,来跟踪这个浏览器。”

    我想请问,在此过程之前,web浏览器禁用了cookie,会怎样?
    2009年6月11日 1:19

答案

  • 你好,
    • 如果禁用Cookie,而没有设置其它东西的话,Session将无法使用!
    • 在 ASP.NET 中,无需使用 Cookie,就可以有选择地建立必要的会话-用户联系。非常有趣的是,除了以下配置设置以外,您无需在 ASP.NET 应用程序中更改任何内容即可启用无 Cookie 会话。<sessionState cookieless="true" />
    • 假设您请求了一个类似于 http://yourserver/folder/default.aspx 的页。正如您可以从 MapPoint 快照中看到的那样,资源名称前面的相邻斜杠进行了扩展,以便包含在内部填充了会话 ID 的括号,如下所示。http://yourserver/folder/(session ID here)/default.aspx
    • 会话 ID 嵌入到 URL 中,并且无需在其他任何地方持久保存它。

    邹俊才
    2009年6月11日 1:35
    版主

全部回复

  • 你好,
    • 如果禁用Cookie,而没有设置其它东西的话,Session将无法使用!
    • 在 ASP.NET 中,无需使用 Cookie,就可以有选择地建立必要的会话-用户联系。非常有趣的是,除了以下配置设置以外,您无需在 ASP.NET 应用程序中更改任何内容即可启用无 Cookie 会话。<sessionState cookieless="true" />
    • 假设您请求了一个类似于 http://yourserver/folder/default.aspx 的页。正如您可以从 MapPoint 快照中看到的那样,资源名称前面的相邻斜杠进行了扩展,以便包含在内部填充了会话 ID 的括号,如下所示。http://yourserver/folder/(session ID here)/default.aspx
    • 会话 ID 嵌入到 URL 中,并且无需在其他任何地方持久保存它。

    邹俊才
    2009年6月11日 1:35
    版主
  • 对于一些需要定位url的客户段脚本,这才是灾难的开始 :(
    紫柔版主的头像真叫萌得一个不行啊。。。。
    答案800 撒花
    2009年6月11日 1:40
  • 还是不太清楚,我测试了一下:
    1。ASP.NET代码如下
    public partial class _Default : System.Web.UI.Page
    {
       protected void Page_Load(object sender, EventArgs e)
       {
          if (this.Session["id"] == null)
          {
             this.Session["id"] = 0;
          }
       }
       protected void Button1_Click(object sender, EventArgs e)
       {
          this.Button1.Text = this.Session["id"].ToString();
       }
    }
    2。删除所有cookie,禁用浏览器cookie,打开trace调试
    3。打开网站,trace的request cookies collection没有任何内容,response cookie collection显示一项ASP.NET_SessionId;
    4。点击Button1,按钮文本变为"0",request cookies collection显示一项ASP.NET_SessionId,response cookie collection没有任何内容;
    5。浏览器URL中从未出现SessionID;

    既然浏览器关闭了Cookie,在第3步时就不应该获得Cookie,那么在第4步时浏览器是怎样知道ASP.NET_SessionId的内容的呢?

    2009年6月11日 2:06
  • 你好,Session的值是保存在服务器的,标识保存在客户端,在你的第4步,其实没有用到客户端的标识,直接在服务器端就给Session赋值,然后取值,执行完后就向客户端输出内容。
    邹俊才
    2009年6月11日 4:52
    版主
  • 你那样测试是错误的。
    因为Button.Click首先执行page_Load,所以你需要加上判断是否是回发。这样测试:

    <%@ Page Language="C#" AutoEventWireup="true" Trace="true" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
      protected void Page_Load(object sender, EventArgs e)
      {
        if (!Page.IsPostBack)
        {
          HttpCookie h = new HttpCookie("a", "AA");
          Response.Cookies.Add(h);
    
          if (this.Session["id"] == null)
          {
            this.Session["id"] = 0;
          }
        }
      }
      protected void Button1_Click(object sender, EventArgs e)
      {
        this.Button1.Text = this.Session["id"].ToString();
        Response.Write(Request.Cookies["a"].Value);
      }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title></title>
    </head>
    <body>
      <form id="form1" runat="server">
      <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
      </form>
    </body>
    </html>
    
    在禁用Cookie执行,再次提交会报告错误,说明你设置的Cookie是不存在的
    【孟子E章】
    2009年6月11日 5:10
    版主
  • 另外注意:Zai测试 的时候需要清空Cookie,浏览器禁用Cookie,然后关闭所有打开的浏览器,再进行测试
    【孟子E章】
    2009年6月11日 5:21
    版主