我听说 RESTful API should be stateless. All state info should be kept on client side
.
但是当我从网页发出ajax调用时,我注意到会话ID cookie总是被发送到服务器 . 使用该会话ID,我可以在服务器上获取会话对象 . 因此我可以 get/set some state info in the session
.
这会破坏RESTful API的 code of being stateless
吗?
ADD 1
(我的问题的背景如下 . )
我尝试通过调用RESTful API来实现登录页面以验证用户名和密码 .
每次用户尝试访问我的网站页面时,登录 servlet filter
将检查该用户的 session
(这是 getSession()
被调用的地方)以查看是否存在有效的登录信息 . 如果没有,登录过滤器会将用户重定向到登录页面 .
在登录页面上,使用用户名和密码对服务器上的RESTful API进行ajax调用 . 根据RESTful API的返回结果,页面上的JavaScript将决定是否让用户进入我的站点 .
所以,在这种情况下,我必须使用 session
.
1 回答
在REST应用程序中,每个请求必须包含服务器必须理解的所有信息,而不是依赖于服务器记住先前的请求 .
在服务器上存储会话状态违反了REST体系结构的无状态约束 . 因此会话状态必须完全由客户端处理 .
继续阅读以了解更多详情 .
会话状态
传统Web应用程序使用远程会话 . 在这种方法中,应用程序状态完全保留在服务器上 . 请参阅Roy T. Fielding的dissertation中的以下引用:
虽然这种方法带来了一些优势,但它降低了服务器的可扩展性:
无状态约束
REST架构样式是在包含服务器无状态的集合约束的顶部定义的 . 根据Fielding,REST无状态约束定义如下:
此约束会导致可见性,可靠性和可伸缩性的属性:
身份验证和授权
如果客户端请求需要身份验证的受保护资源,则每个请求都必须包含要经过适当身份验证/授权的所有必需数据 . 请参阅RFC 7235中的这句话:
身份验证数据应属于标准HTTP Authorization标头 . 来自RFC 7235:
此HTTP标头的名称很不幸,因为它带有身份验证而不是授权数据 .
对于身份验证,您可以使用Basic HTTP Authentication方案,该方案使用Base64编码作为用户名和密码对传输凭据:
如果您不想在每个请求中发送用户名和密码,则可以将用户名和密码交换为令牌(例如as JWT)在每个请求中发送 . JWT可以包含用户名,到期日期以及可能与您的应用程序相关的任何其他元数据:
您的服务器可能出现问题
一旦你有一个会话标识符,我想在你的应用程序的某个地方正在创建一个HTTP会话 . 它可以在您自己的代码中或您正在使用的框架的代码中 .
在Java应用程序中,必须确保调用以下方法: not :
HttpServletRequest#getSession()
HttpServletRequest#getSession(boolean)与
true