服务器从包含#(哈希)符号的AngularJs页面重定向到登录URL

时间:2014-02-11 13:15:30

标签: angularjs spring-mvc angularjs-routing

我使用Spring Security来处理会话超时。我的应用程序也使用 AngularJs

我有以下问题:

如果会话超时并且用户从angularJs页面向安全URL发出非Ajax请求,则Spring Security会将我重定向到登录URL ,但保留在#(哈希)之后的Url部分登录

让我说明一下:

  • 用户位于/ myapp / foo#!/ bar
  • 会话超时
  • 用户问题获取对安全网址的请求
  • 用户被重定向到/ myapp / signin#!/ bar

如何避免将#!/ bar 部分添加到登录页面?

修改:上述说明略有错误。有问题的用例如下:

  • 用户未登录并尝试访问受保护的资源,例如:localhost:8080/bignibou/curriculum/#/view/1(例如,通过在浏览器的地址栏中粘贴此网址)。
  • 它们会自动重定向到以下网址:http://localhost:8080/bignibou/signin#/view/1

注意保留哈希符号之后和之后的部分。请注意,这与AngularJs有关,而不是Spring Security,因为Spring Security不包含井号(这可以通过哈希从不出现在chrome dev工具的网络选项卡中来证实......)

2 个答案:

答案 0 :(得分:4)

而不是Angular,这听起来像HTTP / 3xx重定向上的散列片段的预期行为,正如大多数现代浏览器(以及IE9以后,我相信)所实现的那样。这里有细微差别的细节解释:

URL Fragments and Redirects

官方文档在这里:

W3C URI handling - Section 4.1

修改

为了修改(或者,在这种情况下,删除)片段,您可以利用HTML5的历史状态。尝试将此添加到您的登录页面:

history.replaceState("", document.title, window.location.pathname + window.location.search)

有关replaceState的更多信息,在Mozilla开发人员文档的Adding and modifying history entries中有相当详细的文档。

这里显而易见的警告是,你需要它使用哪种版本的IE。从快速的谷歌,你好像在看IE10以后,所以对于早期版本,你需要更基本的东西,如: / p>

window.location.hash = ""

将删除片段但保留#,但是嘿,这是IE。

因此,作为复合解决方案,您可以使用:

if("replaceState" in history)
  //  proper browsers
  history.replaceState("", document.title, window.location.pathname + window.location.search)
else
  // fallback for ie
  window.location.hash = ""

答案 1 :(得分:2)

正如Rob上面提到的那样,服务器不会发回哈希值,只是浏览器会保留哈希值。

但是,您可以将登录和会话过期的URL设置为“/ login#”,以便服务器在重定向URL中返回一个散列,从而覆盖任何现有的散列。