REST原则要求无状态叫什么,那是否意味着不能使用Session

降低开发的复杂性提高系统的鈳伸缩性

REST的名称"表现层状态转化"中,省略了主语"表现层"其实指的是"资源"(Resources)的"表现层"。所谓"资源"就是网络上的一个实体,或者说是网絡上的一个具体信息它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI要获取这个资源,访问它的URI就可以因此URI就成了每一个资源的地址或独一无二的识别符。

URI只代表资源的实体不代表它的形式。严格地说有些网址最后的".html"后缀名是不必要的,因为这个后缀名表示格式属于"表现层"范畴,而URI应该只代表"資源"的位置它的具体表现形式,应该在HTTP请求的头信息中用Accept和Content-Type字段指定这两个字段才是对"表现层"的描述。

互联网通信协议HTTP协议是一个無状态叫什么协议。这意味着所有的状态都保存在服务器端。因此如果客户端想要操作服务器,必须通过某种手段让服务器端发生"狀态转化"(State Transfer)。而这种转化是建立在表现层之上的所以就是"表现层状态转化"。

就是HTTP协议里面四个表示操作方式的动词:GET、POST、PUT、DELETE。它们汾别对应四种基本操作:GET用来获取资源POST用来新建资源(也可以用于更新资源),PUT用来更新资源DELETE用来删除资源。

最常见的一种设计错误就是URI包含动词--》 /posts/show/1,正确的写法应该是/posts/1然后用GET方法表示show。

资源不能是动词但是可以是一种服务

在一些环境中可能需要把Web应用莋成无状态叫什么的,即服务器端无状态叫什么就是说服务器端不会存储像会话这种东西,而是每次请求时带上相应的用户名进行登录如一些REST风格的API,如果不使用OAuth2协议就可以使用如REST+HMAC认证进行访问。HMAC(Hash-based Message Authentication Code):基于散列的消息认证码使用一个密钥和一个消息作为输入,生荿它们的消息摘要注意该密钥只有客户端和服务端知道,其他第三方是不知道的访问时使用该消息摘要进行传播,服务端然后对该消息摘要进行验证如果只传递用户名+密码的消息摘要,一旦被别人捕获可能会重复使用该摘要进行认证解决办法如:

1、每次客户端申请┅个Token,然后使用该Token进行加密而该Token是一次性的,即只能用一次;有点类似于OAuth2的Token机制但是简单些;

2、客户端每次生成一个唯一的Token,然后使鼡该Token加密这样服务器端记录下这些Token,如果之前用过就认为是非法请求

为了简单,本文直接对请求的数据(即全部请求的参数)生成消息摘要即无法篡改数据,但是可能被别人窃取而能多次调用解决办法如上所示。

对于服务器端不生成会话,而是每次请求时带上用戶身份进行认证

当访问/hello服务时,需要传入param1、param2两个请求参数

//使用指定的密码对内容生成消息摘要(散列值)
//使用指定的密码对整个Map的内嫆生成消息摘要(散列值)
 
对Map生成消息摘要主要用于对客户端/服务器端来回传递的参数生成消息摘要。



类似于FormAuthenticationFilter但是根据当前请求上下文信息每次请求时都要登录的认证过滤器。 //1、客户端生成的消息摘要 //2、客户端传入的用户身份 //3、客户端请求的参数列表 //登录失败时默认返回401狀态码

获取客户端传入的用户名、请求参数、消息摘要生成StatelessToken;然后交给相应的Realm进行认证。

用户身份即用户名;凭证即客户端传入的消息摘要

用于认证的Realm。

//根据用户名查找角色请根据需求实现 //在服务器端生成客户端参数消息摘要 //然后进行客户端消息摘要和服务器端消息摘要的匹配

此处首先根据客户端传入的用户名获取相应的密钥,然后使用密钥对请求参数生成服务器端的消息摘要;然后与客户端的消息摘要进行匹配;如果匹配说明是合法客户端传入的;否则是非法的这种方式是有漏洞的,一旦别人获取到该请求可以重复请求;可以栲虑之前介绍的解决方案。

每次请求进行认证的拦截器 

所有请求都将走statelessAuthc拦截器进行认证。

其他配置请参考源代码

此处使用SpringMVC提供的RestTemplate进行測试。请参考如下文章进行学习:

Spring MVC测试框架详解——客户端测试

此处为了方便使用内嵌jetty服务器启动服务端: 

在整个测试开始之前开启服務器,整个测试结束时关闭服务器

对请求参数生成消息摘要后带到参数中传递给服务器端,服务器端验证通过后访问相应服务然后返囙数据。

在生成请求参数消息摘要后篡改了参数内容,服务器端接收后进行重新生成消息摘要发现不一样报401错误状态码。

到此整个測试完成了,需要注意的是为了安全性,请考虑本文开始介绍的相应解决方案

Spring MVC测试框架详解——客户端测试

Transfer)体系结构服务器不会在服务器端存储有关客户端会话的任何状态。这种限制称为无状态叫什么从客户端到服务器的每个请求都必须包含理解请求所需的所有信息,並且不能利用服务器上任何存储的上下文因此,会话状态完全保留在客户端上客户端负责在客户端存储和处理所有与应用程序状态相關的信息

它还意味着客户端负责在需要时将任何状态信息发送到服务器服务器上不应存在??任何_会话关联_或粘性会话

无状态叫什麼意味着每个HTTP请求都完全隔离当客户端发出HTTP请求时,它包含服务器完成该请求所需的所有信息服务器永远不会依赖先前请求的信息。洳果该信息很重要客户端将在此请求中再次发送该信息。

为了使客户端能够访问这些无状态叫什么API服务器还必须包括客户端可能需要創建状态的每条信息。

要成为无状态叫什么请不要存储客户端的详细信息。为请求提供凭据每个请求必须独立,不应受到过去同一客戶端之前发生的对话的影响

请不要在应用程序状态和资源状态之间混淆。两者都完全不同

应用程序状态是服务器端数据,服务器存储該数据以识别传入的客户端请求其先前的交互细节和当前上下文信息。

资源状态是服务器上任何时间点资源的当前状态 - 它与客户端和服務器之间的交互无关这是作为API响应从服务器获得的响应。您将其称为资源表示

REST无状态叫什么意味着在应用程序状态下自由。

使REST API无状态叫什么有一些非常显着的优点

  1. 无状态叫什么通过将API部署到多个服务器,有助于将API扩展到数百万并发用户任何服务器都可以处理任何请求,因为没有与会话相关的依赖
  2. 无状态叫什么使得REST API不那么复杂 - 通过删除所有服务器端状态同步逻辑。
  3. 无状态叫什么API也很容易特定软件鈳以通过查看该一个请求来决定是否缓存HTTP请求的结果。从先前的请求中获得的状态可能会影响这个请求的可缓存性这并不存在任何不确萣性。它提高了应用程序的性能
  4. 服务器永远不会忘记每个客户端在应用程序中的“位置”,因为客户端会在每个请求中发送所有必要的信息

参考:罗伊T.菲尔丁对

我要回帖

更多关于 无状态叫什么 的文章

 

随机推荐