没有回发的ASP.NET会话重定向

时间:2015-04-22 17:05:59

标签: c# asp.net ajax session

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

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

3 个答案:

答案 0 :(得分:2)

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

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();
});

我希望它有用:)。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

pageload的{​​{1}}中,我从default.aspx文件获得会话时间。

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); } } 进行倒计时,并在达到60秒时显示警告信息。

JavaScript function

注意* <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' }); } 只是一个空的处理程序。