我的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)必须使对象使用该错误页面作为响应。
答案 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()
,然后检查会话是否到期或其他内容,并采取相应的行为。
说实话,我没有尝试这一点,但值得一试。