无状态 Web 应用程序,都市传奇?

2024-01-04

我试图理解token-based authentication这些天,它声称是stateless authentication方法。我遇到了这个概念stateless web application.

以下是我读到的一些主题:

  • 使用 Spring MVC 进行无状态 Web 应用程序开发 https://stackoverflow.com/questions/20433261/use-spring-mvc-for-stateless-web-application-development(尚未回复)
  • 无状态 Spring MVC https://stackoverflow.com/questions/8694427/stateless-spring-mvc
  • 如何使 Java Web 应用程序完全无状态 https://stackoverflow.com/questions/26830248/how-to-make-a-java-web-application-fully-stateless
  • 如何使我的 Web 应用程序无状态但仍然可以做一些有用的事情? https://stackoverflow.com/questions/3016326/how-do-i-make-my-web-application-stateless-yet-still-do-somthing-useful

起初,我对这个想法感到很兴奋。但我越来越觉得stateless is a pseudo-proposition.

例如,假设我们使用客户端存储的token进行身份验证,我们如何统计在线用户(假设没有日志)?我们应该将令牌存储在数据库中吗?这不是意味着我们将状态信息存储在服务器上吗?更重要的是,数据库中的普通用户信息(例如姓名、年龄等)是否也是某种状态信息?

我认为这里真正的问题不是让网络应用程序成为无状态的,而是使 Web 应用程序正确处理状态信息,以免损害可扩展性.

这取决于如何解释这个词stateless:

  1. Web 应用程序没有状态。
  2. 或者网络应用程序不存储状态itself.

我更喜欢2,因为总有一些inevitable global state(引用@deceze 对他的回答的评论)。无论我们将状态信息存储为 HTML 5 Web 存储、HTTP 标头、隐藏表单字段或 Cookie,状态仍然存在。只是它存储在服务器以外的其他地方。

我错过了一些很棒的事情吗?有人可以解释一下这一点,以便我可以从这种精神斗争中解脱出来吗?

ADD 1

刚刚读过这本书RESTful Web 服务 https://rads.stackoverflow.com/amzn/click/com/0596529260 by Leonard Richardson。在第 4 章本节末尾Statelessness,它将状态分为Application State and 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.它承认此类信息不能存储在客户端。并且必须将其存储在服务器端破坏了无状态代码并引入了会话亲和性问题。它声称无状态可以避免会话亲和性问题,但没有解释如何避免。 我真的不明白无状态如何处理这种情况。任何人都可以在这里阐明一些情况吗?


“状态”实际上仅指客户端和服务器之间的状态。当然,服务器将存储数据,从技术上讲,您可以将服务器上任何数据的任何修改视为“改变状态”。因此,这种意义上的“无状态”应用程序绝对没有实际意义。

“无状态”指的是服务器在任何特定时间是否处于允许特定客户端向其发送特定请求的状态。

考虑一下:对于传统的基于 cookie 的登录会话,服务器仅处于接受客户端请求的状态在有限的时间范围内;只要当前会话有效。客户无法预测这会持续多久。任何时候,客户端的请求都可能失败,因为服务器上的某些状态时间到。在这种情况下,客户端需要通过重新登录来重置服务器的状态。

将此与基于令牌的身份验证进行对比。令牌必须无限期有效。它本质上是用户名和密码的替代。为了便于讨论,假设客户端在每次请求时都发送他们的用户名和密码。这意味着每个请求都可以根据其自身的优点进行身份验证,而不要求服务器处于某种特定的临时“状态”。

使用令牌而不是用户名和密码的原因有两个:

  1. 您可以使用同一帐户授权多个客户端,但每个客户端都具有单独管理的凭据
  2. 您不想在每个请求中来回发送“主密码”

当然,服务器需要跟踪创建的令牌并针对每个请求针对某个数据库进行身份验证。这是一个不相关的实现细节。这与使用会话 cookie 没有什么不同;但是,由于令牌无限期有效,因此可以更轻松地缓存请求,而无需复制临时会话存储。

最后一个需要先发制人的潜在论点是:无限期会话和无限期令牌之间有什么区别,会话结束时与令牌可以撤销时有什么区别?
当会话结束时,可以使用其他一些“主凭据”(重新登录)重新建立会话。令牌只能/应该仅在主动撤销时结束,这类似于撤销完全针对主凭据访问服务的授权,并且不属于常规应用程序流程的一部分。


更笼统地说:将无状态 HTTP 协议与有状态协议(如 FTP)进行对比。在 FTP 中,服务器和客户端需要保持共享状态同步。例如,FTP 协议具有许多其他特性:CWD命令到更改当前工作目录。即,存在一个客户端在任何给定时间“位于”哪个目录的概念。后续命令的行为会根据所在目录的不同而有所不同。这是有状态的。您不能在不了解该状态的情况下随意发送命令,否则您将无法预测结果是什么。


无状态客户端/服务器通信首先简化了客户端,因为客户端可以随时假设能够向服务器请求任何内容,而无需知道服务器的信息。state服务器的(“我的会话是否仍然处于活动状态?”,“什么目录此操作会产生影响吗?”)。它可以帮助扩展服务器实现,因为只需要在所有服务器之间复制静态信息,而不是不断变化的有效会话及其关联数据池。


从架构上讲,您的目标应该是拥有尽可能多的无状态组件尽可能。这将简化横向扩展。例如,如果您的 Web 服务器保留本地会话存储,则很难将 Web 服务器扩展到负载均衡器/CDN 后面的多个实例。一项改进是将会话存储集中到一个独立的数据库中;现在你可以有几个无国籍的Web 服务器知道如何从某处获取数据(包括会话数据)并可以呈现模板,但在其他方面是完全可互换的。

然而,一个会话存储必须在尝试访问它的每个人之间保持完美同步,这使得扩展变得困难it. 令牌通过减少数据更改频率(仅当添加或删除令牌时)来改善这一点,这意味着如果您希望在可能的多个位置有多个令牌存储,和/或使您可以使用分布式数据库或其他更简单的复制机制该数据可缓存。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无状态 Web 应用程序,都市传奇? 的相关文章

  • Chrome:网络元素自动移动

    我正在开发一个网络项目 在过去的两周里 我正在进行学期考试 所以我要休息一下 现在 既然他们已经结束了 我又继续我的工作了 但我发现我的一些Web 元素 如按钮 span 在 Chrome 上移动了一些像素 在 IE 和 Mozilla 上
  • Django HTTPS 和 HTTP 会话

    我使用 Django 1 1 1 和 ssl 重定向中间件 通过 HTTPS 创建的会话数据 身份验证等 在站点的 HTTP 部分中不可用 无需将整个站点设置为 HTTPS 即可使其可用的最佳方法是什么 这是设计使然 您无法轻易更改 当通过
  • WCF WebHttp 混合身份验证(基本和匿名)

    所有这些都与 WebHttp 绑定有关 托管在自定义服务主机中 IIS 目前不是一个选项 我已经实现了自定义 UserNamePasswordValidator 和自定义 IAuthorizationPolicy 当我将端点的绑定配置为使用
  • 用 C++ 解析 HTTP 标头

    我正在使用curl 与服务器通信 当我发出数据请求时 我收到 HTTP 标头 后跟由边界分隔的 jpeg 数据 如下所示 我需要解析出 边界字符串 内容长度 我已将传入数据复制到 char 数组 如下所示 static size t OnR
  • session_regenerate_id 没有创建新的会话 id

    我有一个脚本 旨在完成当前会话并开始新的会话 我使用了一段代码 它在我的开发计算机上运行良好 但是 当我将其发布到生产服务器时 会话 ID 始终保持不变 以下是我重新启动会话的代码 session start SESSION array P
  • 从手机访问本地主机[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在使用
  • 最适合“正在进行的作业”的 HTTP 状态代码

    向客户端提供的最合适的 HTTP 状态代码是什么 表示 您的请求很好 但仍在进行中 请稍后在完全相同的位置回来查看 例如 假设客户端提交初始请求以启动繁重的查询 服务器立即返回一个 URL 客户端可以定期轮询该 URL 以获取结果 如果客户
  • 服务器上的 Rails 会话

    我想让一些 Rails 应用程序在不同的服务器上共享同一个会话 我可以在同一服务器内完成此操作 但不知道是否可以在不同服务器上共享 有人已经做过或者知道怎么做吗 Thanks Use the 数据库会话存储 https github com
  • 将数据库中的用户 ID 添加到 Codeigniter 中的会话数据中?

    我是 CodeIgniter 的新手 在从数据库添加用户 ID 用户登录后 到会话数据时遇到问题 这是我的代码问题 之前可能会在 SOF 上被问到 在付出了所有努力之后 我问这个 登录模型
  • 如何处理 AJAX 请求中的会话超时

    我相信你们都熟悉使用 AJAX 的投票系统 嗯 看那边 我有类似的东西 当你投票赞成或反对时 它使用 AJAX 从 votes php 请求新值 问题是我正在使用会话来获取用户 ID 因此一个人只能投票一次 如果他们在页面上坐了一个小时然后
  • Safari 的“阅读器模式” - 开源解决方案? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Safari 有一个 阅读器模式 可以删除网站上除文本之外的所有内容 有谁知道提供相同功能的开源库 或
  • ASP.NET:如何删除所有用户的所有会话变量?

    我们有 ASP NET 应用程序 想要删除所有用户的所有会话中的所有会话变量 我的意思是不要仅使用以下命令从当前会话中删除会话变量 Session Clear or Session Abandon 我们还需要清除其他用户会话中的会话变量吗
  • NestJS e2e 测试模拟会话装饰器

    我正在尝试使用 supertest 编写一个 e2e 测试 其中我的控制器实际上使用了 Session 装饰师 然而 我不想承担使用数据库连接等启动会话的全部负担 因此测试中的我的应用程序实际上并未初始化会话 相反 我想首先模拟掉装饰器提供
  • 如何将文件透明地传输到浏览器?

    受控环境 IE8 IIS 7 ColdFusion 当从 IE 发出指向媒体文件 例如 mp3 mpeg 等 的 GET 请求时 浏览器将启动关联的应用程序 Window Media Player 我猜测 IIS 提供文件的方式允许应用程序
  • 使用 file_get_content 发布数据

    我已经做了一些关于如何使用的研究file get content与帖子 我也读过this one https stackoverflow com questions 2445276 how to post data in php using
  • MySQL 概念:会话与连接

    我对 MySQL 的概念有点困惑 会话与连接 当谈论连接到 MySQL 时 我们使用连接术语 连接池等 然而在 MySQL 在线文档中 http dev mysql com doc refman 4 1 en server system v
  • 给定数十亿个 URL,如何确定重复内容 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我在一次编程面试中被问到这个问题 我在下面详细描述了这个问题 这是一个开放式问题 给定数十亿个 URL 深层链接 我如何对哪些 URL
  • 如何在 Laravel 5 中的视图模板上显示会话数据

    我正在尝试在 Laravel 5 中的视图模板上显示会话数据 但是它似乎没有显示任何内容 这是我用来设置会话的代码 Session set bookingConfirmed BookingDates where id Session get
  • Node + Express 会话过期?

    我有一个 Express 应用程序 并且有一个登录表单 我需要持续 1 个月的会话 我是否将 maxAge 设置为一个月 以毫秒为单位 我让两台计算机保持打开状态并登录了 24 小时 当我回来时 两台计算机都已注销 我该如何解决这个问题 实
  • 我可以从 HTTP 请求中找到无线接入点的 BSSID(MAC 地址)吗?

    假设有人在咖啡店里无线连接到互联网 并向 johnsveryownserver com 发送 HTTP 请求 服务器端 有什么方法可以确定我的MAC地址吗 无线接入点他们连接到什么 请注意 我对他们机器的 MAC 地址不感兴趣 如果我无法使

随机推荐

  • 如何获取生成表的行表示?

    我想要得到Row N lt gt 生成的 JOOQ 表类型的表示 我想在这种情况下使用它 val p PROJECTS as p val pmu PROJECTMEMBERUSERS as pmu val query db select p
  • 提取所有 JSON 密钥

    我有一个 JSON 列j like a 2 b b1 3 b2 5 c 3 a 5 d 1 c 7 如何从 Presto 获取所有不同的 顶级 键名称 IE 我喜欢 select distinct foo j 回来 a b c d 请注意
  • Fetch Type LAZY 仍然会导致急切加载 Hibernate Spring 数据

    我使用 Spring 数据创建了一个简单的 Spring boot 项目 我有一个与标签具有一对多关系的 TagGroup 实体 Entity Table name TAG GROUP public class TagGroup OneTo
  • moz变换比例减小div大小问题

    我在 mozilla moz transform 缩放属性方面遇到问题 我正在寻找 Zoom 属性的替代品 它在除 Firefox 之外的所有平台上都能正常工作 当我想缩小 div 时 它的 内容 确实缩小了 但容器的大小保持不变 在其他内
  • 在 JavaScript 正则表达式匹配中移动索引

    我有这个正则表达式来从文本中提取双词 A Za z s A Za z g 以及这个示例文本 Mary had a little lamb 我的输出是这样的 0 Mary had 1 a little 而我的预期输出是这样的 0 Mary h
  • 设置远程共享继承其父目录权限的 C# 代码

    我有两台计算机 分别称为客户端和服务器 位于 Windows 域中 服务器有一个可以从客户端计算机访问的共享目录 我想在客户端上运行一个 C 应用程序 该应用程序设置此共享的权限以继承服务器上共享的父目录的权限 我该怎么做呢 我已经尝试过以
  • 在 Google Cloud Storage 存储桶上设置缓存控制

    我有一个存储桶 其中包含经常更新的公共图像 并且希望禁用默认缓存持续时间 3600 例如 Cache Control private max age 0 no transform 使用 PHP 上传文件时可以设置缓存控制吗 有没有办法为存储
  • git 如何检测文件已被修改?

    git 如何如此快地检测到文件修改 它是否对存储库中的每个文件进行哈希处理并比较 SHA1 这会花费很多时间 不是吗 或者说比较atime ctime or mtime Git 努力仅从 lstat 值中确信工作树与索引匹配 因为回退到文件
  • 如何从 TableList POI 中移除/删除表格

    我正在使用模板 docx 文件来填充每个表上的数据 但在某些情况下我不想要同一个表 是否有使用可以删除 删除的 XWPFTable 你可以试试 int position document getPosOfTable table docume
  • 如何让 .NET 取消未使用的 RAM?

    以下是我的程序在极其密集地使用内存后的统计数据 在峰值时消耗 6 GB 但随后将所有内容保存到磁盘并在范围内留下很少的内容 观察到几乎所有内容都超出了范围并已被垃圾收集 堆大小很小 然而 NET 保留了 181 MB坚定的 我不介意保留字节
  • 如何将 warnings() 输出转换为字符串

    当我在控制台输入 warnings 时 我回来了 Warning message In fread my directory C function strtod returned ERANGE for one or more fields
  • 在 google colab 中找不到 kaggle.json 文件

    我正在尝试将 kaggle imagenet 对象本地化挑战数据下载到 google colab 中 以便我可以用它来训练我的模型 Kaggle 使用 API 来轻松快速地访问其数据集 https github com Kaggle kag
  • 当我添加对 Cargo.toml 文件的依赖项时,阻止等待包缓存上的文件锁定

    我向 Rust 项目添加了依赖项 然后运行了 Cargo Run 这给了我这个错误 阻止等待包缓存上的文件锁定 我尝试了在网上找到的解决方案 即删除 cargo package cache 文件 但这对我不起作用 当我输入类似 cargo
  • 计划任务调用的批处理文件在计划时抛出错误,双击时运行正常

    我有一个映射网络驱动器的批处理文件 大约一周前 密码过期了 因此调用批处理文件的程序开始抛出错误 我已经更新了批处理文件中的密码 当我双击批处理文件时 驱动器映射正常 但是 当计划任务开始时 我收到以下错误 Logon failure un
  • 我们可以使用 match 来检查类的类型吗

    我是 scala 新手 我正在学习match现在关键字 我想知道我们是否可以使用关键字match检查类的类型 我的代码是 object Main def main args Array String val x AA checkType x
  • Java EE/JPA 向数据库添加新表/实体的方法

    我有一个mysql数据库 我想添加向数据库添加新表的功能 我可能可以轻松找到 JPQL 的示例 但是如何自动为这个新表生成实体 以便我可以在 JPA 代码的其余部分中引用它 以便从表中更新和删除我通常引用该实体不是实际的表本身 我现在拥有的
  • 如何在 Windows 上使用 PyInstaller 创建 Linux 和 MacOS 可执行文件?

    我使用 Pyinstaller 从 python 代码制作了一个独立的 Windows 便携式应用程序 并且它工作正常 我知道要为某个操作系统创建可执行文件 必须在该特定操作系统上完成 有没有一种方法可以直接从 Windows 创建适用于其
  • 阻止 TFS 添加临时文件

    我正在开发一个在 TFS 中绑定的项目 该项目为我提供了一个文件夹 Log 当我执行我的项目并进行一些测试时 它会生成文本文件并存储在 Log 文件夹中 之后 当我尝试签入文件时 这些文件将作为 TFS 中的新文件签入 我希望 TFS 排除
  • python 将 10 位日期时间戳转换为 13 位 GMT 时间戳 [重复]

    这个问题在这里已经有答案了 我从像这样的服务器收到时间戳 1512543958 当我在标头中发回请求时 我看到像这样的 13 位 GMT 时间戳 1512544485819 通过使用下面的代码将时间更改为本地时间 我得到2017 12 06
  • 无状态 Web 应用程序,都市传奇?

    我试图理解token based authentication这些天 它声称是stateless authentication方法 我遇到了这个概念stateless web application 以下是我读到的一些主题 使用 Sprin