我有一个与这个问题有些相似的问题,但我会尝试解释我对正在发生的事情的理解以及我想出什么想法来解决它。希望那时有人能够在正确的轨道上激起我的兴趣。
场景:在我的 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 请求。
我不知道解决这个问题的最佳方法是什么,任何帮助将不胜感激!
任