我在ASP.NET c#
中有一个单页面应用程序。使用AJAX
调用加载应用程序中的所有信息。根本没有POSTBACK
。但是,每次单击从Web Services
加载数据的其他菜单项时,它都会检查用户是否具有有效session
。由于没有postback
,当session
到期时,用户仍会看到主页,当他们点击菜单项时,数据将无法加载,因为会话已过期(但用户不会# 39;知道吗。
如果有postback
,我知道在会话过期时如何重定向到登录页面,但如果没有postback
我怎样才能获得相同的结果?
答案 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'
});
}
只是一个空的处理程序。