【Webシステム開発】サーブレットでdoGetとdoPostの違いを理解しよう

Webシステム開発講座へようこそ!
今回は、前回までなんとなく利用していたdoGetとdoPostの違いについて説明します。これが理解できることでHTTPリクエストの処理方法をより深く理解できるようになります。

この記事は次のような方におすすめです:

  • JSPやサーブレットをこれから学ぼうとしている方
  • SEとして新たなスキルを身につけたい方
  • doGetとdoPostの違いが説明できない方

前回の画面作成の記事をまだご覧になっていない方は、こちらからご確認ください。

前回の課題の回答

課題 1: ログアウト処理の確認

「ログアウトボタンを押下した後、適切にログイン画面へリダイレクトされ、セッションがクリアされていることを確認してください。」

  • 目的: ログアウト機能の動作確認とセッションのクリアが適切に行われていることを理解する。
  • ヒント: ログアウト後に再度メニュー画面へのアクセスを試みて、ログイン画面に戻ることを確認します。

コチラの確認方法は複数あるので正解はないのですが、ここでは1例を紹介します。

ログアウトボタンを押下した後、以下の手順で確認を行います。

  1. ログアウトボタンを押す: メニュー画面にあるログアウトボタンをクリックします。
  2. リダイレクト確認: ログアウト後にブラウザがログイン画面(login.jsp)にリダイレクトされることを確認します。
  3. セッションの確認: 以下の方法でセッションがクリアされていることを確認します。
    • ログアウト後に、ブラウザのURLバーにメニュー画面のURLを直接入力し、アクセスを試みます。
    • メニュー画面にアクセスしようとすると、ログイン画面にリダイレクトされることを確認します。これは、セッション情報がクリアされたためにメニュー画面に直接アクセスできなくなったことを示します。

課題 2: ログイン後のウェルカムメッセージの変更

「ログインしたユーザー名が”test”の場合、ウェルカムメッセージを【試験用画面】と表示させるようにしてください」

  • 目的: ユーザーごとに異なるメッセージを表示し、個別対応の方法を学ぶ。
  • ヒント: if 文を使用して、特定のユーザー名に対して特別なメッセージを表示します。

ユーザーが”test”の場合はウェルカムメッセージを【試験用画面】、その他のユーザーの場合は元の”ようこそ、○○さん!”と表示させるためにはJSPとサーブレットの両方を修正する必要があります。
※サーブレットだけの修正では文字列部分が修正できないため

まずはサーブレット側の修正を表示します。

menuServlet.java

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // ユーザー名をリクエストから取得
    String username = request.getParameter("username"); // クエリパラメータから取得
    HttpSession session = request.getSession();

     // "test"というユーザー名の場合は特別なメッセージを表示
    if(username.equals("test") ) { // 取得したパラメータが"test"に一致するかを判断
        session.setAttribute("loggedInUser", "【試験用画面】");
    }
    else {
        session.setAttribute("loggedInUser", "ようこそ、" + username +"さん!");
    }
    
    RequestDispatcher dispatcher = request.getRequestDispatcher("/menu.jsp");
    dispatcher.forward(request, response);
}

ポイント

  • session.setAttribute("loggedInUser", ...): 「セッションにloggedInUserという名前の属性を設定し、その後のページでユーザー名を使えるようにします。」

menu.jsp

<h1>メニュー画面</h1>
<!-- セッションから「loggedInUser」の属性を取得し表示 -->
<p><%= (String) session.getAttribute("loggedInUser") %></p>
<form action="/AnkiSystem/menuServlet" method="GET">

doGetとdoPostの違いについて

doGetとdoPostは、HTTPリクエストのメソッドであり、JSPからJavaサーブレットにデータを送信する際に使用されます。これらの違いを理解することで、適切な用途に応じた選択が可能になります。

doGetメソッドについて

doGetメソッドはパラメータ情報をURLにのせてサーブレットに送信する方法になります。そのため、通信時のデータが外部からも確認されてしまいますが、速度の速い通信技術が実現可能です。ただし、URLに情報が露出するため、セキュリティに配慮が必要です。

doPostメソッドについて

doPostメソッドはパラメータ情報をフォームデータとしてサーブレットに送信する方法になります。送信データがURLに露出しないため、セキュリティが確保されます。また、doGetに比べて大量のデータを送信することができますが、通信速度はやや低下します。

それぞれの仕様用途について

  • doGetメソッド: 画面遷移やデータの参照など、簡単な動作に向いています。特に検索機能などで使用されることが多いです。
  • doPostメソッド:フォーム送信やデータ登録など、ユーザーからの入力を伴う処理に適しています。ユーザー登録やログイン処理などでよく使用されます。

doGetとdoPostの動作確認

先ほどの説明に加えてdoGetとdoPostについてそれぞれ実装を踏まえて動作を確認しましょう。

前回までのログイン画面の実装を確認(doGet)

元々利用していたログイン画面のコードを参考にします。ソースコードを以下に記述します。

login.jsp

<form action="/AnkiSystem/loginServlet" method="GET">
    <div class="form-group">
        <label for="username">ユーザー名</label>
        <input type="text" id="username" name="username">
    </div>
    <div class="form-group">
        <label for="password">パスワード</label>
        <input type="password" id="password" name="password">
    </div>
        <button type="submit" class="login-button">ログイン</button>
</form>

loginServlet.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String username = request.getParameter("username");
    HttpSession session = request.getSession();
    if(username.equals("test")) {
        session.setAttribute("loggedInUser", "【試験用画面】");
    } else {
        session.setAttribute("loggedInUser", "ようこそ、" + username +"さん!");
    }
    RequestDispatcher dispatcher = request.getRequestDispatcher("/menu.jsp");
    dispatcher.forward(request, response);
}

動作確認

ユーザー名「テスト」、パスワード「pass」でログインを試みると、以下のURLが表示されるはずです

http://localhost:8080/AnkiSystem/loginServlet?username=test&password=pass

ここでわかるように、パスワードがURLに表示されるセキュリティリスクが生じます

doPostで実装し直す

次に、ログイン画面をdoPostで処理するように変更します。修正部分のみを以下に示します。

loginServlet.javaの修正

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // ユーザー名をリクエストから取得
    request.setCharacterEncoding("UTF-8");
    String username = request.getParameter("username");
    HttpSession session = request.getSession();
    
    // "test"というユーザー名の場合は特別なメッセージを表示
    if(username.equals("test") ) {
        session.setAttribute("loggedInUser", "【試験用画面】");
    }
    else {
        session.setAttribute("loggedInUser", "ようこそ、" + username +"さん!");
    }
    
    RequestDispatcher dispatcher = request.getRequestDispatcher("/menu.jsp");
    dispatcher.forward(request, response);
}

修正のポイント

元々のdoGet処理のままでは、リクエストパラメータの文字エンコーディングが正しく設定されていないため、文字化けが生じてしまいます。エンコーディングを指定してリクエストを正しく処理するために、request.setCharacterEncoding("UTF-8"); を事前に挿入する必要があります。これにより、日本語などのマルチバイト文字が正しく処理されます。

login.jspの修正

<form action="/AnkiSystem/loginServlet" method="POST">
    <div class="form-group">
        <label for="username">ユーザー名</label>
        <input type="text" id="username" name="username">
    </div>
    <div class="form-group">
        <label for="password">パスワード</label>
        <input type="password" id="password" name="password">
    </div>
        <button type="submit" class="login-button">ログイン</button>
</form>

動作確認

doPostメソッドに変更後、再度同じ条件でログインを試みます。以下のように、パスワードを含むデータがURLに表示されなくなり、セキュリティが向上します。

http://localhost:8080/AnkiSystem/loginServlet

このように、doPostメソッドを使用することで、送信データがHTTPリクエストのボディに含まれるため、URLにデータが露出するリスクがなくなり、より安全な通信が可能になります。


今回の講義では、doGetdoPost メソッドの違いについて学びました。それぞれの違いを理解することで、セキュリティと信頼性の高いシステムを構築できるようになります。もし疑問点やわからない箇所があれば、ぜひコメントで教えてください。

「記事の更新を待てない!」「すぐに動画で学びたい!」という方には、Udemyでの学習がおすすめです。
私自身も利用して、基礎から応用までしっかりと学べたので、非常に助かりました!ぜひ一度チェックしてみてください。
多彩な講座から自分に合った講座を探そう!

Udemyについての詳しい記事はコチラをご参照ください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です