if文でnullはelseと書いているにも関わらず、nullでも、ログインに成功してしまいます。このコードでは、いけないのでしょうか?

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,216

edoooooo

score 159

javaでjspのコードです。
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import="model.User" %>
    <%
    //セッションスコープからユーザー情報を取得
    User loginUser=(User)session.getAttribute("loginUser");
    %>
<!DOCTYPE html >
<html>
<head>
<meta  charset="UTF-8">
<title>taichi</title>
</head>
</head>
<body>
<h1>taichiログイン</h1>
<% if(loginUser !=null){ %>
<p>ログインに成功しました。</p>
<p>ようこそ<%=loginUser.getName() %>さん</p>
<a href="/taichi/Main">つぶやき投稿・閲覧へ</a>
<% }else{ %>
<p>ログインに失敗しました。</p>
<a href="/taichi/">TOPへ</a>
<%} %>
</body>
</html>




//servletパッケージのユーザー情報をセッションスコープに保存するコードを含め
//た全体のservletパッケージのクラスです。
package servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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;

import model.LoginLogic;
import model.User;

/**
 * Servlet implementation class Login
 */
@WebServlet("/Login")
public class Login extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        
        //リクエストパラメータの取得
        request.setCharacterEncoding("UTF-8");
        String name=request.getParameter("name");
        String pass=request.getParameter("pass");
        
        //Userインスタンス(ユーザー情報)の生成
        User user=new User(name,pass);
        
        //ログイン処理
        LoginLogic loginLogic=new LoginLogic();
        boolean isLogin=loginLogic.execute(user);
        
        //ログイン施工時の処理
        if(isLogin){
            //ユーザー情報をセッションスコープに保存
            HttpSession session=request.getSession();
            session.setAttribute("loginUser", user);
        }
        //ログイン結果画面にフォワード
        RequestDispatcher dispatcher=request.getRequestDispatcher("/WEB-INF/jsp/loginResult.jsp");
        dispatcher.forward(request, response);
            }
    }



//LoginLogicです。
package model;
public class LoginLogic{
    public boolean execute(User user){
        if(user.getPass().equals("1234")){return true;}
        return false;
    }
}
よろしくお願いします。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • eripong

    2015/11/13 16:05

    loginUserに値を入れている部分のコードも提示できますか?

    キャンセル

  • edoooooo

    2015/11/13 16:12

    はい、すみませんでした。変更します。

    キャンセル

  • argius

    2015/11/13 16:24

    サーブレットの、ログインに失敗した場合のコードも書いてもらって良いですか?

    キャンセル

  • edoooooo

    2015/11/13 16:33

    servletには、ログイン失敗のないif文になっています。
    コードを全体のものと置き換えます。ありがとうございます。

    キャンセル

回答 4

checkベストアンサー

+6

以前に一度成功してloginUserUserがセットされてしまうと、明示的に削除しないとUserは残ったままです。
session.removeAttribute("loginUser");を実行して、loginUserの中を消す必要があると思います。


User user=new User(name,pass);

LoginLogic loginLogic=new LoginLogic();
boolean isLogin=loginLogic.execute(user);

if (isLogin) {
    // ログインに成功したとき
    session.setAttribute("loginUser", user);
}
else {
    // ログインに失敗したとき
    session.removeAttribute("loginUser");
}


(追記)

ちなみに、ログアウトなどでloginUserだけでなくセッション自体を破棄する場合は、session.invalidate()を実行します。


(さらに追記)
ログイン画面のサーブレットでは必ず最初にsession.invalidate()しても良いかも知れません。
その場合、ログインに失敗したときのremoveは無くしてもOKです。
(eripongさん、ご指摘ありがとうございます。)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/17 14:17

    user.getName()は、名前が未入力の時にnullになっているでしょうか?

    キャンセル

  • 2015/11/17 15:21

    package model;
    import java.io.Serializable;

    public class User implements Serializable {
    /**
    *
    */
    private static final long serialVersionUID = 1L;
    private String name; //ユーザー名
    private String pass; //パスワード

    public User(){}
    public User(String name,String pass){
    this.name=name;
    this.pass=pass;
    }
    public String getName(){return name;}
    public String getPass(){return pass;}
    }

    のようにuser.java となっていたので、nullには、なっていなかったため、String name=null;
    String pass=null;などとしたのですが、保存して、実行したところ、サーブレットがエラーを投げましたとなってしまいます。すみません、宜しくお願いします。

    キャンセル

  • 2015/11/17 15:32

    いえ、そういう意味ではないです。

    「user.getName()は、名前が未入力の時にnullになっているでしょうか?」
    「いいえ、なっていません。」
    「それならば、user.getName()!=nullで判定しても意味ないですよね?」
    ということです。

    あと、
    String name=null;
    としたところで、何がどう変わったのか、理解されていますか?
    エラーがNullPointerExeptionだとしたら、それはnullにしているのだから当然です。
    意味がわからないようでしたら、まずNullPointerExeptionについて調べてみてください。

    書いてあることを読むだけでは無く、何をするためのものかを理解するようにしてください。
    参考書のJava編などにも書いていないか、見直してみてください。
    この編はJavaの基礎レベルだと思うので、そこを理解できないと、この先際限無くつまずきます。

    キャンセル

+2

このコードだと、Sessionnullでない値が入っていたのだと思います。
nullであることはどうやって判断したのですか?

APサーバ(Tomcatでしょうか?)をおとして、再起動した上で、
ブラウザを全て閉じてから、改めてブラウザを開いてこのjspにアクセスするとどうなりますか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/13 16:46

    直接はしていませんでした。いましたところ、http://localhost:8080/taichi/WEB-INF/jsp/loginResult.jsp

    このようにしたのですが、404エラーでした。

    キャンセル

  • 2015/11/13 16:50

    先にargiusさんの回答にあることを試した方が
    よいかと思います。必要な処理です。

    キャンセル

  • 2015/11/13 16:54

    ありがとうございます。

    キャンセル

+2

//ユーザー情報をセッションスコープに保存 
            HttpSession session=request.getSession(); 
            session.setAttribute("loginUser", user); 

上記のようになっているので
ユーザー名がなくてもセッション情報の中にloginUserの項目が存在しているのではないでしょうか?

userが空文字やnullの場合はloginUserをsetAttributeしないようにすれば解決すると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/13 16:38

    ありがとうございます。
    HttpSession session=request.getSession(); の前にif文でセットするかしないかを判断するのですね!ありがとうございました。

    キャンセル

0

User loginUser=(User)session.getAttribute("loginUser"); 
をコメントアウトして
User loginUser=null;
で実行してもelseに行くか確認してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/13 16:52

    コメントアウトしようとしたのですが、しようとすると、コード内のloginUserがエラーになってしまいます。
    そのまま実行すると、HTTPステータス 500 - JSPのクラスをコンパイルできません:
    になってしまいました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • Javaに関する質問
  • if文でnullはelseと書いているにも関わらず、nullでも、ログインに成功してしまいます。このコードでは、いけないのでしょうか?