【JSP/Servlet】ログイン画面の実装及び疑問解消

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Nect

【JSP/Servlet】ログイン画面の実装及び疑問解消

#1

投稿記事 by Nect » 4年前

こんばんは。Nectと申します。

ある入門書のサンプルソースコードを動作させたいです。
また、以下の疑問点を解消したいです。
①LoginResult.jspの4、18行目に関して、ユーザ情報を取得できた場合に「ログインに成功しました。」という
文言が表示されます。Login#37~42行目の処理が、パスワードが1234でない場合も実行されている理由はなんでしょうか?

②パスワードが1234以外でも「ログインに成功しました。」という文言が表示されるてしまう理由はなんでしょうか?

③loginResult.jspの3~5行目を削除しても、16行目が実行されて「ログインに成功しました。」という文言が表示される
理由はなんでしょうか?

【index.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>
<h1>ようこそ</h1>

<!-- request.getParameter("name")とrequest.getParameter("pass") の()内の名称はnameと一致させる。-->
<form action="/Test/login" method="post">
ユーザー名:<input type="text" name="name"><br>
パスワード:<input type="password" name="pass"><br>
<input type="submit" name="確認用" value="ログイン">
</form>
</body>
</html>
 
【Login.java】

コード:

package servlet3;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import model3.LoginLogic;
import model3.User;

public class Login extends HttpServlet {
  private static final long serialVersionUID = 1L;

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


	//ユーザ名、パスワードを取得
    request.setCharacterEncoding("UTF-8");
    String name = request.getParameter("name");
    String pass = request.getParameter("pass");

    //取得したユーザ名、パスワードを移動
    User user = new User(name, pass);

    LoginLogic loginLogic = new LoginLogic();
    //ユーザ名、パスワードを渡す
    //パスワードが1234である場合、ログイン成功
    boolean isLogin = loginLogic.execute(user);

    //パスワードが1234の場合、処理が実行される。
    if (isLogin) {

    	//セッションスコープにUser情報を格納する。
      HttpSession session = request.getSession();
      session.setAttribute("User", user);
    }

    RequestDispatcher dispatcher =
        request.getRequestDispatcher
            ("/WebContent/WEB-INF/jsp2/loginResult.jsp");

    dispatcher.forward(request, response);
  }
}
 
【loginResult.jsp】

コード:

 
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import="model3.User" %>
<%
User loginUser = (User) session.getAttribute("User");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>テスト</title>
</head>
</head>
<body>
<h1>テストログイン</h1><br>

<% if(loginUser != null) { %>
<p>ログインに成功しました</p>
<p>ようこそ<%= loginUser.getName() %>さん</p>
<a href="/Test/main">投稿・閲覧へ</a>
<% } else { %>
<p>ログインに失敗しました</p>
<a href="/WebContent/WEB-INF/jsp2/index.jsp">TOPへ</a>
<% } %>
</body>
</html>
 
ご教授の程、宜しくお願い致します。

たいちう
記事: 418
登録日時: 9年前

Re: 【JSP/Servlet】ログイン画面の実装及び疑問解消

#2

投稿記事 by たいちう » 4年前

少し調べてみると、似たようなソースコードがありました。
書籍名とかを書いてくれると、手間が省けてピンポイントで良い回答もつきやすいかも。

「san goo」さんのブログ

class LoginLogicやclass Userは、Nectさんが本を元に書いたものですよね?
そこに間違いはないですか?どう書かれていますか?

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: 【JSP/Servlet】ログイン画面の実装及び疑問解消

#3

投稿記事 by へにっくす » 4年前

キャッシュを無効にするパラメータがないので、
サーバサイドのJSPを書き換えても、クライアント側のブラウザのキャッシュが効いていて、更新されていないのでは。
ブラウザのキャッシュをクリアするとどうなりますか?

参考)
JSPの基本「暗黙オブジェクト」をさらに極める(2/3)
上記のヘッダ情報の発行参照
written by へにっくす

Nect

Re: 【JSP/Servlet】ログイン画面の実装及び疑問解消

#4

投稿記事 by Nect » 4年前

たいちうさん

>class LoginLogicやclass Userは、Nectさんが本を元に書いたものですよね?
そこに間違いはないですか?どう書かれていますか?

『スッキリわかるサーブレット&JSP』の268~280Pのサンプルを一部編集してあります。


へにっくすさん

>ブラウザのキャッシュをクリアするとどうなりますか?

キャッシュをクリアしたところ、ログイン失敗画面にも遷移することができました。
Webアプリケーション上で保持されているパスワードが優先されているということでしょうか?

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: 【JSP/Servlet】ログイン画面の実装及び疑問解消

#5

投稿記事 by へにっくす » 4年前

Nect さんが書きました:キャッシュをクリアしたところ、ログイン失敗画面にも遷移することができました。
Webアプリケーション上で保持されているパスワードが優先されているということでしょうか?
ちょっと認識が違います。
まずWebアプリケーションを起動してるのはサーバ側です。
①クライアント側からURLを指定すると、そのURLに基づきサーバ側からログイン画面を送ります。
②クライアント側はそのログイン画面を受け取り表示して、ユーザーからの入力を待ちます。
③ユーザーからユーザー名とパスワードを入力すると、それをもとにクライアント側からそのデータをサーバ側に送ります。
④サーバ側は受け取ったユーザ名とパスワードを元にログインできるかを判定して、結果の画面を返します。
とふつうは流れますが、クライアント側のブラウザでキャッシュが有効になっていると、③の段階で前回取得したキャッシュを取得してしまうので、サーバ側にそのデータが行きません。
つまり、そもそもパスワード優先とかいう話ではなくサーバ側に届いていなかったのです。
キャッシュデータを削除することで、再度ユーザー名とパスワードをサーバ側に送ることができたのです。

サーバ側とクライアント側は分けて考えてください。
wiresharkなどで、サーバとクライアントの間の通信内容を見てみることをお勧めします。
written by へにっくす

閉鎖

“C言語何でも質問掲示板” へ戻る