我在菜单中添加了一个“退出”按钮(LinkButton),按钮的Click事件代码如下:        //点击退出清空用户Session
        protected void lbtmExit_Click(object sender, EventArgs e)
        {
            this.Session["UserID"] = "";
            Response.Redirect("Index.aspx");
            Response.End(); ;
        }
这个清空Session的代码是放在用户控件代码中的(因为LinkButton在用户控件里),代码没什么问题。问题出现在点击“退出”之后。清空后跳转到Index.aspx了,但再点击浏览器的“后退”,有几个之前浏览的页面能验证出用户未登录,有几个页面未重新加载,没执行验证……显示的之前登录的用户的信息。(这几个测试了的页面都是退出前最后浏览的页面)仔细比较了这几个页面的差异,设置断点单步之后,发现唯一的区别是,验证成功的页面重新加载了,验证失败的页面没有重新加载。尝试了用if (!IsPostBack)判断再验证,也检查过页面的设置差异,没解决。想请教一下大家怎么解决。

解决方案 »

  1.   

    Session["UserID"] = "";
    Session["UserID"]=null;
                Response.Redirect("Index.aspx");
                Response.End(); ;每一个页面加判断if(!page.IsPostBack)
    {
        if(Session["UserID"]!=null && Session["UserID"].ToString()!="")
       {
             //登录成功
       }
       else
       {
            //还没有登录
       }
    }
      

  2.   

    <%
        response.setHeader("Cache-Control","no-store");
        response.setDateHeader("Expires", 0);
        response.setHeader("Pragma","no-cache"); 
    %>
      

  3.   

    有时候后退(history.back())显示出来的,是浏览器缓存的页面,你按F5或者Ctrl+F5强制刷新一下就好了
      

  4.   

    很明显这是浏览器缓存的问题你可以在不想被缓存的页面Page_Load事件中加上如下代码:     Response.Expires = 0; 
        Response.Buffer = true; 
        Response.ExpiresAbsolute = DateTime.Now.AddSeconds(-1); 
        Response.AddHeader("pragma", "no-cache"); 
        Response.CacheControl = "no-cache"; 这样每次访问这样的页面都会到服务器端进行重新获取了
      

  5.   

    用这么多代码不如用这个
    <% @outputcache duration="5" varyByParam="none" %>
      

  6.   

    很明显这是浏览器缓存的问题 你可以在不想被缓存的页面Page_Load事件中加上如下代码:     Response.Expires = 0; 
        Response.Buffer = true; 
        Response.ExpiresAbsolute = DateTime.Now.AddSeconds(-1); 
        Response.AddHeader("pragma", "no-cache"); 
        Response.CacheControl = "no-cache"; 这样每次访问这样的页面都会到服务器端进行重新获取了
      

  7.   

    清空缓存就好了
    是这样的,我觉得session真是不好
    容易丢失
      

  8.   


    <% @outputcache duration="5" varyByParam="none" %>这个怎么用?
      

  9.   

    this.Session["UserID"] = "";
    改成Session.Remove("UserID");
      

  10.   

    禁止 history.back这种后退,设置网页立即过期
      

  11.   


    Session.Clear();Session.RemoveAll();Session.Remove("username");
    //写全点,浏览器的后退很麻烦
    //你有不知道他后退的是那个页面不能所有的都加上
    <%
    Response.Expires = 0 
    Response.Expiresabsolute = Now() - 1 
    Response.AddHeader "pragma","no-cache" 
    Response.AddHeader "cache-control","private" 
    Response.CacheControl = "no-cache" 
    % >
    //你在退出的时候添加一个alert(你已经推出了页面)然后跳转
    这样后退就退到了alert里面了
      

  12.   

    嗯,这个问题以前有人问过
    http://topic.csdn.net/u/20081031/14/ec410b99-c659-4a27-8ad9-fc0e5d6c7c2b.html
      

  13.   

    要后退按钮失效。。<% 
        Response.Buffer = true;
       // Response.ExpiresAbsolute = Now() - 1;
        Response.Expires = 0;
        Response.CacheControl = "no-cache";
    %>
      

  14.   

    this.Session["UserID"] = null;
      

  15.   

    Session.Clear();
            Response.Write("<script Language=Javascript>window.top.location=\"Index.aspx\";</script>");
      

  16.   

    这样使用:Duration 用于设置页面或者用户控件缓存的时间。单位是秒。通过设置该属性,能够为来自对象的HTTP响应建立了一个过期策略,并将自动缓存页或用户控件输出。需要注意的是,Duration属性是必需的,否则将会引起分析器错误。 Shared 该属性定义一个布尔值,用于确定用户控件输出是否可以由多个页共享。默认值为false。注意,包含在ASP.NET页中的@ OutputCache指令不支持此属性。 Location 用于指定输出缓存项的位置。其属性值是OutputCacheLocation枚举值,它们是Any、Client、Downstream、None、 Server和ServerAndClient。默认值是Any,表示输出缓存可用于所有请求,包括客户端浏览器、代理服务器或处理请求的服务器上。需要注意的是,包含在用户控件中的@ OutputCache指令不支持此属性。 SqlDependency 该属性标识一组数据库/表名称对的字符串值,页或控件的输出缓存依赖于这些名称对。需要注意:SqlCacheDependency类监视输出缓存所依赖 的数据库中的表,因此,当更新表中的项时,使用基于表的轮询将从缓存中移除这些项。当通知(在SQL Server 2005中)与CommandNotification值一起使用时,最终将使用SqlDependency类向SQL Server 2005服务器注册查询通知。另外,SqlDependency属性的CommandNotification值仅在ASP.NET页中有效。控件只能将 基于表的轮询用于@ OutputCache指令。 VaryByControl 该属性使用一个分号分隔的字符串列表来更改用户控件的输出缓存。这些字符串代表在用户控件中声明的ASP.NET服务器控件的ID属性值。除非已经包含了VaryByParam属性,否则在@ OutputCache指令中,该属性是必需的。 VaryByCustom 用于自定义输出缓存要求的任意文本。如果赋予该属性值是browser,缓存将随浏览器名称和主要版本信息的不同而异。如果输入了自定义字符串,则必须在 应用程序的Global.asax文件中重写HttpApplication.GetVaryByCustomString方法。 VaryByHeader 该属性中包含由分号分隔的HTTP标头列表,用于使输出缓存发生变化。当将该属性设为多标头时,对于每个指定的标头,输出缓存都包含一个请求文档的不同版 本。VaryByHeader属性在所有HTTP 1.1缓存中启用缓存项,而不仅限于ASP.NET缓存。用户控件中的@ OutputCache指令不支持此属性。 VaryByParam 该属性定义了一个分号分隔的字符串列表,用于使输出缓存发生变化。默认情况下,这些字符串与用GET方法属性发送的查询字符串值对应,或与用POST方法 发送的参数对应。当将该属性设置为多参数时,对于每个指定的参数,输出缓存都包含一个请求文档的不同版本。可能的值包括“none”、“*”和任何有效的 查询字符串或POST参数名称。值得注意的是,在输出缓存ASP.NET页时,该属性是必需的。它对于用户控件也是必需的,除非已经在用户控件的@ OutputCache指令中包含了VaryByControl属性。如果没有包含,则会发生分析器错误。如果不需要使缓存内容随任何指定参数发生变化, 则可将该值设为“none”。如果要使输出缓存根据所有参数值发生变化,则将属性设置为“*”。 
      

  17.   

    session 失效就完了,...
      那用那么费劲......
       真晕 楼上那些骗分的.2行代码的东西..
      

  18.   


    后来在IIS上测试,发现隔几分钟Session就过期了,得重新登录。
    最后找到了一个比较好的解决办法,而且不用关掉页面缓存:Session.Abandon(); 
    Response.Write("<script>window.location.href='Login.aspx'</script>"); 
     就是把Response.Redirect改为Response.Write,输出脚本,实现跳转。http://blog.csdn.net/lhypang2006/archive/2008/03/11/2170751.aspx 
    http://www.jb51.net/article/17722.htm