【发布时间】:2016-04-13 00:24:06
【问题描述】:
这些天我试图理解token-based authentication,它声称是stateless authentication 方法。而且我遇到了stateless web application这个概念。
以下是我读到的一些主题:
- Use Spring MVC for Stateless web application development(还没有回复)
- Stateless Spring MVC
- How to make a java web application fully stateless
- How do I make my Web Application stateless yet still do something useful?
起初,我对这个想法很兴奋。但我越来越觉得stateless 是pseudo-proposition。
例如,假设我们使用客户端存储的令牌进行身份验证,我们如何对在线用户进行统计(假设没有日志)?我们应该将令牌存储在数据库中吗?这是否意味着我们将状态信息存储在服务器上?更何况,DB中的姓名、年龄等普通用户信息也是某种状态信息吗?
我认为这里真正的问题不是让网络应用程序无状态,而是让网络应用程序正确处理状态信息,从而不会危及可扩展性。
这取决于如何解释stateless这个词:
- Web 应用没有状态。
- 或者网络应用不存储状态本身。
我更喜欢 2,因为总会有一些 inevitable global state(引用自 @deceze 对他的回答的评论)。而且无论我们将状态信息存储为 HTML 5 Web 存储、HTTP 标头、隐藏表单字段或 Cookie,状态仍然存在。只是它存储在服务器以外的其他地方。
我错过了一些很棒的东西吗?任何人都可以对此有所了解,以便我可以从这种精神斗争中解脱出来吗?
添加 1 个
只需阅读Leonard Richardson 的书RESTful Web Services。在第 4 章中,在Statelessness 部分的末尾,它将状态分类为Application State 和Resource State。所以我之前提到的普通用户信息和数据,比如图片等,可以归类为Resource State。而stateless 指的是Application State。所以在服务器上存储resource state不会破坏无状态的代码。
但是这本书也提到了an application key is used to restrict how many times a user can invoke a web service.它承认这样的信息不能存储在客户端的场景。并且必须将其存储在服务器端会破坏无状态代码并引入会话亲和性问题。 它声称无状态可以避免会话亲和性问题,但没有解释如何。 我真的不明白无状态如何处理这种情况。任何人都可以在这里阐明一下吗?
【问题讨论】:
-
什么是无状态网络应用?你这个词是从哪里来的?我只知道无状态连接/协议。
-
@freakish 感谢您的回复。我从几个线程中读取它。我在这里总结了一些:stackoverflow.com/questions/34651801/…
-
我认为,如果你写下 statefull 的缺点列表,你将能够定义什么是无状态的,对吧?但这些缺点是主观的,这就是为什么没有明确的定义。
-
不,如果您的客户需要状态(“欢迎 X,您已登录”),您的整个堆栈就不可能是无状态的。 应用服务器可以是无状态的,但您的客户端不会,而且很可能在应用服务器后面也有一些共享数据存储。
-
是的,这也是我的感觉。您想要一个无状态应用程序服务器的主要原因是请求处理是独立的,您可以将它们干净地分布在多台机器上。所有这些仍然会访问数据库(可以自己分发),但实际的请求处理是独立的。以会话为例,这是不可能的 - 您必须在所有请求处理机器上复制会话数据。
标签: http session web token stateless