none
Session 清除不及时问题 RRS feed

  • 问题

  • 最近发现一个现象。本人有2个页面 Login.aspx   welcome.aspx.  在登陆页有2个按钮一个是写 Session["lId"] = "abc"; 另一个按钮事件是清SessionSession["lId"] = null; Session.RemoveAll();Session.Clear(); . 在欢迎页判断Session是否存在,如果不存在跳回到登陆页。但这里发现一个问题。还原场景如下。先点击写Session按钮。正常写入Session。然后访问欢迎页,正常显示欢迎页。复制欢迎页Url地址。再访问登陆页,点击清Session按钮,清楚Session。然后在Ie地址栏内粘贴刚才复制的欢迎页地址。结果发现欢迎页仍然能正常显示(不过这里我做了个小技巧就是在欢迎页打印当前系统时间,发现其实现实的欢迎页是刚才显示的那个老页面,因为时间不变。说明是Ie缓存再起作用)。不过怎么能解决这个问题呢?就是Session清了,再在Url地址栏输入欢迎页马上就能检测出来?

    或者说登陆成功后,在成功页转到登陆页,清掉Session,再点后退,也能回到刚才的登录页,我知道都是Ie缓存在起作用,但有什么方法能解决这个现象呢?

      我发现CSDN的发表文章那里也有这个问题。我登陆成功后进入发表文章页面    writeblog.csdn.net/PostEditPlain.aspx ,然后记下这个Url ,点右上角退出,退出后,直接在ie地址栏粘贴进去刚才复制的发表文章页地址,然后回车,也一样还显示登陆成功时状态。难道这是Ie的真实机制? 不解呀 !!!
    • 已编辑 三丰 2009年10月27日 10:43 错别字
    2009年10月26日 12:53

答案

全部回复

  • 你可以加上
    Response.Expires = -100
    Response.CacheControl = "no"
    禁止缓存试试
    【孟子E章】
    • 已标记为答案 三丰 2009年10月27日 9:11
    2009年10月26日 13:20
    版主
  • <script   language="JavaScript">
                     javascript: window.history.forward(1);    
      </script>
    2009年10月26日 14:03
  • 不行 。感觉是IE自己的一个机制在里面。 那个页只要刷新下就能演出来Session不存在了。

    2009年10月26日 15:06
  • 我觉得是你的测试方法有问题,以下2个页面测试,没有出现你说的问题。从道理上说, Session是服务器端东西,清除了之后内容是不会存在的。下面是测试文件:

    File1.aspx

    <%@ Page Language="C#" %>
    
    <!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 Button1_Click(object sender, EventArgs e)
      {
        Session["Id"] = null;
      }
    
      protected void Page_Load(object sender, EventArgs e)
      {
        if (!Page.IsPostBack)
        {
          Session["Id"] = "abc";
        }
      }
    </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="删除Session" />
      </form>
    </body>
    </html>
    
    File2.aspx

    <%@ Page Language="C#" %>
    
    <!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 (Session["Id"] != null)
        {
          Response.Write(Session["Id"].ToString());
        }
        else
        {
          Response.Write("null");
        }
      }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title></title>
    </head>
    <body>
      <form id="form1" runat="server">
      <div>
      </div>
      </form>
    </body>
    </html>
    
    你可以先执行File1,打开File2进行测试

    【孟子E章】
    2009年10月27日 0:56
    版主
  • 在欢迎页面的PageLoad方法里追加Session["lId"]检查,如果Session["lId"]为NULL就跳转回登陆画面。
    2009年10月27日 1:25
  • 老孟 你把测试流程稍作改动。先运行1页面,然后直接在Ie地址栏换成2页面。这时正常访问,然后把2页面的Url地址copy一份。这时回到1页面。点清session按钮,然后在当前Ie地址栏直接粘贴刚才的2页面地址。你会发现2页面能正常显示成功登陆状态。

    2009年10月27日 4:11
  • 按 你的步骤,也没有出现你说的现象。如果方便,你可以远程登录看一下。
    【孟子E章】
    2009年10月27日 4:28
    版主
  • 老孟 方便公布下你的访问地址么? 我测试下

    2009年10月27日 8:20
  • 问题解决了。果然如上面大家所说 ,把缓存禁用掉就可以了 。呵呵
    <meta http-equiv="PRAGMA" content="NO-CACHE" />
    2009年10月27日 9:05