我有一个客户过滤器属性来检查我的.Net MVC应用程序中的过期会话,该应用程序在标准html表单上工作正常。但是,当我将该属性应用于由Ajax表单调用并且会话已过期的操作时,它会将登录页面(其中filter属性重定向上下文)重新加载到ajax更新容器中。如果在进行ajax调用时会话过期,或者有人知道如何更优雅地处理这种情况,有没有人知道如何让整个页面重定向到登录页面?提前谢谢。
public class SessionExpiredFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpContext ctx = HttpContext.Current;
// check if session is supported
if (ctx.Session != null)
{
// check if a new session id was generated
if (ctx.Session.IsNewSession)
{
// If it says it is a new session, but an existing cookie exists, then it must
// have timed out
string sessionCookie = ctx.Request.Headers["Cookie"];
if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0))
{
//SessionHelper.AddPageMessage("message", "Your session has expired. Please login to continue");
ctx.Response.Redirect("~/Account/Logon");
}
}
}
base.OnActionExecuting(filterContext);
}
}
答案 0 :(得分:0)
我为此发布了原始问题,我想我终于找到了解决方案。虽然它没有我希望的那么优雅,但它的确有效(这比我迄今为止发现的要多)。解决方案围绕着OnBegin AjaxOption和一些Jquery。我的ActionLink(也可能是应用它的Ajax.BeginForm)看起来像这样
<%= Ajax.ActionLink("Do Ajax Function", "AjaxAction", new { }, new AjaxOptions { OnBegin="check_session", OnSuccess = "ajaxSuccess", UpdateTargetId = "update_container"}, new { })%>
我的帐户控制器中有一个控制器操作来检查会话,在我的情况下,我存储用户对象,所以我检查它是否为空,并返回'True'或'False'作为内容。 OutputCache非常重要,否则您的结果将被缓存。
[OutputCache(Duration=0, VaryByParam="None")]
public ActionResult CheckAjaxSessionExpired()
{
bool _sessionExpired = false;
if (Session["User"] == null)
{
_sessionExpired = true;
}
return Content(_sessionExpired.ToString());
}
最后一部分是指定为OnBegin处理程序的check_session
函数。 Jquery ajax调用命中会话检查操作并检查响应。如果响应为“True”(意味着会话已过期),则会将页面的位置设置回主页(在本例中为google)。
function check_session(){
var url = '<%= Url.Action("CheckAjaxSessionExpired", "Account") %>';
//GET CHECK SESSION
$.ajax({
url: url,
success: function(data) {
//alert(data);
if (data == "True"){
document.location = "http://www.google.com";
}
},
error: function() { alert("there was a problem loading the ajax session check"); }
});
}
使用此方法时需要记住几件事。
首先是它将以异步方式运行。如果您有要调用的数据敏感代码,则仍需要对会话执行服务器端检查。如果会话在ajax调用期间过期,则此代码仅用于重定向到登录页面(或主页)。
第二件事是check_session
函数需要连接到所有Ajax调用的OnBegin
事件中。
如果有人对改进这种方法有任何提示或建议,我很乐意听到。我希望这有助于某人。