1

我有一个与这个问题有些相似的问题但我会尝试解释我对正在发生的事情的理解以及我想出什么想法来解决它。希望那时有人能够在正确的轨道上激起我的兴趣。

场景:在我的 web 应用程序中,受保护领域中的经过身份验证的用户超时。然后他执行 ajax 调用(使用 jquery),期望 json 作为返回值。

配置:网络服务器是 tomcat,这是 web.xml 中的配置代码:

<session-config>
  <session-timeout>30</session-timeout>
  <tracking-mode>COOKIE</tracking-mode>
</session-config>
...
<login-config>
  <auth-method>FORM</auth-method>
  <realm-name>My Authentication Area</realm-name>
  <form-login-config>
    <form-login-page>/login.jsp</form-login-page>
    <form-error-page>/error.jsp</form-error-page>
  </form-login-config>
</login-config>

的理解:这告诉 Web 服务器在闲置 30 分钟后取消对用户的身份验证,如果他们尝试访问受保护的 url,则将未经身份验证的用户重定向到 login.jsp。

我所期望的:服务器返回一个 http 错误。用户被重定向到 login.jsp。

会发生什么:服务器返回 login.jsp 作为 ajax 调用的答案,其答案代码为 200。Jquery 然后抛出一个 parseerror,因为它无法将 html 解析为 json。用户留在页面上,似乎什么也没发生。

的理解:网络服务器从未将请求转发到 servlet,因为会话超时并且 url 处于受保护的领域。我不应该担心 servlet 代码。

我会做什么:使用 jQuery.ajaxError 全局事件来拦截所有解析错误。虽然这会减少样板代码,但它可能无法涵盖所有​​情况。此外,如果由于某种原因返回的真正 json 带有一些损坏的语法也是不可接受的。

$(document).ajaxError(function(event, jqxhr, settings, exception){
   if (settings.dataType === 'json' && exception.type === 'unexpected_token') {
      window.location.href = 'login.jsp';
   }
})

我想做的事情:强制tomcat在响应ajax时发送http错误并在客户端处理重定向。我不知道 tomcat 是否可以区分标准 url 请求和 ajax 请求。

我不知道解决这个问题的最佳方法是什么,任何帮助将不胜感激!

4

2 回答 2

1

原来这是我的网络服务器的标准功能。

如何使其工作: 检查返回类型,如果它是 html 然后解析它以获得唯一的登录页面标记,然后相应地继续。我在 login.html 中添加了一个元标记:

<meta tag="login" />
于 2013-04-26T09:08:21.547 回答
0

请按照以下步骤操作。它对我有用。

1. 第 1 步 - 制作中心方法(例如在母版页中)

 $(document).ajaxStart(function () {
        $.ajax({
            type: "POST",
            url: 'Home.aspx/CheckSessionTimeout',
            async: false,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (result) {
                if (parseInt(result.d) == 0) {
                    window.location.href = 'Login.aspx';
                }
            },
            Error: function (msg) {
                window.location.href = 'Login.aspx';
            }
        });

2. Step - 2 在 Home.aspx 页面中创建一个 web 方法

[WebMethod(EnableSession = true)]
    public static int CheckSessionTimeout()
    {
        if (HttpContext.Current.Session[LoginuserID] != null)
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }

.master 页面中添加的 Webmethod 不会被调用。您可以将其添加到 .asmx 文件、.ascx 控件或 .aspx 页面中。

请注意,在 AJAX 请求中,contentType 和 dataType 等参数对于获取 Ajax 格式的结果是最重要的,否则它将返回整个 HTML 页面。所以,请不要忘记提及它....!!!

好的,你现在工作吗……!!!

于 2015-07-15T11:36:15.863 回答