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

如何优雅地处理Ajax调用的登录过期?,ajax,rest,authentication,login,jwt,Ajax,Rest,Authentication,Login,Jwt,我的web应用程序由大量对服务器端restfulAPI的Ajax调用组成。每次客户登录我的站点时,登录页面都会从服务器获取一个JWT(JSON Web令牌)令牌,并将其存储为客户端的cookie。(我选择将其存储为cookie,因为这是让浏览器自动发送的唯一方法,据说比HTML5网络存储更安全)。令牌中有一个字段描述令牌的过期日期。对于每个Ajax调用,都会发送令牌进行身份验证 如果客户端在我的页面上停留很长时间,令牌可能会过期。当客户端发出下一个HTTP请求(不仅仅是REST调用)时,服务器将

我的web应用程序由大量对服务器端
restfulAPI
的Ajax调用组成。每次客户登录我的站点时,登录页面都会从服务器获取一个
JWT
(JSON Web令牌)令牌,并将其存储为客户端的
cookie
。(我选择将其存储为cookie,因为这是让浏览器自动发送的唯一方法,据说比HTML5网络存储更安全)。令牌中有一个字段描述令牌的过期日期。对于每个Ajax调用,都会发送令牌进行身份验证

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

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

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

  • 对于源自
    Ajax
    的HTTP请求,似乎我需要向
    每个
    Ajax调用的
    完成处理程序添加额外的逻辑,以检测到登录页面响应的重定向,并强制执行
    使页面跳转

还是我完全走错了路

部分参考文献:

添加1:

看起来浏览器将透明地处理302重定向因此,也许我可以返回302重定向到登录页面,无论是ajax调用还是普通页面访问。我稍后会尝试响应

发件人:

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


是的,我想你是对的

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


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

正是出于这个原因,web API不应在令牌过期时使用
302重定向
,而应使用
401未经授权的
进行响应


Web应用程序应该返回
302
响应,因为它们总是被类似浏览器的代理使用。有关更多信息,请参见。

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

整洁的解决方案是返回带有错误消息的json对象,并显示该错误消息。或者,使用javascript更改登录页面的位置,您可以使用一个用于处理会话过期的

尝试捕获
.ajaxError()
,然后检查它是否是会话到期或其他原因,并相应地进行操作


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

嗯,直到现在我才知道这件事。似乎有一个
HTTP约定要遵循。非常感谢!顺便说一句,这并不是说web API永远不会返回302响应。如果资源实际移动了,返回301或302是完全正确的。但它不应用于实现web API IMO.Yes的身份验证机制。形式服从功能。