如何在不进行重定向的情况下将Cookie添加到Seaside响应中?
我正在Seaside中制作一个小型Web应用程序。我有一个登录组件,在用户登录后,当下一个组件呈现自身时,我想发送一个cookie。有没有一种方法可以处理响应的对象,这样我就可以在输出的标头中添加一些内容?
我正在尝试避免使用WASession >> redirectWithCookies,因为仅因为我想设置cookie似乎很笨拙地进行重定向。
是否存在另一种添加cookie的方法,该cookie将在下一个响应中消失?
解决方案
我刚刚对此进行了深入研究,答案似乎是否定的。具体来说,没有办法从WARenderCanvas或者它可以访问的任何内容中获取响应(它保留在WARenderingContext上,而WARenderingContext保留在WAHtmlStreamDocument上,WAHtmlStreamDocument保留在响应的流上,而不保留响应本身)。我认为授予上下文访问当前响应的权限是合理的,正是为了能够在其上设置标头,但是我们问是否已经有一种方法,所以:否。
也就是说,Seaside进行了很多额外的重定向,并且似乎对用户体验的影响不大,所以也许要做的事情就是停止担心它似乎很繁琐,并继续使用已经存在的API流程那里 :)
当前没有在请求处理的操作/回调阶段添加cookie的内置方法。这很可能是缺陷,已在此问题中指出:http://code.google.com/p/seaside/issues/detail?id=48
目前已针对Seaside 2.9修复了此问题,但我不知道它是否还会反向移植到2.8.
请记住,在动作和渲染阶段之间已经存在(默认情况下)重定向,以防止Refresh重新触发回调,因此在总体方案中,在这种情况下再进行一次重定向并不是很糟糕。
如果我们仍然想进一步挖掘,请查看WARenderContinuation >> handleRequest:。在那里触发了回调处理,并开始了重定向或者呈现阶段。
编辑添加:
现在,此问题已得到解决,并且(在最新的开发代码中)我们现在可以随时将cookie适当地添加到当前响应中。只需在当前请求上下文中访问响应对象并添加cookie。例如,我们可以执行以下操作:
self requestContext response addCookie: aCookie
这不太可能被移植到Seaside 2.8,因为它需要在响应方式上进行相当大的改变。