我的gwt / gae应用程序利用活动和地点。为了创建异步进程(例如重置密码或验证电子邮件地址的所有权),我使用一种模式,其中活动的状态可以被标记化并存储在数据存储区中,然后检索并稍后恢复。为了检索状态令牌,我有一个地方,它将增强的令牌ID作为参数,从数据存储区中取出它,然后根据需要导航到适当的位置以继续处理。这使我能够创建一个指向我的应用程序的特定状态的链接,该状态可以通过电子邮件分发。例如:
http://mydomain.com/#signup:anJlbmZyb0BldGhvc2VkZ2UuY29tfDEzNzQxOTIxNjU3NjQ=
在这种情况下,上述链接将被发送到注册期间使用的电子邮件地址,应用程序将恢复哈希参数标识的注册活动。
直到最近,当我添加SSL证书并通过将以下代码添加到我的web.xml时对所有请求强制执行https时,一切运行良好:
<security-constraint>
<web-resource-collection>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
此约束强制https通过(我相信)301重定向到端口443.在Chrome,Firefox和IE中工作就像一个魅力....但是safari似乎在重定向时删除了url片段......我想你可以看到我的问题!如何防止safari丢弃url片段?!
经过深思熟虑的研究,我认为我找到了根本原因,但我还没有找到一个好的解决方案。 w3c备忘录Handling of fragment identifiers in redirected URLs(1999)
中提供了对问题的详尽描述基本上,http规范还不清楚在3xx重定向期间处理url片段;并且safari选择在重定向时删除片段。请参阅以下bugzilla错误:
https://bugs.webkit.org/show_bug.cgi?id=24175
w3c的共同用户代理问题描述了所需的行为:
http://www.w3.org/TR/cuap#uri
鉴于这一切,我认为这是一个safari(webkit)问题。我不明白为什么其他webkit浏览器不受影响?有没有已知的解决方法?
答案 0 :(得分:5)
只需提供一个重定向页面(200),在加载时刷新window.location并注入散列片段。
<!DOCTYPE html>
<meta charset="utf-8">
<html>
<body>
<script>
var hash = (location.href.split("#")[1] || null);
var pathField = "{{redirectUri}}";
if (hash) {
if (pathField.indexOf("#") == -1) {
pathField = pathField + "#" + hash;
}
}
window.location = pathField;
</script>
</body>
</html>
这样,它适用于每个浏览器(至少支持javascript的浏览器)。 {{redirectUri}}是您要重定向到的网址。如果它已包含片段,则不会被覆盖。