如何使用RESTlet在RESTful Web服务中强制执行“会话”?

时间:2011-10-10 10:45:48

标签: java web-services web-applications rest restlet

我是RESTful Web服务和RESTlet的新手。我们只有构建基于servlet的Web应用程序(JBoss / Apache上的Servlet / JSP)的经验。现在,我们正在构建一个基于RESTlet的应用程序,其中服务器端API将由两种类型的客户端使用 - 使用浏览器的Web和基于桌面的swing。

据我所知,按照REST概念 a)服务器无法维护会话以提高可伸缩性和其他一些原因 b)客户的每个请求都应该是自包含的

现在,我真的很困惑如何实现这一目标。假设我们采用简单的购物车应用程序。

步骤1)客户端发送认证请求,服务器认证,服务器响应OK。

步骤2)客户端发送将项目添加到购物车的请求。服务器响应正常。

步骤3)客户发送另一个请求以将第二项添加到购物卡。服务器响应正常。

通常,在正常的Web应用程序中,会在服务器上的步骤1中创建会话,从那时起,与该客户端相关的所有请求将自动与同一会话关联,并且我们存储会话状态(在这种情况下为购物车) )在会话对象中,并使用来自客户端的后续请求检索/更新它。

现在,在上面的场景中:

1)如果服务器上没有维护会话,我们如何在步骤2和3中对客户端进行身份验证和授权?

2)客户是否需要为每个请求发送一些额外信息?

3)我们如何在步骤3中检索客户特定的购物车?

4)客户端是否需要在步骤3中再次发送服务器在步骤2中创建/返回的购物车?

显然,这是最简单的用例,因此每个开发RESTful Web服务的人都必须设计自己的应用来处理这个问题。使用RESTLet在RESTful Web服务中处理会话管理,身份验证和授权的最佳和最常用方法是什么?如果我们必须使用客户端的数据维护服务器端的缓存,那么这与代表我们的服务器维护会话有何不同?

提前致谢, 深

1 个答案:

答案 0 :(得分:15)

  

1)如果我们如何在步骤2和3中验证和授权客户端   服务器上没有维护会话?

     

2)客户是否需要向每个人发送一些额外的信息   请求?

是。您必须为每个请求发送身份验证/授权数据。这就是阻止服务器“记住”你是谁(即无状态服务器,没有会话)的原因

  

3)我们如何在步骤3中检索客户特定的购物车?

让我们问一个不同的问题:如果服务器重新启动会发生什么?您想要所有购物车数据丢失吗?可能不是。暗示你必须把它存放在一个可以在重启后存活的地方。暗示持久存储。可能在服务器或客户端......

...现在,如果您的客户重启,该怎么办?您可以选择使用POST请求为用户创建购物车“资源”(当用户添加第一个项目时),或者在客户端登录时创建(浪费)。然后,您继续使用PUT / DELETE更新购物车,并使用GET获取它。

它应该在DB中吗?可能是,取决于你是否想要它。如果它必须是持久性的,那么这是一个保持它的好地方,以便它可以在重新启动后继续存在。

那么如何接收客户特定的购物车?那么你只需要发送资源的GET请求!而已!第一个POST将在适当的URL创建一个资源,然后您可以使用它。

Restful Web服务还具有宁静的URL,因此这是设计的关键部分。

  

4)客户是否需要发送它的购物车   服务器在步骤2中再次在步骤3中创建/返回了什么?

没有。正如刚才提到的。但是如果你在客户端使用cookies或LocalStorage或其他一些信息,那么也许你可以这样做。

  

显然,这是最简单的用例,所以每个人都在发展   RESTful Web服务必须设计他们的应用程序来处理这个问题。什么   是处理会话管理的最佳和最常用的方法,   使用RESTLet在RESTful Web服务中进行身份验证和授权?

是。这很简单,但需要一段时间来考虑“资源”而不是“服务”。在宁静的设计中,一切都是(或可以是)资源,包括交易,购物车等,

但是,授权/身份验证是http请求数据包的一部分,并随每个请求一起发送。我建议你阅读这些内容。

  

如果我们必须使用客户端的数据维护服务器端的缓存   那么这与我们的服务器维护会话有何不同?   代表?

大的差异!您是在缓存性能还是维护会话?如果系统重新启动,您的系统将在空缓存上无缝工作吗?如果是,你正在缓存性能,否则你就是维持状态。

我强烈建议您阅读Richardson&amp ;;的RESTful Web Services。 Ruby可以创造上述概念,并更深入地了解如何设计宁静的服务......需要一些时间来适应。