在我的一个Web应用程序中,我需要在5分钟内会话超时时弹出警报。用户可以选择继续扩展会话或立即注销。
在Web.config中将会话超时设置为30分钟:
<sessionState mode="InProc" timeout="30">
由于ASP.NET MVC没有提供检查剩余会话超时的方法,我提出了如下解决方案:
在Global.asax中,它将当前会话的上次访问时间作为会话变量进行跟踪。如果进入请求不是会话状态只读(见下文),则使用当前时间更新上次访问时间会话变量。否则,会话变量的值将设置为当前时间。
protected void Application_AcquireRequestState(object sender, EventArgs e)
{
var context = HttpContext.Current;
if (context != null && context.Session != null && !context.Session.IsReadOnly)
{
context.Session["_LastAccessTime"] = DateTime.Now;
}
}
在我的会话控制器中,我将会话状态行为设置为只读。 对此控制器的请求既不会重置会话也不会刷新上次访问时间会话变量。
[SessionState(SessionStateBehavior.ReadOnly)]
public class SessionController : BaseController
{
[AjaxOnly]
public ActionResult GetRemainingSessionTimeout()
{
if (!Request.IsAjaxRequest())
{
return Content("Not an Ajax call.");
}
var remainingSessionTimeout = 0;
if (Session["_LastAccessTime"] != null)
{
var lastAccessTime = (DateTime) Session["_LastAccessTime"];
var timeSpan = DateTime.Now.Subtract(lastAccessTime);
remainingSessionTimeout = Session.Timeout - timeSpan.Minutes;
}
return Json(new {RemainingSessionTimeout = remainingSessionTimeout}, JsonRequestBehavior.AllowGet);
}
}
在视图中,Ajax请求以静默方式检查剩余的会话超时。如果少于5分钟,则弹出警报:
$(document).ready(function () {
$("#remainingSessionTimeout").click(function (e) {
var url = '@Url.Action("GetRemainingSessionTimeout", "Session", new { area = "" })';
$.ajax({
type: "POST",
url: url,
data: {},
success: function (result) {
$("#timeoutLeft").html('Your session expries in ' + result.Timeout * 60 + ' seconds.');
},
error: function (result) {
$("#timeoutLeft").html('error in getting session data.');
}
});
});
});
此解决方案的任何缺点或缺陷?感谢。