[解決済み] HTTPとHTTPSの両方のリクエストに対して、Servletで完全なURLとクエリ文字列を取得する。
2023-08-25 03:47:47
質問
私はタスクが要求されたURLまたはフルパスを取得することであるコードを書いています。私はこのコードを書きました。
HttpServletRequest request;//obtained from other functions
String uri = request.getRequestURI();
if (request.getQueryString() != null)
uri += "?" + request.getQueryString();
で、ブラウズすると
http://google.com?q=abc
を参照すると、OK(正しい)です。
しかし
https://google.com
. の値が
uri
は
http://google.com:443google.com:443
である場合のみ、プログラムは
HTTPS
が使われているときだけです。
また、出力は
request.getRequestURL().toString()
.
解決策は何ですか?
どのように解決するのですか?
デザインで
getRequestURL()
は、クエリ文字列だけが欠けた完全な URL を提供します。
で
HttpServletRequest
の場合、以下の方法でURIの個々の部分を取得することができます。
// Example: http://myhost:8080/people?lastname=Fox&age=30
String uri = request.getScheme() + "://" + // "http" + "://
request.getServerName() + // "myhost"
":" + // ":"
request.getServerPort() + // "8080"
request.getRequestURI() + // "/people"
"?" + // "?"
request.getQueryString(); // "lastname=Fox&age=30"
-
.getScheme()
は、あなたに"https"
であった場合https://domain
のリクエストに対応します。 -
.getServerName()
与えるdomain
でhttp(s)://domain
. -
.getServerPort()
を実行すると、ポートが表示されます。
以下のスニペットを使用します。
String uri = request.getScheme() + "://" +
request.getServerName() +
("http".equals(request.getScheme()) && request.getServerPort() == 80 || "https".equals(request.getScheme()) && request.getServerPort() == 443 ? "" : ":" + request.getServerPort() ) +
request.getRequestURI() +
(request.getQueryString() != null ? "?" + request.getQueryString() : "");
上記のスニペットは、完全な URI を取得し、デフォルトのポートが使用されている場合はポートを隠し、さらに
"?"
とクエリ文字列が提供されていない場合は追加しません。
プロキシされたリクエスト
リクエストがプロキシを通過する場合、プロキシを通過する前に
X-Forwarded-Proto
ヘッダを見る必要があることに注意してください。
request.getHeader("X-Forwarded-Proto")
また、一般的なヘッダは
X-Forwarded-For
で、これはプロキシの IP ではなく、オリジナルのリクエストの IP を表示します。
request.getHeader("X-Forwarded-For")
プロキシ/ロードバランサの設定を自分で行う場合、転送時にこれらのヘッダが設定されていることを確認する必要があります。
関連
-
Eclipse の問題 アクセス制限。タイプ 'jfxrt' はAPI解決されていません。
-
Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
-
Java の switch case 文で必要な定数式の問題の解決法
-
ジャバアレイ
-
java send https request prompt java.security.cert.について。
-
eclipse 実行 Java、エラー: 選択を起動できず、レシーバーもありません。
-
1分でわかる!恋人の写真をIDEAの背景画像に設定する方法【おすすめ集
-
[解決済み] java.net.URLConnectionを使用してHTTPリクエストを発生させ処理する方法
-
[解決済み] クエリ文字列パラメータのJava URLエンコーディング
-
[解決済み] サーブレットマッピングのurlパターンにおける/と/*の違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
アクセス制限です。タイプ 'JPEGCodec' は API ではない ☞My Blog Github ☜ ホームページを見る
-
プロジェクトの依存関係を解決できない。
-
ApplicationContextの起動エラーです。条件レポートを表示するには、アプリケーションを'de'で再実行します。
-
Jsoup-Crawlingの動作
-
無効なメソッド宣言
-
java.sql.SQLException: 結果セットの開始前
-
ジャバアレイ
-
Java:未解決コンパイル問題の解決方法
-
Java JDKのダイナミックプロキシ(AOP)の使用と実装の原理分析
-
linux ant Resolve error: main class not found or couldn't be loaded org.apache.tools.ant.launcher.