以下の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が発生する理由がわかりません。
誰かが説明できるかどうか感謝します。
これは「フラグメント識別子」として知られています。
ウィキペディア で述べたように:
ハッシュマーク#で導入された_
fragment identifier
_は、ドキュメントのURL
のオプションの最後の部分です。これは通常、そのドキュメントの一部を識別するために使用されます。
_#
_の後の部分は、client
の情報です。サーバーには送信されません。ここにブラウザだけが必要なものをすべて入れてください。
JavaScriptのencodeURIComponent()
関数を使用してURLの特殊文字をエンコードすると、_#
_文字が他の文字に変換され、URL全体がサーバーに送信されるようになります。 。
ハッシュ値はアンカー用であるため、クライアント側のみであり、クライアント側のルーティングの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エンコーディングの違いはわかりませんでした
ハッシュはアンカーです:
詳細については、 wikipedia を参照してください。