弊社の新人エンジニア研修向けのJSP Servletの問題集です。

1.ログイン処理①

あなたは、ログイン処理のプロトタイプを作成している。

まずは、ログイン画面から会員専用ページへの画面遷移の部分を作成した。

login.jspで正しくID,パスワードを入力できた時だけmember_only.jspに遷移し、それ以外の場合は、login.jspに戻される処理を書いた。

なお、IDとパスワードは以下のとおりとする。

ID:imai 

PASSWORD:p

ソースコード③の空欄①~④を埋めなさい。

なお、IDとパスワードの暗号化は考えなくてもよい。

<ソースコード①> login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>ログイン画面</title>
        <style>
            #center {
                height: 200px;
                width: 300px;
                position: absolute;
                left: 50%;
                top: 50%;
                margin-top: -100px;
                margin-left: -150px;
                text-align: center;
            }
        </style>
    </head>
    <body>
        <div id="center">
            <form action="Login" method="post">
                ユーザーID:<input type="text" name="id" required><br>
                パスワード:<input type="password" name="pass" required><br>
                <input type="submit" value="ログイン"><br>
            </form>
        </div>
    </body>
</html>




<ソースコード②> member_only.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>メンバーだけの情報です</title>
    </head>
    <body>
        <h1>メンバーだけの情報です</h1>
    </body>
</html>




<ソースコード③> Login.java

import java.io.IOException;
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(urlPatterns = {"/Login"})
public class Login extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String id = request.getParameter("id");
        String pass = request.getParameter("pass");

        if ("imai"./*①*/(id) && "p"./*②*/(pass)) {
            /*③*/("member_only.jsp");
        } else {
            /*④*/("login.jsp");
        }
    }
}




なお、上記の例で「"imai".equals(id)」のように「文字列.equals(変数名)」としているのはnullPointerExceptionの可能性を排除するためです。

id.equals("imai")

のように「変数名.equals(文字列)」とすると、idがnullの可能性を排除できません。

NullPointerExceptionが発生する可能性がありますので、

if (id != null)

のようにnull判定をする必要があります。

2.ログイン処理②

上記のプログラムを先輩に見せたところ、今のままでは、member_only.jspへの直接アクセスを防げないとの指摘を受けた。

セッション管理を使い、ログインしていないユーザーは、login.jspに戻すようにしたい。

以下のソースコードの①~⑤を埋めなさい。

なお、login.jspに変更はない。

<ソースコード④> Login.java

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

@WebServlet(urlPatterns = {"/Login"})
public class Login extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String id = request.getParameter("id");
        String pass = request.getParameter("pass");

        if ("imai".equals(id) && "password".equals(pass)) {

            /*①*/ session = request.getSession();

            session./*②*/("id", id);
            session./*②*/("pass", pass);

            /*③*/.getRequestDispatcher("member_only.jps").forward(request, response);
        } else {
            /*④*/.sendRedirect("login.jsp");
        }

    }
}




<ソースコード⑤> member_only.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>メンバーだけの情報です</title>
    </head>
    <body>
        <%
            if (/*⑤*/) {
                request.getRequestDispatcher("login.jsp").forward(request, response);
            }
        %>

        <h1>メンバーだけの情報です</h1>
    </body>
</html>




3.ログアウト処理

あなたは、次にログアウト処理を付け加えることにした。

ログアウトボタンをユーザーが押下すると以下のlogin.jspに遷移するようにしたい。

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>ログアウト画面</title>
     </head>
    <body>
        <p>ログアウトしました。</p>
    </body>
</html>




そのためmember_only.jspに以下のようなフォームを追加した。

<form action = "Logout">
<input type ="submit" value ="ログアウト">
</form>





Logout.javaの以下の①~②を埋めなさい。

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

@WebServlet(urlPatterns = {"/Logout"})
public class Logout extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        HttpSession session = /*①*/();
        session./*②*/();

        response.sendRedirect("login.jsp");

    }
}




※なお、session.invalidate()はAPIに「このセッションを無効にし、それにバインドされているオブジェクトのバインドを解除します。」とある通り、オブジェクトは削除されないことに注意してください。

4.ブラウザバック対策

あなたが、上記システムを先輩に見せたところ、ログアウト処理をした後にブラウザの戻るボタンをクリックすることでmember_only.jspが見えてしまうことを指摘された。

member_only.jspに以下のコードを書き加えることでブラウザバックの対策をしなさい

response.setHeader("Cache-Control", "no-cache,no-store, must-revalidate");//HTTP1.1をサポートしているブラウザ向けの記述
response.setHeader("Pragma", "no-cache");//HTTP1.0をサポートしているブラウザ向けの記述
response.setHeader("Expires", "0");//プロキシサーバー対策として、過去の日時を入力して強制的にキャッシュを無効化する





5.データベース認証

上記のログインをデータベースにIDとパスワードがあるユーザーだけに限定するようにソースコードを書き換えなさい。

JavaWebアプリケーションの問題集に戻る