在后退按钮后保持跟踪

时间:2009-08-25 12:41:53

标签: http web-applications rest

我想第一次使用REST方法编写一个Web应用程序订单系统。当事情被发布到页面时,我理解“消息ID”的概念,但是这种情况出现了。一旦用户发布到Web应用程序,您就可以使用附加到URI的ID来跟踪他们的状态,但是当他们没有任何id时,如果他们点击浏览器的后退按钮到应用程序的入口点会发生什么?然后他们在交易中失去了他们的状态。

我知道你总是可以给他们一个cookie,但如果他们关闭了cookie就不能这样做,最糟糕的情况是,他们也关闭了javascript。

现在,我明白答案可能是“是的,那就是将要发生的事情”,这就是故事的结局,我可以忍受这一点,但是,对此我不熟悉,有什么我想念的吗?

3 个答案:

答案 0 :(得分:4)

REST实际上没有服务器端的状态;你只需指向资源。不跟踪用户会话;而cookie则用于跟踪应用程序状态。但是,如果您发现确实需要会话状态,那么您将不得不打破REST并在服务器上跟踪它。

需要考虑的一些事项:

  • 您的用户中有多少人禁用了Cookie?有多少人甚至知道该怎么做?
  • 您的用户是否真的有可能关闭JS?如果是这样,如果没有AJAX,你将如何完成PUT(编辑)和删除(删除)?

编辑:由于您不想强制使用Cookie和JavaScript,因此您无法拥有真正的RESTful系统。但你可以在某种程度上伪造它。您将需要跟踪用户服务器端。您可以使用会话对象执行此操作,如您选择的语言/框架中所示,或者通过向数据库添加字段以获取您想知道的任何内容。当然,当用户点击后退按钮时,他们可能会进入缓存页面。如果这不好,那么您将需要修改标头以禁止缓存。基本上,如果你不使用cookies,它会变得更复杂,但不是无法管理的。

缺少PUT和DELETE HTTP方法怎么样?您可以伪造那些带有POST和隐藏参数,指定您是否正在制作新内容,编辑内容或删除记录。 GET不应该真正改变。

答案 1 :(得分:3)

答案是您的应用程序(在REST方案中)只是不会跟踪发生的情况。所有状态都由客户端管理,状态转换通过URI导航实现。 REST的“状态转移”部分是指客户端导航到新状态的新URI。

根据HTTP规范和REST方法,使用GET访问的URI实际上是一种只读操作。这意味着如果客户端“备份”到某个先前的URI,则“最糟糕的”发生的是另一个GET,并且会加载更多数据。

假设客户端执行此操作(使用高度简化的伪HTTP)...

获取// site.com/product/123

这将检索有关产品ID 123的信息(或可能是页面),其可能包括对URI的引用,该URI可用于将该项目发布到用户的购物车中。因此用户决定购买该物品。再次,它过于简单了,但是:

POST //site.com/shoppingcart/ {productid = 123}

从此返回可能是购物车的表示,或者对添加的项目的引用(可以在购物车URI上使用DELETE再次删除项目),或者其他各种事物(例如更深入的XML描述购物车内容,其他URI指向购物车商品并返回原始产品。这完全取决于你。

但是“状态”是由客户端正在做的事情定义的。它根本不在服务器上跟踪,但您肯定会在数据库中保留一段购物车内容一段时间。 (两年后我曾回到一个网站,我的购物车项目仍在那里......)但是由他来跟踪ID。对于您的服务器应用程序,它只是另一条记录,可能是某种过期。

通过这种方式,您不需要cookie,而javascript完全依赖于客户端实现。没有脚本很难建立一个像样的REST客户端 - 你可能用XSLT构建一些东西并且只从服务器返回XML,但这可能比任何人都需要的更痛苦。

出发点是真正了解REST,然后设计系统,然后构建它。它肯定不像大多数其他系统那样(正确或错误)在运行中构建它。

这是一篇优秀的文章,它让你对REST有一个相当“纯粹”的看法,而不会过于抽象而且不会让你陷入困境:

http://www.infoq.com/articles/subbu-allamaraju-rest

答案 2 :(得分:0)

确实,REST中的“S”代表“状态”,而“T”代表“转移”。但是状态是保留在客户端上,而不是在服务器上。客户总是掌握所有必要的信息,以决定他想改变状态的方向。

您描述它的方式,您的系统安静。