HttpServletRequest-参照URLを取得する方法?


144

私のサイトにリンクしているURLをJavaサーブレットに記録する必要があります。


Googleでサイトを見つけてリンクを開いた場合、「google.com」をログに記録したことを正しく理解しましたか?
ローマ

回答:


310

HTTP refererヘッダーで使用できます。次のようにしてサーブレットで取得できます。

String referrer = request.getHeader("referer"); // Yes, with the legendary misspelling.

ただし、これはクライアントが制御する値であるため、まったく異なるものになりすまされたり、削除されたりする可能性があることを理解する必要があります。したがって、それが返す値が何であれ、バックエンドの重要なビジネスプロセスではなく、プレゼンテーションコントロール(特定の純粋なレイアウトパーツの非表示/表示/変更など)および/または統計にのみ使用する必要があります。

興味のある方のために、スペルミスの背景はWikipediaにあります。


2
「リファラー」と「リファラー」は違いますか?
ante.sabo

7
@ante:いいえ、ヘッダーの検索では大文字と小文字が区別されません。
BalusC

2
どんなヘッダーでも可能であることに注意してくださいnull
RDS

@BalusC以前の2つのURLが必要な場合はどうなりますか?可能です ?
Angel Cuenca 2016年

26

実際、それは次のとおりです: request.getHeader("Referer")、またはさらに良い、そして100%確実にする request.getHeader(HttpHeaders.REFERER)ために、HttpHeadersはcom.google.common.net.HttpHeaders


11
メソッドgetHeader(String name)(引用)のJava EE APIドキュメントから:"The header name is case insensitive."
informatik01

7
とにかくHttpHeaders参照に賛成票を投じます。:ApacheのHTTPは、別の良いものですorg.apache.http.HttpHeaders
Barett

16

URLはリクエストで渡されます:request.getRequestURL()

あなたにリンクしている他のサイトを意味するなら?HTTPリファラーをキャプチャする必要があります。これは、次を呼び出すことで実行できます。

request.getHeader("referer");

6

すべてが述べたように

request.getHeader("referer");

受け入れられた回答とは対照的に、refererヘッダーのセキュリティの側面についてもう少し詳しく説明したいと思います。Open Web Application Security Project(OWASP)のチートシートでは、クロスサイトリクエストフォージェリ(CSRF)防止用のチートシートで、リファラーヘッダーの重要性について言及しています。

さらに重要なのは、この推奨される同一オリジンチェックでは、「禁止」ヘッダーリストにあるため、JavaScriptで設定できないHTTPリクエストヘッダーがいくつかあります。これらのヘッダーの値を設定できるのはブラウザー自体だけであり、XSSの脆弱性を使用してもヘッダーを変更できないため、ブラウザーの信頼性が高まります。

ここで推奨されているソースオリジンチェックは、これらの保護されたヘッダーのうち3つ(オリジン、リファラー、ホスト)に依存しているため、それ自体が非常に強力なCSRF防御になります。

Forbiddenヘッダーリストはここで参照できます。ユーザーエージェント(ブラウザ)は、ユーザーではなく、これらのヘッダーを完全に制御します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.