Java ロゴ

HttpServletRequest.getHeader(“Referer”)で遷移元を取得

Webアプリケーションを開発していると、「ユーザーがどのページからこのページにやってきたのか」という遷移元の情報(リファラー)を知りたい場面がよくあります。

アクセス解析に利用したり、特定のページからの遷移でのみ処理を行ったりと、用途は様々です。

この記事では、Java(Servlet/JSP)を使用して、遷移元URLを取得する具体的な方法と、その際の注意点について詳しく解説します。

遷移元(リファラー)とは?

リファラー(Referer)とは、WebブラウザがWebサーバーに対して送信するHTTPリクエストヘッダーに含まれる情報の1つです。ユーザーがリンクをクリックして別のページに移動した際、ブラウザは「移動元のページのURL」をこのリファラー情報としてサーバーに伝えます。

豆知識: 正しい英語のスペルは「Referrer」ですが、HTTPの仕様が策定された際のスペルミスがそのまま定着してしまったため、プログラム上では「Referer」と記述します。

HttpServletRequestでリファラーを取得する方法

JavaのServletでリファラーを取得するには、HttpServletRequest インターフェースに用意されている getHeader() メソッドを使用します。

引数に取得したいヘッダー名である "Referer" を文字列で指定します。

実装サンプルコード

実際にリファラーを取得して画面に表示するシンプルなサーブレットのサンプルコードです。省略せずに全て記述していますので、お手元の環境で動作確認をしてみてください。

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/referer-check")
public class RefererCheckServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {

        // レスポンスの文字コードとContent-Typeを設定
        response.setContentType("text/html; charset=UTF-8");

        // ここでリファラー(遷移元URL)を取得します
        String referer = request.getHeader("Referer");

        // 画面出力用のPrintWriterを取得
        PrintWriter out = response.getWriter();

        out.println("<!DOCTYPE html>");
        out.println("<html lang=\"ja\">");
        out.println("<head>");
        out.println("<meta charset=\"UTF-8\">");
        out.println("<title>遷移元URLの取得結果</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>リファラー取得テスト</h1>");

        // 取得したリファラーがnullまたは空文字でないかチェック
        if (referer != null && !referer.isEmpty()) {
            out.println("<p>遷移元のURLは以下の通りです:</p>");
            out.println("<p><strong>" + referer + "</strong></p>");
        } else {
            // リファラーが取得できなかった場合の処理
            out.println("<p>遷移元のURL(リファラー)は取得できませんでした。</p>");
        }

        out.println("</body>");
        out.println("</html>");
    }
}

リファラーを利用する際の重要な注意点

request.getHeader("Referer") を使えば簡単に遷移元URLを取得できますが、実際のシステム開発で利用する際には、以下の点に十分注意する必要があります。

1. 常に取得できるとは限らない

リファラーは様々な理由で送信されない(null になる)ことがあります。プログラムを記述する際は、必ず null チェックを行うようにしてください。

【リファラーが取得できない主なケース】 * ブラウザのブックマーク(お気に入り)からのアクセス * ブラウザのアドレスバーに直接URLを入力してアクセスした場合 * セキュリティソフトやブラウザのアドオン等でリファラーの送信をブロックしている場合 * HTTPS(暗号化通信)のページから、HTTP(非暗号化通信)のページへ遷移した場合 * 遷移元のHTML側で <meta name="referrer" content="no-referrer"> などの送信制御が行われている場合

2. リファラー情報は偽装可能である

リファラーはクライアント(ブラウザ)側から送られてくる自己申告のデータに過ぎません。悪意のあるユーザーであれば、ツール等を使用して簡単にリファラー情報を書き換え(偽装し)て送信することが可能です。

そのため、「特定のページからの遷移でなければ処理を実行しない」といったセキュリティの根幹に関わる重要なチェックをリファラーのみに頼るのは非常に危険です。重要な処理の認証には、必ずセッションやトークンなどの確実な方法を使用してください。

まとめ

  • Javaで遷移元URLを取得するには HttpServletRequest.getHeader("Referer") を使用する。
  • 取得できないケースがあるため、必ず null チェックを行う。
  • 偽装が可能な情報であるため、セキュリティ目的での単独利用は避ける。

リファラーの特性を正しく理解し、安全なWebアプリケーション開発に役立ててください。

Home » コンピューター » HttpServletRequest.getHeader(“Referer”)で遷移元を取得