web-dev-qa-db-ja.com

クエリ文字列でのHash(#)の動作は何ですか

以下のURLをクエリ文字列とともに送信しています。クエリ文字列では、1つのパラメータ「approverCmt」にhash(#)の値があります。

    "/abc/efd/xyz.jas?approverCmt=Transaction Log #459505&batchNm=XS_10APR2015_082224&mfrNm=Timberland"

サーバー側で、取得したリクエストから取得しようとしたとき

    approverCmt = Transaction Log  -----> "#459505" is missing
    batchNm = null
    mfrNm = null

そして、クエリ文字列からハッシュ(#)を削除するか、#を%23に置き換えると、すべてが正常に機能します

別のパラメーターにハッシュ(#)記号が含まれている場合、あるパラメーターでnullが発生する理由がわかりません。

誰かが説明できるかどうか感謝します。

9

これは「フラグメント識別子」として知られています。

ウィキペディア で述べたように:

ハッシュマーク#で導入された_fragment identifier_は、ドキュメントのURLのオプションの最後の部分です。これは通常、そのドキュメントの一部を識別するために使用されます。

_#_の後の部分は、clientの情報です。サーバーには送信されません。ここにブラウザだけが必要なものをすべて入れてください。

JavaScriptのencodeURIComponent()関数を使用してURLの特殊文字をエンコードすると、_#_文字が他の文字に変換され、URL全体がサーバーに送信されるようになります。 。

12
Prashant

ハッシュ値はアンカー用であるため、クライアント側のみであり、クライアント側のルーティングのangular)のようなクライアント側のフレームワークでよく使用されます。

アンカーはサーバー側では使用できません。

あなたの場合、アンカーは必要ありませんが、#が付いたパラメータ値はクエリ文字列を中断します。値は「トランザクションログ#459505」です。

動作しない素朴なソリューションを編集します。履歴を確認してください。以下の実際のソリューションを参照してください

解決策は、クライアント側をエンコードし、サーバー側をデコードすることです

Javascriptでのエンコード

   encodeURI("Transaction Log #459505")
   //result value "Transaction%20Log%20#459505"

Javaでデコード

 Java.net.URLDecoder.decode("Transaction%20Log%20#459505");
  //result  "Transaction Log #459505"

編集:しかし:JavascriptはJavaと同じ方法でエンコードされないので、正しい答え(私は願っています)は手動ですべての#を%23に置き換え、次にJavaは通常どおりにデコードするか、コメントで提案されているようにencodeURIComponentを使用します。必要に応じて、置換ソリューションで十分なようです。

Javascriptでエンコード:

encodeURI("yourUrl/Transaction Log #459505").replace(/#/,"%23")
//result: yourUrl/Transaction%20Log%20%23459505

Javaのデコードは変更されません

Java.net.URLDecoder.decode("Transaction%20Log%20#459505")
// result (Java.lang.String) Transaction Log #459505

長い投稿で申し訳ありませんが、JavaとJavaScripUrlエンコーディングの違いはわかりませんでした

2
pdem

ハッシュはアンカーです:

詳細については、 wikipedia を参照してください。

1
Jens