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

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

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

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

Java

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

1回答

18287閲覧

ログイン処理の最初にsession.invalidate();したいのですが、create しないとエラーになってしまいます。どうすればいいのでしょうか?

edoooooo

総合スコア476

JSP

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

Java

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2015/11/17 03:59

ログイン処理の最初にsession.invalidate();したいのですが、sessionをcreaログイン処理の最初にcreateしないとエラーになってしまいます。どうすればいいのでしょうか?
session.invalidate();を書くときに必要な作業があるのでしょうか?すみませんどうぞ宜しくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの場合、何のエラーなのか(どこで、なんというエラーが出ているのか)を書きましょう。
これはとても重要です。

おそらくNullPointerExceptionが出ているのだと思いますが、その場合は、sessionnullだったらsession.invalidate()を実行しないようにすれば良いです。

nullという概念が少し難しいのかも知れませんね。


(追記)

セッションの処理を、下記のように2箇所修正してください。
2つ目のは、getSession(true)trueがポイントです。

lang

1// セッションが残っている場合は破棄 2HttpSession session = request.getSession(); 3if (session != null) { 4 session.invalidate(); 5}

lang

1// ログイン成功時の処理 2if (isLogin) { 3 // セッションを新しく作り、 4 // ユーザー情報をセッションスコープに保存 5 HttpSession newSession = request.getSession(true); 6 newSession.setAttribute("loginUser", user); 7}

投稿2015/11/17 05:28

編集2015/11/17 11:31
argius

総合スコア9388

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

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

edoooooo

2015/11/17 05:38

すみませんでした。記述不足でした。実際には、エラーは出ていないのですが、snsのログイン画面で、user名を入力していないにもかかわらず、ログイン完了と次の画面に進んでしまうのです。 そのため、session.invalidate()を入力すると、赤波線がでるので、実行は、していませんでした。実行してみます。
argius

2015/11/17 05:43

user名を入力していないにもかかわらず、ログイン完了になる件は、別の回答のコメントにも書きましたが、つづきはこちらでやったほうが分かりやすそうですね。
edoooooo

2015/11/17 06:42 編集

やはり、javax.servlet.ServletException: サーブレットの実行により例外を投げました org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) のようなエラーが出てしまいます。 すみません、宜しくお願いします。
argius

2015/11/17 06:49

もうひとつのコメントに書いているのと同じことを解決したいんですよね? だったら、こちらに統一しましょう。 ややこしいですし、向こうはコメントが長くなってしまいましたので。
edoooooo

2015/11/17 06:53

すみません、宜しくお願いします。
argius

2015/11/17 06:56

「サーブレットの実行により例外を投げました」をたどっていくと、真のエラーの原因が出てくるはずです。それを見つけてください。 これも基本なので覚えてください。
edoooooo

2015/11/17 07:06

てっきりsession.invalidate(); を書いた場所や、書き方が間違っているのだと思っていました。他のコードを修正することで、このエラーがなくなるのですね、たどって、原因を探してみます。
edoooooo

2015/11/17 07:15

情報量がとても少なく、コンパイルエラーなことや、Loin.javaのコードを足した、31行目にえらーが出ていることと、consoleに[SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:taichi' did not find a matching property. という警告がでていることしか情報を得られませんでした。
argius

2015/11/17 07:21

向こうのコメントにも書きましたが、「31行目にえらー」はどんなエラーが出ているかが重要です。 ただエラーと言われても、こちらには何が起こっているのか分からないのです。 向こうのコメントもちゃんと読んでくださいね。
edoooooo

2015/11/17 08:58 編集

すみませんでした。 HTTPステータス 500 - サーブレットの実行により例外を投げました javax.servlet.ServletException: サーブレットの実行により例外を投げました org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)です。 原因 java.lang.Error: Unresolved compilation problem: session cannot be resolved servlet.Login.doPost(Login.java:31) javax.servlet.http.HttpServlet.service(HttpServlet.java:650) javax.servlet.http.HttpServlet.service(HttpServlet.java:731) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) のようになっています。どうぞ宜しくお願いします。
argius

2015/11/17 09:03

コンパイルの問題が解決していないので、実行ができない状態です。 Eclipseにコンパイルのエラー(赤の表示)を解消しましょう。 Eclipseにエラーが出ていないのなら、Tomcatを再起動してみてください。
edoooooo

2015/11/17 09:25 編集

エラーをsessionのcreateと、もともとあったsessionをsession1という名前にすることで赤の表示は、消えたのですが、再起動しても、同じエラーが実行すると出てしまいました。 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session; // TODO Auto-generated method stub session.invalidate(); //リクエストパラメータの取得 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 session1=request.getSession(); session1.setAttribute("loginUser", user); } 宜しくお願いします。
argius

2015/11/17 09:18

同じエラーというのは、どちらと同じエラーですか? 何というエラーですか?
edoooooo

2015/11/17 09:23 編集

一番最後に記載したエラーと同じです。もうしわけありません。 HTTPステータス 500 - サーブレットの実行により例外を投げました type 例外レポート メッセージ サーブレットの実行により例外を投げました 説明 The server encountered an internal error that prevented it from fulfilling this request. 例外 javax.servlet.ServletException: サーブレットの実行により例外を投げました org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 原因 java.lang.Error: Unresolved compilation problem: The local variable session may not have been initialized servlet.Login.doPost(Login.java:32) javax.servlet.http.HttpServlet.service(HttpServlet.java:650) javax.servlet.http.HttpServlet.service(HttpServlet.java:731) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
argius

2015/11/17 09:41 編集

保存はしましたよね? Eclipseの設定なのかどうかわかりませんが、ビルドができてない可能性があります。 プロジェクトのクリーンというのは分かりますか?クリーンを実行してください。 そのあとで、Tomcatを再起動してください。 それでもダメなら、Eclipseを再起動して同じことをやってみてください。
edoooooo

2015/11/17 10:16 編集

実行してみたのですが、先ほどと全く同じエラーが出てしまいました。 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 { HttpSession session; // TODO Auto-generated method stub session.invalidate(); //リクエストパラメータの取得 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 session1=request.getSession(); session1.setAttribute("loginUser", user); } //ログイン結果画面にフォワード RequestDispatcher dispatcher=request.getRequestDispatcher("/WEB-INF/jsp/loginResult.jsp"); dispatcher.forward(request, response); } } このコードでの、sessionの使い方として、2つ目のsessionが、session1とするしか、赤線を消す方法がなく、このコードでいいのでしょうか?
argius

2015/11/17 10:07

本来の問題に取り掛かりたいところですが、それ以前に他の問題が発生してしまって進めない状態です。 まずは、ここが怪しいですね。 HttpSession session; // TODO Auto-generated method stub session.invalidate(); 本当にこの通りになっているなら、session変数が初期化されていないのでコンパイルエラーが出ているはずです。 なぜコンパイルエラーにならないのかはこの際おいとくとして、 コンパイルエラーになるとしたら、どうすればコンパイルエラーにならなくなるでしょうか?
edoooooo

2015/11/17 10:19

 大事なとこが抜けている可能性がありましたので、一つ前で記載したコードを全文に変えました。  赤波線の上にカーソルを合わせて、選択をすることで、コンパイルエラーが消えました。
argius

2015/11/17 10:41

> 赤波線の上にカーソルを合わせて、選択をすることで、コンパイルエラーが消えました。 何を選択したら消えたのですか? 言い方が悪かったかもしれませんが、コンパイルエラーを消すというのは、コンパイルエラーになっている原因を取り除いてエラーを解消するという意味です。
edoooooo

2015/11/17 11:15 編集

 まず、session.invalidate();のsessionが赤波線になっていたので、その上で、Create local variable 'session' を選択して、   そうすると、session.invalidate();が、HttpSession session session.invalidate(); となり、  そうすると、コードの下の方の、 //ユーザー情報をセッションスコープに保存 HttpSession session=request.getSession(); session.setAttribute("loginUser", user); の変数名のsession が赤波線になり、その上にカーソルを置くと、Rename 'session'となり、それをクリックすると、  先ほどのコードが、このようにsession1と、名前が変わり、  //ユーザー情報をセッションスコープに保存 HttpSession session1=request.getSession(); session1.setAttribute("loginUser", user);  そうすると、最初に書いた、session.invalidate();のsessionが赤波線になり、カーソルを合わせると、Initialize bariable と出て来て、クリックすると、HttpSession session = null; となり、  そうすると、session.invalidate(); のsessionが黄色波線になり、カーソルを合わせると、Add@SuppressWarnings 'null' to 'doPost()' となりそれを押すと、  @SuppressWarnings("null")がコードに追加され、コンパイルエラーがなくなります。 どうぞ宜しくお願いします。
edoooooo

2015/11/17 11:18 編集

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) */ @SuppressWarnings("null") protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub HttpSession session = null; session.invalidate(); //リクエストパラメータの取得 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 session1=request.getSession(); session1.setAttribute("loginUser", user); } //ログイン結果画面にフォワード RequestDispatcher dispatcher=request.getRequestDispatcher("/WEB-INF/jsp/loginResult.jsp"); dispatcher.forward(request, response); } } このようになっています。 どうぞよろしくお願いします。 先ほど載せていたこの部分の、コードは、間違えていました。このコードで宜しくお願いします。
argius

2015/11/17 11:44 編集

やはりここは少し難しいと思いましたので、回答欄に追記しました。 ただ、基本的なところはもうすこし自力で頑張ってください。 プログラムは論理的に正しい記述をしないと思ったように動いてくれません。 とりあえずやってみたではダメです。 コンパイルエラーのメッセージも読みましょう。 ちなみに、最後のコードに修正した場合は、違うエラー(今度こそNullPointerException)が出るようになっていたはずです。 本当は英語は何とかしたいところですけどね。 Eclipseも日本語化したいところですが、またインストールで手間取ってしまう可能性もあるので、あまりオススメしたくありません。 WindowsだとAll-in-oneがあるのでオススメしやすいのですが。
edoooooo

2015/11/17 11:44

確かに、ネットで調べた時の日本語版を見ると、これいいな、と毎回思ってしまいます。 そうおっしゃられるほど、難しいのならば、多分手間取ると思います。  英語の勉強も兼ねて、調べて、調べて、調べる技術を習得したいと思います。 ありがとうございました。  基本的なところは、自分で頑張ります。googleがあるので、googleで頑張ります。 ありがとうございました。
argius

2015/11/17 11:55

Eclipseの方は、失敗してもたぶん本当にリセットしてやり直しが効くはずなので、MySQLの時のようなことにはならないと思っているのですけどね。 私はMacでEclipseの日本語化はやったことが無いので何とも言えませんが... ご自身で調べて試行錯誤するのが上達のコツです。 がんばってください。
edoooooo

2015/11/17 14:45

ありがとうございます。解説を見ながらインストールしてみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問