【问题标题】:ASP.NET session redirect without postback无回发的 ASP.NET 会话重定向
【发布时间】:2015-06-30 12:20:38
【问题描述】:

我在ASP.NET c# 中有一个单页应用程序。应用程序中的所有信息都使用AJAX 调用加载。根本没有POSTBACK。但是,每次我单击从Web Services 加载数据的不同菜单项时,它都会检查用户是否具有有效的session。由于没有postback 并且当session 过期时,用户仍然可以看到主页,并且当他们单击菜单项时,由于会话过期,数据将不会加载(但用户不知道)。

如果有postback,我确实知道如何在会话到期时重定向到登录页面,但是如果没有postback,我怎样才能获得相同的结果?

【问题讨论】:

    标签: c# asp.net ajax session


    【解决方案1】:

    这里唯一想到的是使用 AJAX 调用到 web 服务,它将检查会话是否处于活动状态,然后采取相应的行动。这些方面的东西(未经测试):

    ASHX 处理程序:

    <%@ WebHandler Language="C#" Class="CheckSessionAlive" %>
    using System;
    using System.Linq;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.Script.Serialization;
    
    public class CheckSessionAlive : IHttpHandler, IRequiresSessionState {
    
        public void ProcessRequest (HttpContext cx) {
            cx.Response.ContentType = "text/json";
            cx.Response.Write(new JavaScriptSerializer().Serialize(new
            {
                Result = cx.Session["SomeRandomValue"] != null ? 1 : -1
            }));
        }
    
        public bool IsReusable {
            get {
                return false;
            }
        }
    
    }
    

    Javascript (JQuery) 调用:

    function CheckSessionAlive() {
        $.ajax({
            url: "CheckSessionAlive.ashx",
            type: "GET",
            success: function (data) {
                if (data.Result == 1)
                    setTimeout(CheckSessionAlive, 5000); // 5 seconds
                else
                    window.location.href = "http://www.google.com";
            }
        });
    }
    
    $(document).ready(function () {
        CheckSessionAlive();
    });
    

    我希望它有用:)。

    【讨论】:

    • 感谢您的回复。会话长度在我的应用程序的 webconfig 文件中设置。网络服务如何知道会话是否过期?
    • 欢迎您:)。 AJAX 调用将每 5 秒调用一次 Web 服务,它会检查您可以在登录序列中设置的会话值(如果您使用的是 asp:Login,则可以在 OnLoggedIn 事件中执行此操作)和一个虚拟值。一旦会话自行到期,检查将返回一个空值,使 web 服务返回 -1,并且 AJAX 函数会将您重定向到 google.com,在我的示例中。
    【解决方案2】:

    用户首先如何登录?如果他们从不同的页面登录,您必须将他们重定向到该页面才能登录。如果您在单页应用程序中执行此操作,则 Web 服务调用需要返回一个指示会话状态的标志。如果会话过期,您的 ajax 调用应该触发登录视图。希望对您有所帮助。

    【讨论】:

    • 用户使用login.aspx页面登录。一旦用户成功登录,我设置会话变量并将用户重定向到default.aspx 但是,在此之后重定向默认页面内发生的所有事情都没有回发。
    【解决方案3】:

    我能够解决这个问题。这是我的方法。

    default.aspxpageload 中,我从web.config 文件中获取会话时间。

    protected void Page_Load(object sender, EventArgs e)
    {
      Response.Cache.SetCacheability(HttpCacheability.NoCache);
      if (!this.IsPostBack)
      {
        Session["Reset"] = true;
        Configuration config = WebConfigurationManager.OpenWebConfiguration("~/Web.Config");
        SessionStateSection section = (SessionStateSection)config.GetSection("system.web/sessionState");
        int timeout = (int)section.Timeout.TotalMinutes * 1000 * 60;
        ClientScript.RegisterStartupScript(this.GetType(), "SessionAlert", "SessionExpireAlert(" + timeout + ");", true);
      }
    }
    

    然后使用JavaScript function 进行倒计时并在达到 60 秒时显示警告消息。

    <script type="text/javascript">
    function SessionExpireAlert(timeout) {
    var seconds = timeout / 1000;
    document.getElementsByName("secondsIdle").innerHTML = seconds;
    setInterval(function () {
        seconds--;
        document.getElementById("secondsIdle").innerHTML = seconds;
    }, 1000);
    setTimeout(function () {
        //Show Popup before 20 seconds of timeout.
         toastr.info('You will be logged out in: <span id="secondsIdle">' '</span> seconds.<br/>Click here to stay logged in.', "Warning",
            { timeOut: 0, 'position-class': 'toast-tontainer',onclick: renewSessionState}
    }, timeout - 20 * 1000);
    setTimeout(function () {
        window.location = "logout.aspx";
    }, timeout);
    };
    </script>  
    
    
    function renewSessionState() {
    $.ajax({
        url: "/Handlers/Ping.ashx",
        method: 'POST'
    });
    }
    

    注意* Ping.ashx 只是一个空处理程序。

    【讨论】:

    • 这是一个不错的选择,如果您可以将我的建议标记为答案,那就太好了,因为我认为它很有帮助 - 但是我看到一个小警告:如果由于某种原因您有 slipExpiration=true在您的 web.config 文件中,超时不会同步。此外,您还依赖于浏览器的计时器,并且可以使用简单的控制台 javascript 函数或greasemonkey 脚本来更改超时。服务器端方式更安全,恕我直言:P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    相关资源
    最近更新 更多