12

私の 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>

この制約は、ポート 443 への 301 リダイレクトを介して (私が信じている) https を強制します。Chrome、Firefox、および IE では魅力的に動作します....しかし、Safari はリダイレクト時に URL フラグメントをドロップするようです...私の問題を見ることができると思います! サファリがURLフラグメントをドロップしないようにするにはどうすればよいですか?!

アップデート 8.1.13

研究を重ねた結果、根本原因は特定できたと思いますが、まだ良い解決策を見つけていません。この問題の詳細な説明は、w3c memo 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

これらすべてを踏まえると、これはサファリ (webkit) の問題だと思います。私が理解できないのは、他の Webkit ブラウザーが影響を受けないのはなぜですか? 既知の回避策はありますか?

4

1 に答える 1

5

ロード時に window.location を更新し、ハッシュ フラグメントを挿入するリダイレクト ページ (200) を提供するだけです。

<!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}} は、リダイレクト先の URL です。すでにフラグメントが含まれている場合、上書きされません。

于 2013-09-13T00:30:16.203 に答える