【问题标题】:How restful service identify which user calling which method And how to make restful service as stateful?RESTful 服务如何识别哪个用户调用了哪个方法以及如何使 RESTful 服务成为有状态的?
【发布时间】:2017-03-25 09:50:16
【问题描述】:

作为restful服务stateless,它不维护用户的任何交互,所以我想知道是否有多个用户访问同一个restful服务,那么restful service如何识别哪个用户与哪个方法交互?是否可以像stateful一样提供宁静的服务?

【问题讨论】:

标签: java rest stateless stateful


【解决方案1】:

哪个用户:

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

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

哪种方法:

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

是否有可能使宁静的服务成为有状态的?

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

【讨论】:

  • 如果我们把restful服务变成有状态的,那么restful服务就不会是restful的,也就是说我们不应该把restful服务变成有状态的,对吧?
  • 这是一个定义:如果我们将restful服务变成有状态的,它就不再是restful了。
  • 在cookie中需要存储哪些数据来识别用户?如果是登录较少的应用程序
  • 使用登录机制没关系。您始终可以创建一个 cookie 及其唯一标识符。该对象及其标识符存储在服务器上的大地图中(与其他 cookie 标识符一起),客户端浏览器保存标识符(以及来自其他域的所有其他 cookie-id)。在连接到该标识符的会话对象中,您可以存储和检索服务器上所有可序列化的内容。我希望你使用一个框架,因为这就是你需要知道的全部。 :-)
【解决方案2】:

根据我的观点,Restful Web 服务是无状态的。它的架构风格有一组约束和属性,所以无状态是它的属性,我们不能改变它的属性,所以它并不意味着 Restful 服务是有状态的。

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

【讨论】:

  • 它没有提供问题的答案。
【解决方案3】:

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了解更多详情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多