3

我有一个应用程序,其中大多数请求是通过 AJAX 提交的,尽管有些是通过“常规”HTTP 请求提交的。如果提交请求并且用户的会话已超时,则返回以下 JSON:

{"authentication":"required"}

提交所有 AJAX 请求的 JavaScript 函数通过显示弹出消息并将用户重定向回登录页面来处理此响应。

但是,当非 AJAX 请求收到此响应时,JSON 会简单地显示在浏览器中,因为响​​应是由浏览器直接处理的(即绕过上述 JavaScript 函数)。显然这并不理想,我希望收到此响应的非 AJAX 请求的行为与 AJAX 请求相同。为了实现这一点,我可以想到 2 个选项:

  1. 浏览应用程序并将所有请求转换为 AJAX 请求。这会起作用,但也可能需要很长时间!

  2. 上面显示的 JSON 是由一个非常简单的 JSP 生成的。我想知道是否有可能向这个 JSP 添加一个 JavaScript 事件处理程序,该处理程序在内容显示在浏览器中之前运行 - 我假设这永远不会被 AJAX 请求调用?此处理程序可以调用显示弹出窗口并执行重定向的其他 JavaScript 代码。

如果有人知道我如何准确地实现我在 (2) 中概述的处理程序,或者有任何其他潜在的解决方案,如果他们能将它们传递给我,我将不胜感激。

干杯,唐

4

4 回答 4

3

3) 更改您的 AJAX 代码以将变量添加到 GET 或 POST:outputJson=1

于 2008-10-31T16:38:33.643 回答
1

您不能以这种方式将处理程序添加到 JSP。您添加到其中的任何内容都会使其成为非 JSON 生成页面。

我可以看到两个选项: 通过将 URL 参数附加到修改输出的屏幕来将参数添加到页面。

URL: http://domain/page.jsp?ajaxRequest=true 只会输出 json

URL:http://domain/page.jsp 将显示一个可以转发到另一个页面的 jsp 页面。

或者

更改响应以在 JSP 中包含转发代码,如果直接点击该代码,该代码将由 Web 浏览器执行。然后让您调用 AJAX 去除转发代码,然后处理剩下的内容。

于 2008-10-31T16:39:06.277 回答
0

4) 阅读“接受”请求 HTTP 标头。

然后,在服务器端定制输出:

例如

if(Accept contains application/json...) { // client asking for json, likely  to be XHR
  return {"foo":"bar"}
} else { // other
  return "Location: /login-please";
}
于 2008-10-31T16:42:46.083 回答
0

从更智能的错误消息开始,如下所示:

{"error":"authentication required"}

将 JSON 输出包装在回调中:

errorHandler({"error":"authentication required"});

让处理程序在您的脚本中等待:

function errorHandler(r) {
   alert(r.error);
}

并且不要忘记将其发送下来 astext/javascript和 not application/x-json

于 2008-11-20T18:45:37.707 回答