我有一个应用程序,其中大多数请求是通过AJAX提交的,尽管有些是通过“常规”HTTP请求提交的。如果提交了请求并且用户的会话超时,则返回以下JSON:
{"authentication":"required"}
提交所有AJAX请求的JavaScript函数通过显示弹出消息并将用户重定向回登录页面来处理此响应。
然而,当非AJAX请求收到此响应时,JSON只是在浏览器中显示,因为响应由浏览器直接处理(即绕过上述JavaScript函数)。显然这并不理想,我希望接收此响应的非AJAX请求与AJAX请求的行为相同。为了实现这一目标,我可以考虑两个选项:
浏览应用程序并将所有请求转换为AJAX请求。这可行,但也可能需要很长时间!
上面显示的JSON是由一个非常简单的JSP生成的。我想知道是否有可能向这个JSP添加一个JavaScript事件处理程序,它在浏览器中显示内容之前运行 - 我假设永远不会为AJAX请求调用它?此处理程序可以调用显示弹出窗口的其他JavaScript代码并执行重定向。
如果有人知道我是如何实现我在(2)中概述的处理程序,或者有任何其他可能的解决方案,我将非常感激,如果他们传递它们。
干杯, 唐
答案 0 :(得分:3)
3)更改您的AJAX代码,将变量添加到GET或POST:outputJson=1
答案 1 :(得分:1)
您不能以这种方式向JSP添加处理程序。您添加到它的任何内容都将使其成为非JSON生成页面。
我可以看到两个选项: 通过将URL参数附加到修改输出的屏幕来向页面添加参数。
网址:http://domain/page.jsp?ajaxRequest=true 只输出json
网址:http://domain/page.jsp 会显示一个可以转发到另一个页面的jsp页面。
OR
更改响应以使JSP中的转发代码(如果直接命中,将由Web浏览器执行)。然后让你的AJAX去掉转发代码,然后处理剩下的代码。
答案 2 :(得分:0)
4)阅读'Accept'请求HTTP标题。
然后,在服务器端定制输出:
e.g。
if(Accept contains application/json...) { // client asking for json, likely to be XHR
return {"foo":"bar"}
} else { // other
return "Location: /login-please";
}
答案 3 :(得分:0)
从更智能的错误消息开始,如下所示:
{"error":"authentication required"}
在回调中包装JSON输出:
errorHandler({"error":"authentication required"});
让脚本中的处理程序等待:
function errorHandler(r) {
alert(r.error);
}
不要忘记将其作为text/javascript
发送,而不是application/x-json
。