几个 Web 应用程序身份验证协议(如 WS-Federation 和 SAML 协议,即所谓的“被动”协议,显然还有 ASP.NET Forms 身份验证,请参阅此 StackOverflow 问题和 AppEngine,请参阅此 GWT 错误评论)丢失原始的“URL 片段”,即#-符号之后的部分。
发生的情况大致如下:在干净的浏览器中(因此没有缓存的信息/cookies/登录信息)我打开 URL (1) http://example.com/myapp/somepage?some=parameter#somewhere。这使得浏览器请求 (2) http://example.com/myapp/somepage?some=parameter,服务器将我重定向到我的身份提供者(包括身份验证请求中的 URL (2)),最终我被重定向回到我来自的地方,即 URL (2):这是服务器知道的唯一 URL。但是我想转到 URL (1),并且 URL 片段('anchor')一直丢失,实际上已经在第一步中。
这似乎是这些协议的基本限制,因为服务器根本看不到 URL 片段。
我知道它是根据浏览器从服务器请求 (2) 的规范,当我导航到 (1) 时,导致对 SAML 协议、WS-Federation 等的这种片段丢失限制。我的问题是:怎么做我解决了这个限制?
显而易见的解决方法是避免 URL 片段,正如这个答案中所建议的那样。但是,对于我们的特定 Web 应用程序来说,这并不好,因为我们在单页 GWT 应用程序中使用了可收藏的 URL 片段,以确保我们的应用程序中的导航不会导致页面重新加载。
我的问题:对于这种情况,还有哪些其他解决方法或标准模式?
(我对 GWT + SAML 协议解决方案特别感兴趣。)