質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

7528閲覧

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

edoooooo

総合スコア476

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/11/13 06:49

編集2015/11/13 07:50

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;
}
}
よろしくお願いします。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eripong

2015/11/13 07:05

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

2015/11/13 07:12

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

2015/11/13 07:24

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

2015/11/13 07:33

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

回答4

0

ベストアンサー

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

lang

1User user=new User(name,pass); 2 3LoginLogic loginLogic=new LoginLogic(); 4boolean isLogin=loginLogic.execute(user); 5 6if (isLogin) { 7 // ログインに成功したとき 8 session.setAttribute("loginUser", user); 9} 10else { 11 // ログインに失敗したとき 12 session.removeAttribute("loginUser"); 13}

(追記)

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

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

投稿2015/11/13 07:38

編集2015/11/13 08:30
argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eripong

2015/11/13 07:46 編集

確かに、それはその通りですね。 さらにいうと、 ログイン処理の最初にsession.invalidate();した方が良い気がします。
argius

2015/11/13 07:50

eripongさん コメントありがとうございます。 ちょうど追記しようとしていました。 > session.invalidate();
eripong

2015/11/13 07:52

おっと、そうでしたか。
edoooooo

2015/11/13 08:26

if ( ... ) { // ログインに成功したとき session.setAttribute("loginUser", new User()); } else { // ログインに失敗したとき session.removeAttribute("loginUser"); } の成功したときは、なぜnewUserなのですか?すみませんよろしくお願いします。
argius

2015/11/13 08:33

念のため動作を確認するために、自分のコードでは関係ない処理を飛ばしてnew Userとしていました。 そこはあまり重要でないので、無視してください。 回答は書き換えておきました。
edoooooo

2015/11/13 08:45

ありがとうございます。loginResult.jspをこのように、変えたのですが、ダメでした。Login.javaを変えるのでしょうか? <h1>taichiログイン</h1> session.invalidate(); <% if(loginUser !=null){ %> session.setAttribute("loginUser", loginUser); <p>ログインに成功しました。</p> <p>ようこそ<%=loginUser.getName() %>さん</p> <a href="/taichi/Main">つぶやき投稿・閲覧へ</a> <% }else{ %> <p>ログインに失敗しました。</p> session.removeAttribute("loginUser"); <a href="/taichi/">TOPへ</a> <%} %> </body> </html>
argius

2015/11/13 08:54

回答を修正したのが入れ違いでしたか? 基本的にロジックは極力サーブレット側に書くものだと思ってください。 表示の切り替えなどでどうしてもJSPでなければならない部分はJSPでOKです。 この辺↓のような場合はJSPでOKです。 <% if(loginUser !=null){ %> <p>ログインに成功しました。</p> あと、session.invalidate()はいったん措いておきましょう。 解答欄に書いた通りに書いてみてもらって良いですか?
edoooooo

2015/11/13 09:15

//リクエストパラメータの取得 request.setCharacterEncoding("UTF-8"); String name=request.getParameter("name"); String pass=request.getParameter("pass"); //Userインスタンス(ユーザー情報)の生成 User user=new User(name,pass); //ログイン処理 session.invalidate() 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); のようにすると、sessionを 赤点線エラーが出て、create しないといけなくなり、createするとその下の、sessionがsession1となってしまいます。 session.invalidate()の場所がまちがっているのでしょうか?
argius

2015/11/13 09:33

ゴメンなさい! そこは書き忘れていました! ですがここは、せっかくなので練習だと思って、どうすれば良いのか考えてみませんか? できれば、私が最初に書いたように、 ・removeAttributeで書いてみて、問題が解消することを確認 ・次に、invalidateを使うバージョンに書き換えるてもやはり問題が解消することを確認 のように。 面倒ならinvalidateの方だけでも良いです。 まずは、コンパイルエラーのメッセージを読んでみましょう。
edoooooo

2015/11/13 10:14

すみません、コードをh2database対応にするdaoのところをコードに足したり編週したりしたところ、エラーが大量に出て、コンパイルできなくなってしまっていました。
edoooooo

2015/11/13 10:50

コンパイルできるようになったら、ログインできてしまう、問題の解決策をコンパイルエラーをみながら、みつけます。 すみません。
edoooooo

2015/11/13 10:51

回答ありがとうございました。
argius

2015/11/13 11:05

了解です。 がんばってください。
edoooooo

2015/11/16 10:53 編集

昨日は、お世話になりました。  無事コードのエラーがなくなりまして、今、この問題に取り掛かっています。 Logout.java というコードを見ていたら、session.invalidate() がありました。なぜそれなのに、user名のsessionは、消えずに、user名を入力しなくても、ログイン成功になってしまうのでしょうか?if文に問題が、あるのでしょうか? パスワードの方は、入力しないとしっかり、ログインできませんでした。  どうかよろしくお願いします。 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; /** * Servlet implementation class Logout */ @WebServlet("/Logout") public class Logout extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub //セッションスコープを破壊 HttpSession session=request.getSession(); session.invalidate(); //ログアウト画面にフォワード RequestDispatcher dispatcher=request.getRequestDispatcher("/WEB-INF/jsp/logout.jsp"); dispatcher.forward(request, response); } }
edoooooo

2015/11/16 11:06 編集

すみません、コンパイルエラーなのですが、それは、出ていないのですが、普通にログインできてしまいます。  sessionの対処法を調べたのですが、わかりませんでした。
argius

2015/11/16 11:20

おそらく、ポイントは下記の場所かと思います。 boolean isLogin=loginLogic.execute(user); ここがログイン時のログイン成功かどうかを決めている処理です。 LoginLogic.javaの中身を読んで、それに関連する書籍の説明を読んでみてください。 (私は読んで無いので何て書いてあるかは知りません。) 書いていなければ、LoginLogic.javaを読んで何をしている処理なのかを考えてみてください。 プログラミングの学習では、何をしている処理なのかをひとつずつ確かめていくのが重要です。
edoooooo

2015/11/17 02:27

返信が遅くなり、失礼いたしました。  本には、書いていなくて、LoginLogic.javaを読んでみて、わかったことは、 public class LoginLogic{ public boolean execute(User user){ user.getPasと("1234")が=であるかを.equalsでしらべ、true か false を返すということは、わかるのですが、そこを、  public boolean execute(User user){ return user.getPass().equals("1234") && user.getName() !=null; } のように変えたのですが、変化は、ありません。user名を入力せずにログインできてしまいます。どうぞ宜しくお願いします。
argius

2015/11/17 05:17

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

2015/11/17 06: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;などとしたのですが、保存して、実行したところ、サーブレットがエラーを投げましたとなってしまいます。すみません、宜しくお願いします。
argius

2015/11/17 06:32

いえ、そういう意味ではないです。 「user.getName()は、名前が未入力の時にnullになっているでしょうか?」 「いいえ、なっていません。」 「それならば、user.getName()!=nullで判定しても意味ないですよね?」 ということです。 あと、 String name=null; としたところで、何がどう変わったのか、理解されていますか? エラーがNullPointerExeptionだとしたら、それはnullにしているのだから当然です。 意味がわからないようでしたら、まずNullPointerExeptionについて調べてみてください。 書いてあることを読むだけでは無く、何をするためのものかを理解するようにしてください。 参考書のJava編などにも書いていないか、見直してみてください。 この編はJavaの基礎レベルだと思うので、そこを理解できないと、この先際限無くつまずきます。
guest

0

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

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

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

投稿2015/11/13 07:25

kutsulog

総合スコア985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

edoooooo

2015/11/13 07:38

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

0

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

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

投稿2015/11/13 07:22

eripong

総合スコア1546

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

edoooooo

2015/11/13 07:31

回答ありがとうございます。 tomcatの仮想サーバーで実行しているので、全て、とじて、tomcatを停止して、eclipseをとじて、開き直して、実行しましたが、同じでした。
eripong

2015/11/13 07:35

jspに直接アクセスしてもですか? うーん。 jspの省略している部分でloginUserを操作している部分はありますか? それから、具体的にはどういう結果が表示されるのですか?
eripong

2015/11/13 07:37

どういうURLにアクセスしたかも教えてください。
eripong

2015/11/13 07:39

loginLogic.executeがtrueを返している可能性もあるので、 LoginLogicのexecuteのソースも提示できませんか?
eripong

2015/11/13 07:50

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

2015/11/13 07:54

ありがとうございます。
guest

0

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

投稿2015/11/13 07:16

anonymouskawa

総合スコア856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

edoooooo

2015/11/13 07:52

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問