我使用Spring Security来处理会话超时。我的应用程序也使用 AngularJs 。
我有以下问题:
如果会话超时并且用户从angularJs页面向安全URL发出非Ajax请求,则Spring Security会将我重定向到登录URL ,但保留在#(哈希)之后的Url部分登录
让我说明一下:
如何避免将#!/ bar 部分添加到登录页面?
修改:上述说明略有错误。有问题的用例如下:
localhost:8080/bignibou/curriculum/#/view/1
(例如,通过在浏览器的地址栏中粘贴此网址)。http://localhost:8080/bignibou/signin#/view/1
注意保留哈希符号之后和之后的部分。请注意,这与AngularJs有关,而不是Spring Security,因为Spring Security不包含井号(这可以通过哈希从不出现在chrome dev工具的网络选项卡中来证实......)
答案 0 :(得分:4)
而不是Angular,这听起来像HTTP / 3xx重定向上的散列片段的预期行为,正如大多数现代浏览器(以及IE9以后,我相信)所实现的那样。这里有细微差别的细节解释:
官方文档在这里:
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中返回一个散列,从而覆盖任何现有的散列。