gpt4 book ai didi

asp.net-mvc - Asp.net MVC - 如何检查 Ajax 请求的 session 过期

转载 作者:行者123 更新时间:2023-12-03 18:49:39 27 4
gpt4 key购买 nike

我们在整个应用程序中使用 Ajax 调用 - 试图找出一个全局解决方案,如果在尝试执行任何 Ajax 请求时 session 已经过期,则重定向到登录页面。我从这篇文章中获得了帮助,编写了以下解决方案 - Handling session timeout in ajax calls

不知道为什么在我的护理事件“HandleUnauthorizedRequest”没有被解雇。

自定义属性:

 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class CheckSessionExpireAttribute :AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
var url = new UrlHelper(filterContext.RequestContext);
var loginUrl = url.Content("/Default.aspx");

filterContext.HttpContext.Session.RemoveAll();
filterContext.HttpContext.Response.StatusCode = 403;
filterContext.HttpContext.Response.Redirect(loginUrl, false);
filterContext.Result = new EmptyResult();
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}

}

}

在 Controller 操作中使用上述自定义属性如下:
 [NoCache]
[CheckSessionExpire]
public ActionResult GetSomething()
{
}

AJAX 调用(JS 部分):
function GetSomething()
{
$.ajax({
cache: false,
type: "GET",
async: true,
url: "/Customer/GetSomething",
success: function (data) {

},
error: function (xhr, ajaxOptions, thrownError) {

}
}

Web 配置身份验证设置:
  <authentication mode="Forms">
<forms loginUrl="default.aspx" protection="All" timeout="3000" slidingExpiration="true" />
</authentication>

我尝试通过在进行 ajax 调用之前删除浏览器 cooking 来检查它,但事件“CheckSessionExpireAttribute”不会被触发 - 请知道。

谢谢,

@保罗

最佳答案

如果我的问题是正确的(即使我没有回答,谢谢,帮助我解决了我自己的情况),您想要避免的是让您的登录页面加载到一个应该通过以下方式显示不同 View 的元素中 Ajax 。或者在 Ajax 表单发布期间获得异常/错误状态代码。

因此,简而言之,注解类将需要覆盖 2 个方法,而不仅仅是 HandleUnauthorizedRequest ,它将重定向到一个 JsonResult Action ,该 Action 将为您的 Ajax 函数生成参数以了解该做什么。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class SessionTimeoutAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
IPrincipal user = filterContext.HttpContext.User;
base.OnAuthorization(filterContext);
if (!user.Identity.IsAuthenticated) {
HandleUnauthorizedRequest(filterContext);
}
}

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new RedirectToRouteResult(new
RouteValueDictionary(new { controller = "AccountController", action = "Timeout" }));
}
}
}

然后在你的身份验证 Action 中设置这个注解,这样每次调用它时,它就会知道请求来自哪里,以及它应该给出什么样的返回。
[AllowAnonymous]
[SessionTimeout]
public ActionResult Login() { }

然后你重定向的 Json Action :
[AllowAnonymous]
public JsonResult Timeout()
{
// For you to display an error message when the login page is loaded, in case you want it
TempData["hasError"] = true;
TempData["errorMessage"] = "Your session expired, please log-in again.";

return Json(new
{
@timeout = true,
url = Url.Content("~/AccountController/Login")
}, JsonRequestBehavior.AllowGet);
}

然后在您的客户端函数中(我有幸将其写为 $.get() 而不是 $.ajax() :
$(document).ready(function () {
$("[data-ajax-render-html]").each(function () {
var partial = $(this).attr("data-ajax-render-html");
var obj = $(this);

$.get(partial, function (data) {
if (data.timeout) {
window.location.href = data.url;
} else {
obj.replaceWith(data);
}
}).fail(function () {
obj.replaceWith("Error: It wasn't possible to load the element");
});
});
});

这个函数用这个 data-ajax-render-html 替换 html 标签属性,包含你要加载的View地址,但是你可以通过更改 replaceWith来设置加载到标签内为 html()属性(property)。

关于asp.net-mvc - Asp.net MVC - 如何检查 Ajax 请求的 session 过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46210805/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com