2012-01-21 48 views
2

我正在使用GWT历史记录支持来改进我的应用程序,并且我偶然发现了一个我不太确定该怎么做的情况。这个问题的答案不一定是GWT相关的。保持GWT历史哈希通过Spring Security登录

GWT的历史支持功能通过传递散列标签(即index.html#token)。安全限制要求用户在实际访问index.html之前先登录,以便它们被发送到登录页面,保留令牌(login.html#token)。到现在为止还挺好。现在,用户已通过身份验证,并且Spring将它们发送到index.html(默认目标),并消除了URL的#token部分。

我该如何强制Spring Security维护令牌并将我最近认证的用户发送到他们请求的页面(index.html#token)?由于我已经获得了Spring Security身份验证的工作,所以我宁愿不重构我的应用程序处理登录的方式。

+1

请将解决方案作为答案发布,而不是将其嵌入到问题中。 –

+1

你在这里,先生。 –

+0

谢谢你,善良的先生。 –

回答

4

经过大量的挖掘,我找到了我的答案Spring's Jira。正如Colin Alworth所说,这个令牌实际上并不是这个请求的一部分,所以Spring Security从来没有看到它在服务器端,因此不能用它来确定最终的URL。所以我使用的方法是将散列(客户端)追加到j_spring_security_check,使其成为j_spring_security_check#token。现在令牌传递得很好,让我有一个工作令牌的安全应用程序。

感谢您的帮助科林,您的回答让我想到了正确的方向。

3

正如您所指出的那样,服务器无法将该令牌视为GET/POST请求的一部分,只能由浏览器看到。我以前见过的最佳解决方案是登录页面记录当前的window.location.hash,并将其与登录表单一起传递(假设重定向将保持散列),或作为登录参数发送到服务器,以便它可以正确重定向。

0

这里发生了什么,它可以帮助你解决这个问题:

  1. 从发送未经验证的用户的index.html到login.html的最 可能作为HTTP重定向3XX实现,这就是为什么 浏览器保留散列片段(#token)。
  2. 一旦他们登录,spring会通过3xx重定向将它们从login.html发送到index.html而不是 ,这样浏览器就不会保留令牌。

一个解决方案是将标记插入到index.html中,然后使用GWT进行拾取。另一个是使login.html - > index.html 3xx重定向(如果春天允许的话)。