会话超时时调用 Ajax

2023-12-31

所有,如果在会话超时时进行 ajax 调用,我会尝试重定向到登录页面。 这是我到目前为止所做的。

为所有操作定义一个操作过滤器。

public class AuthenticateFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            var routeDataSet = filterContext.RouteData;
            if (LoginUser.LoginAdministrator == null)
            {
                //if the useinfo stored in session is timeout. 
                if (routeDataSet != null
                    && routeDataSet.Values["controller"] != null
                    && routeDataSet.Values["controller"].ToString().ToLower().Equals("login")
                    && routeDataSet.Values["action"] != null
                    && routeDataSet.Values["action"].ToString().ToLower().Equals("login"))
                {
                    //if it is login action itself.let it be. don't do anything.


                }
                else
                {
                    //redirect to login page.
                    filterContext.Result = new RedirectToRouteResult(
                        new RouteValueDictionary { { "controller", "Login" }, { "action", "Login" } });
                }
            }
        }
    }

这适用于会话超时时的非 ajax 操作调用。但对于ajax调用。它不能不重定向到登录页面,而只返回一个html页面字符串(似乎是登录页面的源html代码),而不是真正的结果。 假设我们有这样的代码。

function ajaxGetLogDetail(logId) {
        var sUrl = "/LogDetail/index?logId=" + logId;
        $.ajax({
            cache: false,
            type: "GET",
            async: false,
            url: sUrl,
            success: function (result) {
                //please note result is html string. not the really result.
            },
            error: function (xhr) {
                alert(xhr.responseText);
            }
        });
    }

有人可以帮我提供一些解决这个问题的线索吗?谢谢。

Updated

根据 Mohsin 和 Dave 的回答(谢谢你们两个),这是最终的解决方案。请查看。谢谢。

public class AuthenticateFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            var routeDataSet = filterContext.RouteData;
            if (LoginUser.LoginAdministrator == null)
            {

                //&& routeDataSet != null && routeDataSet.Values["controller"] != null
                //&& !routeDataSet.Values["controller"].ToString().ToLower().Equals("login") && routeDataSet.Values["action"] != null
                //&& !routeDataSet.Values["action"].ToString().ToLower().Equals("login") && !filterContext.HttpContext.Request.HttpMethod.ToLower().Equals("get"))
                if (routeDataSet != null
                    && routeDataSet.Values["controller"] != null
                    && routeDataSet.Values["controller"].ToString().ToLower().Equals("login")
                    && routeDataSet.Values["action"] != null
                    && routeDataSet.Values["action"].ToString().ToLower().Equals("login"))
                {



                }
                else
                {
                    if (filterContext.HttpContext.Request.IsAjaxRequest())
                    {
                        filterContext.Result = new JsonResult
                        {
                            Data = new
                            {
                                ErrorMessage = "SystemSessionTimeOut"
                            },
                            JsonRequestBehavior = JsonRequestBehavior.AllowGet
                        };
                    }
                    else
                    {
                        filterContext.Result = new RedirectToRouteResult(
                            new RouteValueDictionary { { "controller", "Login" }, { "action", "Login" } });
                    }
                }
            }
        }
    }

在客户端:

function ajaxGetLogDetail(logId) {
        var sUrl = "/LogDetail/index?logId=" + logId;
        $.ajax({
            cache: false,
            type: "GET",
            async: false,
            url: sUrl,
            success: function (result) {
                if (result.ErrorMessage=="SystemSessionTimeOut")
                {
                   windows.location="/Login/Login";
                } 
                else
                {
                   //...  
                }
            },
            error: function (xhr) {
                alert(xhr.responseText);
            }
        });
    }

Ajax 调用不能返回任何类型的重定向。 AJAX 调用的核心仅返回一个字符串。没有执行重定向的引擎。

不过,您可以执行客户端重定向。如果会话超时并且在客户端让您的控制器方法返回 false:

     if !(routeDataSet != null
         && routeDataSet.Values["controller"] != null
         && routeDataSet.Values["controller"].ToString().ToLower().Equals("login")
         && routeDataSet.Values["action"] != null
         && routeDataSet.Values["action"].ToString().ToLower().Equals("login"))
      {
        return Json(new { success = false, message = errorMessage });
      }

在你的 AJAX 中error功能:

        error: function (xhr) {
            alert(xhr.responseText);
            window.location='/Login/Login';
        }

边注:您的目的地是“/Login/Login”还是“/Account/Login”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

会话超时时调用 Ajax 的相关文章

随机推荐

  • kubespray 仪表板警告禁止弹出窗口

    我正在尝试使用 kubespray 在一台机器上设置一个新的 kubernetes 集群 提交 7e84de2ae116f624b570eadc28022e924bd273bc 运行剧本后 在新的 ubuntu 16 04 上 我打开仪表板
  • knockout.js 真的采用了 MVVM 模式吗?

    我是 knockout js 的新手 不久前我读到了 ko 的标题特征 我不明白ko真的是MVVVM吗 因为他们谈论的只是数据绑定及其易用性 但我确信 MVVM 不仅仅是数据绑定 不是吗 是的 knockout js 确实应用了 MVVM
  • 如何使用 sqlalchemy 在 Docker 中访问 postgresql?

    我正在尝试使用 SQLAlchemy 与 dockerized PostgreSQL 服务器交互 就像是 engine create engine postgresql user user password localhost 5432 d
  • 如何在RTL中使用时钟门控?

    我正在对一些时钟进行门控latch以及我设计中的逻辑 我在综合和布局布线方面没有太多经验 在 RTL 中实现时钟门控的正确方法是什么 示例1 always comb begin gated clk clk latch update en e
  • 如何使用 connect w/ Redux 从 this.props 获得简单的调度?

    我有一个简单的 React 组件 可以连接 映射一个简单的数组 状态 为了避免引用商店的上下文 我想要一种直接从道具获取 调度 的方法 我见过其他人使用这种方法 但由于某种原因无法使用它 以下是我当前使用的每个 npm 依赖项的版本 rea
  • 在表单提交时,从 javascript 发送带有表单值的 mailto

    我有一个表单 当提交表单 输入类型 提交 时 我想使用预先填充的电子邮件消息打开客户端默认邮件浏览器 因此 当用户单击提交时 需要发生两件事 打开电子邮件并提交表格 另外 如何使用表单中输入的值来预填充电子邮件 我是 javascript
  • 找不到创建 iOS 应用程序开发证书的选项 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 请参阅此图片 iOS 应用程序开发选项已禁用 我如何启用它 您需要成为团队代理或管理员才能创建开发证书 Source https deve
  • C++ 错误:与“operator=”不匹配

    给数组赋值时遇到问题 我创建了一个名为Treasury 我创建了另一个类TradingBook我想包含一个全局数组Treasury可以从所有方法访问TradingBook 这是我的 TradingBook 和 Treasury 的头文件 c
  • 如何将数据传输到另一个页面

    海 我有一个包含 150 个控件的 ASP NET 页面 我想将这些控件的数据传输到另一个 ASP NET 页面 什么方法最适合这项任务 控制数量可能会增加 提前致谢 有很多方法 使用查询字符串 可能不适用于您的情况 仅适用于传输少量数据
  • 引用 IBM.Data.DB2 中的代码使得该程序集对我的解决方案的其余部分不可用

    我有一个包含三个程序集的 C 控制台应用程序 Main Common and Utilities 在一个文件中Main集会 Main cs 我有一行 using Utilities 在目录内Common程序集 我有DLLIBM Data D
  • 从 pmdarima 导入 auto_arima 时:错误:无法从 'scipy.misc' 导入名称 'factorial'

    我有 python 3 7 1 和 scipy 版本 1 3 0 我在调用 auto arima 时遇到错误 无法从 scipy misc 导入名称 factorial 只是这个基本的导入导致了问题 从 pmdarima arima 导入
  • Angular2 CLI:为什么“--prod”的包大小小于“--prod --aot”?

    我正在为一个项目使用最新的 angular cli beta 18 我知道 cli 仍处于非常早期的阶段 但我很困惑为什么我的最终包大小实际上更小without AoT 当我跑步时ng build prod 为 1 08 MB Asset
  • 将命令发送到现有 MATLAB IDE 命令窗口

    打开 MATLAB IDE 后 我们是否仍然可以从另一个进程写入其命令窗口 在 Windows 中 我们可以使用 MATLAB Engine API 附加到现有的 MATLAB 但这在 Linux Mac 中不起作用 Linux 下我们有什
  • 在 AngularJS 的 ionic 框架中使用 ui-router

    我正在开发一个使用离子框架的应用程序 这又使用了 ui router 目前 我有一个非常基本的两页应用程序 然而 它会扩大到更大 此时 当我从第一个视图转换到第二个视图时出现错误 错误说 TypeError Cannot read prop
  • 如何解决 Media type=multipart/form-data 错误未找到 MessageBodyWriter

    如何为简单的多表单帖子配置提供程序 任何建议 指示将不胜感激 堆栈跟踪 org glassfish jersey message internal MessageBodyProviderNotFoundException MessageBo
  • 从 ControlTemplate 中的样式 DataTrigger 进行模板绑定

    在下面的 XAML 中 我使用带边框的矩形作为 ToggleButton 的模板 我希望 BorderBrush 具有不同的颜色以反映 ToggleButton IsChecked 的变化值 不幸的是 我在这里尝试在 DataTrigger
  • pcap 纳秒 Python

    有没有办法使用现有的 python 库从 pcap 中获取纳秒 我有一个纳秒 pcap 文件 可以与 Wireshark 配合使用 但与 Python 配合使用效果很好库甚至不会导入该文件 此功能确实存在于 c libpcap 中 请参阅
  • YouTube v3 API 对于有效请求返回状态代码 400

    目前 我正在尝试使用 OAuth 对 YouTube API 执行看似简单的请求 我可以使用评论端点成功请求评论列表 但是 当尝试删除评论或设置其审核状态时 就会出现此问题 在审核状态更新的情况下 我将向以下地址执行 POST 当然使用有效
  • Swing 渲染器在列中显示完整文本会创建无限循环

    我想渲染一个摆动表 根据列中显示的文本量来调整行的高度 以便所有文本都显示在单元格中 问题是 当我设置行的高度时 会创建无限循环 我该如何解决呢 这是我的渲染器 final class RenderTextAreaMessage exten
  • 会话超时时调用 Ajax

    所有 如果在会话超时时进行 ajax 调用 我会尝试重定向到登录页面 这是我到目前为止所做的 为所有操作定义一个操作过滤器 public class AuthenticateFilterAttribute ActionFilterAttri