宁静服务如何识别哪个用户调用哪种方法以及如何使休息服务成为有状态?

时间:2016-11-11 07:43:54

标签: java rest stateless stateful

作为休息服务stateless,它不会维护用户的任何互动,因此我想知道多个用户是否访问相同的休息服务,然后restful service如何识别哪个用户与哪个用户进行互动方法 ?是否可以像stateful那样提供宁静的服务?

3 个答案:

答案 0 :(得分:1)

哪位用户:

使用在服务器上创建的共享密钥(一行字符),并在每次下一个请求时返回。

它被“保存”在cookie中并由客户端使用cookie或HTTP(S)标头返回。

哪种方法:

这取决于您使用的框架。但最终归结为将URI映射到您的方法。

  

是否有可能将有条不紊的服务作为有状态的?

你可以创建有状态的应用程序,然后他们就不会安静。一个宁静的应用程序是无国籍的。这就是定义,所以你可以创建有状态的应用程序,但你永远不能创建一个有状态的rest-app,因为rest是无状态的。

答案 1 :(得分:0)

根据我的观点,Restful web service作为一个无状态。具有一系列约束和属性的架构风格,因此它的属性是无状态的,我们不能改变它的属性,因此它并不意味着宁静的服务是有状态的。 / p>

我们可以将URI映射到您的方法,然后宁静地知道哪个用户正在调用哪个方法。

答案 2 :(得分:0)

TL;博士

客户端必须存储自己的会话状态,并在每个请求中将其传递给服务器。

无状态约束

REST架构风格的无状态约束定义如下:

  

5.1.3 Stateless

     

[...]从客户端到服务器的每个请求必须包含理解请求所需的所有信息,并且不能利用服务器上任何存储的上下文。因此,会话状态完全保留在客户端上。 [...]

验证

如果客户端请求需要身份验证的受保护资源,则每个请求都必须包含要经过适当身份验证/授权的所有必需数据。请参阅RFC 7235

中的这句话
  

HTTP认证被认为是无状态的:认证请求所需的所有信息必须在请求中提供,而不是依赖于服务器记住先前的请求。

身份验证数据应属于标准HTTP授权标头。来自RFC 7235

  

4.2. Authorization

     

Authorization标头字段允许用户代理使用原始服务器对自身进行身份验证 - 通常(但不一定)在收到401(未授权)响应后。其值由包含所请求资源领域的用户代理的认证信息的凭证组成。 [...]

此HTTP标头的名称很不幸,因为它带有身份验证而不是授权数据。

对于身份验证,您可以使用Basic HTTP Authentication方案,该方案将凭据作为用户名和密码对进行传输,使用Base64进行编码:

Authorization: Basic <credentials>

如果您不想在每个请求中发送用户名和密码,则可以将用户名和密码交换为在每个请求中发送的令牌(例如JWT)。 JWT令牌可以包含用户名,到期日期以及可能与您的应用程序相关的任何其他元数据:

Authorization: Bearer <token>

有关详细信息,请参阅此answer