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

时间:2015-12-17 02:51:04

标签: ajax rest authentication login jwt

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

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

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

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

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

还是我完全错了?

有些参考:

JWT (JSON Web Token) automatic prolongation of expiration

Which authentication strategy should I use for my API?

Implicit & Explicit authentication

ADD 1:

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

来自here

  

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

Catching 302 FOUND in JavaScript

How to manage a redirect request after a jQuery Ajax call

4 个答案:

答案 0 :(得分:10)

正是出于这个原因,网络API不应该使用302 redirect,而应该在令牌过期时使用401 unauthorized

Web应用程序应该返回302个响应,因为它们总是被浏览器代理使用。有关详细信息,请参阅my answer here

答案 1 :(得分:3)

是的,我认为你是对的。

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

您通常可以使用Global Ajax Event Handler来处理会话过期。

尝试捕获.ajaxError(),然后检查会话是否到期或其他内容,并采取相应的行为。

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