2

在其他朋友的帮助下,我设法从这个主题中找到了解决我的问题的方法:Reusable way to allow an account to be used on a time

我有一个 SingleLogin 类,它继承自 AuthorizeAttribute 并实现自定义 AuthorizeCore 方法,以实现我的单登录代码的可重用性:

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        bool isAuthorized = base.AuthorizeCore(httpContext);

        if (isAuthorized)
        {
            int userId = (int)WebSecurity.CurrentUserId;
            using (var db = new UsersContext())
            {
                if ((httpContext.Session.SessionID != db.getSessionId(userId))
                    || db.getSessionId(userId) == null)
                {
                    WebSecurity.Logout();
                    isAuthorized = false;
                    httpContext.Response.Redirect("/Home/Index");
                }
            }
        }

        return isAuthorized;
    }

一切正常,除了我的 JsonResult 操作:

    [HttpPost]
    public JsonResult MessageSave(string message)
    {
        bool messageSaved = false;
        int userId = (int)WebSecurity.CurrentUserId;
        message = HttpUtility.HtmlEncode(message);

        // Model method - adding chat log - db
        db.addChatLog(message, userId);
        messageSaved = true;

        return Json(new { messageSaved = messageSaved });
    }

此方法由 Ajax POST 调用触发,您可以在下面的代码示例中看到。只是基本的POST。

编辑 3 请检查这些图片: http: //imgur.com/a/Cjael .. 嗯我猜 POST 确实触发了,但不知道为什么我的警报在我尝试在 $.ajax 之前测试它时不起作用......正如您在响应中看到的那样,我确实得到了主页/索引页面,但我没有立即重定向到主页/索引(文本留在文本框内,页面只是等待..),我必须再按一次输入才能被重定向..很奇怪。

EDIT2 似乎我什至无法在我退出后访问我的 jQuery。我在我的 .js 文件中放置了一些警报。

我有一个单独的 .js 文件,然后将其作为 .js 文件放入我的视图中<script src="~/Scripts/custom/homeChat.js"></script>。我通过 HTML5 数据将 Razor 值从 View 传递到我的 JS 文件中。

我的 textBox 元素 #txtMsg 触发了我的 jQuery 事件,因此当我注销时它可能不再识别我的 textBox 元素,并且不会触发我的 jQuery 事件?

在视图中触发 .js 的元素是: @Html.TextBox("txtMsg")

JS:

$("#txtMsg").keypress(function (e) {

        //when enter
        if (e.which == 13) {
            alert("ALERT DOESNT TRIGGER");

                $.ajax({
                    type: "POST",
                    url: url,
                    data: JSON.stringify({ message: input }),
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function (data) {
                        if (data.messageSaved) {
                            $("#txtMsg").val("");
                        }
                        else {
                            window.location.href = urlhome;
                        }
                    }
                });
            }
        }
    });

所以,如果你甚至不能参加你的活动,你怎么知道出了什么问题?我有这个˙HandleUnauthorizedRequest,但如果我理解正确,你需要进入你的 jQuery 事件(在我的情况下,上面的 js 代码中的.keypress)才能工作。

编辑:附加说明

所以让我解释一下这个场景。如果我在 Firefox 中使用我的用户名“john”登录,然后再次使用来自 chrome 的用户名“john”登录,我在 Firefox 中执行的下一个操作,它将注销我并将我重定向到 Home/Index,因为其他人在 Chrome 中进行了新登录.

那没问题。由于您不再登录,因此如果您的操作是正常的 ActionResult 并返回视图,您将正常重定向到您的主页/索引。

我遇到的问题是,我在页面中有一些其他功能,它使用 Ajax POST,并且由于您已注销,因此您无法发布到该 JsonResult 操作,因此您甚至无法接收错误回调,从而重定向您到主页/索引。我在我的 JS 中添加了一些警报,但没有触发警报,这是正常的,因为无论如何我都不再被允许访问该页面。如果我希望我的 onEnter 文本框将我重定向到 Home/Index,我必须按两次 Enter。这就是所有可以做的吗?

我对这个 AJAX 问题的最佳方法很感兴趣。我不知道我应该怎么称呼它,但正如我从上一个主题中读到的那样,它被称为“处理 AJAX 超时”?

非常感谢。

4

2 回答 2

2

您可以通过这种方式处理 AJAX 请求的错误

$.ajax({
    type: "POST",
    url: url,
    data: JSON.stringify({ message: input }),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (data) {
        if (data.messageSaved) {
            $("#txtMsg").val("");
        }
        else {
            window.location.href = urlhome;
        }
    },
    error: function(xhr, status, error) {
        // TODO: may be check error or status or xhr.statusCode()
        window.location.href = urlhome;
    }
});

jQuery$.ajax()文档

于 2013-08-09T13:07:37.493 回答
2

如果理解正确,您想要处理未经授权的 ajax 请求

在这种情况下,您可以覆盖HandleUnauthorizedRequest属性中的方法:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
    if (filterContext.HttpContext.Request.IsAjaxRequest()) 
    {
        filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden;
        filterContext.Result = new JsonResult();
    }
    else
    {
        filterContext.Result = new HttpStatusCodeResult((int)HttpStatusCode.Forbidden);
    }
}
于 2013-08-09T12:54:47.100 回答