C# ASP.NET会话重定向而不回发
我在C# ASP.NET会话重定向而不回发,c#,asp.net,ajax,session,C#,Asp.net,Ajax,Session,我在ASP.NET c.中有一个单页应用程序。应用程序中的所有信息都是通过AJAX调用加载的。根本没有POSTBACK。但是,每次我单击从webservices加载数据的不同菜单项时,它都会检查用户是否有有效的会话。由于没有postback,当session过期时,用户仍会看到主页面,当他们单击菜单项时,自会话过期后数据将不会加载(但用户不知道) 如果有postback,我确实知道在会话到期时如何重定向到登录页面,但是如果没有postback,我如何才能获得相同的结果?用户首先是如何登录的?如果
ASP.NET c.
中有一个单页应用程序。应用程序中的所有信息都是通过AJAX
调用加载的。根本没有POSTBACK
。但是,每次我单击从webservices
加载数据的不同菜单项时,它都会检查用户是否有有效的会话。由于没有postback
,当session
过期时,用户仍会看到主页面,当他们单击菜单项时,自会话过期后数据将不会加载(但用户不知道)
如果有postback
,我确实知道在会话到期时如何重定向到登录页面,但是如果没有postback
,我如何才能获得相同的结果?用户首先是如何登录的?如果他们从不同的页面登录,您必须将他们重定向到要登录的页面。如果在单页应用程序中执行此操作,则web服务调用需要返回指示会话状态的标志。如果会话过期,ajax调用将触发登录视图。希望能有所帮助。这里想到的唯一一件事是使用对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;
}
}
}
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();
});
我希望它有用:)。我能够解决这个问题。这是我的方法
在default.aspx的pageload
中,我从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函数
进行倒计时,并在达到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'
});
}
函数SessionExpireAlert(超时){
var秒=超时/1000;
document.getElementsByName(“secondsIdle”).innerHTML=seconds;
setInterval(函数(){
秒--;
document.getElementById(“secondsIdle”).innerHTML=seconds;
}, 1000);
setTimeout(函数(){
//在超时20秒前显示弹出窗口。
toastr.info('您将在:''秒后注销。
单击此处以保持登录状态。,“警告”,
{超时:0,'position class':'toast tontainer',onclick:renewSessionState}
},超时-20*1000);
setTimeout(函数(){
window.location=“logout.aspx”;
},超时);
};
函数renewSessionState(){
$.ajax({
url:“/Handlers/Ping.ashx”,
方法:“发布”
});
}
注意*Ping.ashx
只是一个空的处理程序。用户使用login.aspx
页面登录。一旦用户成功登录,我设置会话变量并将用户重定向到default.aspx
但是,在重定向之后,默认页面中发生的所有事情都没有回发。感谢您的回复。会话长度在我的应用程序的webconfig文件中设置。webservices如何知道会话是否过期?您是wecome:)。AJAX调用将每隔5秒调用一次webservice,它将检查您可以在登录序列中使用伪值设置的会话值(如果您使用的是asp:login,则可以在OnLoggedIn事件中进行设置)。在我的示例中,一旦会话本身过期,检查将返回一个空值,使webservice返回-1,AJAX函数将重定向到google.com。这是一个很好的选择,如果您能将我的建议标记为一个答案,那就太好了,因为我认为它很有帮助-但是我看到了一个小警告:如果出于某种原因,您的web.config文件中有slidingExpiration=true,那么超时将不会同步。此外,您还依赖于浏览器的计时器,可以使用简单的控制台javascript函数或greasemonkey脚本更改超时。服务器端方式更安全,IMHO:P