问题 如何优雅地处理Ajax调用的登录过期?


我的Web应用程序由许多服务器端的Ajax调用组成 RESTful APIs。每次客户登录我的网站时,登录页面都会得到一个 JWT 来自服务器的(JSON Web Token)令牌并将其存储为 cookie 在客户端。 (我选择将其存储为cookie,因为这是让浏览器自动发送它的唯一方法,据说它比HTML5 Web存储更安全)。令牌中有一个字段描述令牌的到期日期。对于每个Ajax调用,将发送令牌以进行身份​​验证。

如果客户端长时间停留在我的页面上,则令牌可能会过期。当客户端发出下一个HTTP请求(而不仅仅是REST调用)时,服务器将检测到它。我用了一个 servlet filter 拦截 all HTTP请求并检查令牌是否过期。如果令牌过期,a 重定向到登录页面 回复将被发送。

但是上面的方法存在一个问题:“如何优雅地处理 重定向到登录页面 在客户端响应?“

  • 对于 non-Ajax 发起HTTP请求,我可以依靠浏览器来处理重定向到登录页面的响应并自动跳转页面。

  • 对于 Ajax 发起HTTP请求,似乎我需要添加额外的逻辑 each ajax电话 completion handler 检测重定向到登录页面的响应和 imperatively 让页面跳转。

还是我完全错了?

一些参考:

JWT(JSON Web Token)自动延长到期时间

我应该为我的API使用哪种身份验证策略?

隐式和显式身份验证

添加1:

浏览器似乎会透明地处理302重定向。 所以也许我可以只返回302重定向到登录页面,无论是ajax调用还是普通页面访问。 我会尽力回复。

这里

如果响应是HTTP重定向(状态代码301,302,303或   307),然后必须透明地遵循(除非它违反   安全性或无限循环预防措施)。任何其他错误(包括   401)必须使对象使用该错误页面作为响应。

在JavaScript中捕获302 FOUND

如何在jQuery Ajax调用之后管理重定向请求


12125
2017-12-17 02:51


起源



答案:


出于这个原因,Web API不应该响应 302 redirect但是 401 unauthorized 令牌过期时

Web应用程序应该返回 302 响应,因为它们总是被浏览器像代理一样消费。有关更多信息,请参阅 我的答案在这里


9
2017-12-17 06:02



嗯,直到现在我才知道这件事。似乎有一个 HTTP convention 跟随。非常感谢! - smwikipedia
顺便说一句,这并不是说Web API永远不会返回302响应。如果资源实际移动,则返回301或302完全没问题。但它不应该用于实现Web API IMO的身份验证机制。 - MvdD
是。 表格遵循功能。 - smwikipedia


答案:


出于这个原因,Web API不应该响应 302 redirect但是 401 unauthorized 令牌过期时

Web应用程序应该返回 302 响应,因为它们总是被浏览器像代理一样消费。有关更多信息,请参阅 我的答案在这里


9
2017-12-17 06:02



嗯,直到现在我才知道这件事。似乎有一个 HTTP convention 跟随。非常感谢! - smwikipedia
顺便说一句,这并不是说Web API永远不会返回302响应。如果资源实际移动,则返回301或302完全没问题。但它不应该用于实现Web API IMO的身份验证机制。 - MvdD
是。 表格遵循功能。 - smwikipedia


302重定向不适用于javascript(ajax)调用,它只会在javascript中调用新页面,而不是实际的浏览器。

简洁的解决方案是返回一个带有错误消息的json对象并显示该错误消息。或者然后使用javascript将位置更改为登录页面


2
2018-01-13 05:10





是的,我认为你是对的。

对于 非Ajax,您可以使用重定向在服务端处理它。

对于 阿贾克斯,您可以根据ajax结果切换页面。


2
2017-12-17 05:28





你可以用一个 全局Ajax事件处理程序 通常用于处理会话到期。

试着赶上 .ajaxError() ,然后检查它的会话是否到期或其他什么,并相应地表现。

我没有说实话,但值得一试。


1
2018-01-13 05:24