会话超时时,Ajax返回登录页面而不是错误

时间:2013-02-07 17:48:15

标签: jquery ajax tomcat session-timeout

我有一个与one有点类似的问题,但我会试着解释一下我对正在发生的事情的理解以及我想出来解决它的想法。希望有人能够在正确的轨道上激励我。

方案:在我的网络应用中,受保护领域中经过身份验证的用户超时。然后他执行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,因为会话超时且网址位于受保护的域中。我不应该担心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请求。

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

2 个答案:

答案 0 :(得分:1)

事实证明这是我的网络服务器的标准功能。

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

<meta tag="login" />

答案 1 :(得分: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。步骤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页面。所以,请不要忘记提及它...... !!!

好的,你现在工作...... !!!