【问题标题】:session expiring and giving error page会话到期并给出错误页面
【发布时间】:2009-11-27 00:53:13
【问题描述】:

会话到期时我的应用程序抛出错误。

我不希望会话自动过期....

但是如果没有办法做到这一点,那么应该将它重定向到登录页面而不是显示错误...

我试图这样做......

Response.AppendHeader("Refresh", Convert.ToString((Session.Timeout * 60) + 10) + "; URL=Login.aspx");

会话到期时此代码不起作用..我收到一条错误消息

响应在此上下文中不可用。

网络配置有这个

<authentication mode="Forms">
        <forms loginUrl="Login.aspx" name="Cookie" timeout="10080" path="/">
        </forms>
    </authentication>
    <authorization>
        <deny users="?"/>
        <allow users="*"/>
    </authorization>

还有什么我需要在网络配置中添加的...

任何建议...谢谢

这是我的页面加载

 protected void Page_Load(object sender, EventArgs e)
    {
        Response.AppendHeader("Refresh", Convert.ToString((Session.Timeout * 60) + 10) + "; URL=Login.aspx");
        string userName = Session["userName"].ToString();
        string password = Session["password"].ToString();
        string domain = Session["domain"].ToString();

        impersonateValidUser(userName, domain, password);


    }

【问题讨论】:

标签: c# asp.net session login


【解决方案1】:

我已经在我的母版页的Page_Load 中解决了这个问题。

每次Page_Load 触发时,它都会检查是否存在特定的Session 值(如果用户正确登录,该值应该存在)。如果没有,我会重定向到登录页面。

例如:

// Assuming your using master pages (if not you could have this in a base page that all
// your pages inherit from.
protected void Page_Load(object sender, EventArgs e)
{
    if (Session["SomeKey"] == null)
    {
        // Session has expired or person has not signed in so redirect.
        FormsAuthentication.SignOut();
        Session.Abandon();
        Response.Redirect("signin.aspx", true);
    }

    // If all is good continue and do whatever you normally do.
}

在您的示例中,由于会话到期,会话变量可能不存在,因此您从所有获取的会话密钥中获取空值。您应该验证它们不为空,如果是,则对值为空的值做出适当的反应。

【讨论】:

    【解决方案2】:

    我不确定您的问题出在哪里,但作为替代方案,请考虑使用 javascript 解决方案客户端来提示用户在到期前更新会话。如果用户未能肯定地同意会话更新,则重定向到 注销 页面以终止会话,而不是简单地让它过期。通常,您的注销页面将重定向回登录页面,因此当用户返回其计算机时,将被提示登录。如果用户确实在您的续订对话框中单击“确定”(我想续订会话)按钮,然后按照@Come 的建议使用对 Keepalive 页面的请求,尽管我会使用 AJAX 而不是 iframe。

    您可以在我的blog 上查看一些在 ASP.NET MVC 上下文中执行此操作的 sample code

    【讨论】:

      【解决方案3】:

      您可以做的是在您的页面中添加一个不可见的 iframe:

      <iframe src="keepalive.aspx" style="width:0px;height:0px"></iframe>
      

      并且keepalive.aspx包含以下内容:

      <%@ Page Language="C#" Inherits="Keepalive" EnableSessionState="True"%>
      <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" >
      <html>
        <head>
         <META http-equiv="refresh" content="60"/>
        </head>
        <body></body>
      </html>
      

      keepalive.aspx 每 60 秒刷新一次,导致会话保持活动状态。 您可以将会话的超时设置为例如 2 分钟。这样,用户离开您的页面后,会话将很快被清除。

      【讨论】:

        【解决方案4】:

        在您的网站上进行永久会话是个坏主意,但您可以通过在 web.config 中为会话超时提供较大的值来完成此操作

        <sessionState  timeout="6000"/>
        

        【讨论】:

          猜你喜欢
          • 2017-09-09
          • 1970-01-01
          • 2013-12-22
          • 2013-07-20
          • 1970-01-01
          • 2012-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多