【发布时间】:2016-03-11 20:19:51
【问题描述】:
我听说“RESTful API 应该是无状态的。所有状态信息都应该保存在客户端”。
但是当我从网页发出 AJAX 调用时,我注意到会话 ID cookie 总是被发送到服务器。使用该会话 ID,我可以获得服务器上的会话对象,因此我可以“获取/设置会话中的一些状态信息”。
这会破坏 RESTful API 的“无状态代码”吗?
添加 1
(我的问题背景如下。)
我尝试通过调用 RESTful API 来验证用户名和密码来实现登录页面。
每次用户尝试访问我网站的页面时,登录 servlet filter 将检查该用户的 session(这是调用 getSession() 的地方)以查看是否存在有效的登录信息。如果没有,登录过滤器会将用户重定向到登录页面。
在登录页面上,使用用户名和密码对服务器上的 RESTful API 进行 AJAX 调用。根据 RESTful API 调用的结果,页面上的 JavaScript 将决定是否让用户进入我的网站。
所以,在这种情况下,我不得不使用session。
【问题讨论】:
-
你不应该让客户端上的javascript决定是否让用户进入网站。客户端不可信。
-
好的,我很难在没有看到实际代码的情况下评论细节,但请记住,用户可以在运行之前更改客户端代码,并替换对登录功能的调用不断说登录没问题。
-
毫无疑问,REST API 不能依赖于 HTTP 会话。看看我前段时间提供的answer。它会给你一些关于如何执行身份验证的灵感。该方法使用令牌,但可以修改以涵盖其他类型的身份验证。
-
@CássioMazzochiMolin 我同意你的看法。但是为什么
HttpSession参数仍然可以在 RESTful API 签名中指定呢?看来Spring框架permits在RESTful API中使用了session。或者这只是依赖注入的副作用/巧合/误用? (参考:stackoverflow.com/questions/26588310/…) -
正如我之前提到的,nothing 会阻止您调用
HttpServletRequest.getSession()并打破 REST 无状态约束。你提到的问题链接a good question about common REST mistakes。
标签: rest