- PR -

セッションが取得できない

投稿者投稿内容
もも
会議室デビュー日: 2005/11/30
投稿数: 17
投稿日時: 2006-02-03 17:16
OS:FreeBSD 4.7
Apache:1.3.33

ログイン画面(https)より
1.ID、PASSを入力し、ログインする
2.Servletで入力されたID、PASSをセッション変数にセット
3.メニュー画面(http)を開く。そのときセッション変数を
 確認してNullの場合はログイン画面に戻る

といったシステムを作成しています。
しかしSSLの問題なのか、ブラウザを開いて1回目のログイン時は
メニュー画面を開いたときにセッション変数がNullになっています。
2回目以降(ブラウザは閉じないで)は問題なく処理されるのですが...

ログインページからログイン時、サーブレットを実行
//////////////////////////////////
public class Serv_Login extends HttpServlet {
 public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

 response.setContentType("text/html; charset=Shift_JIS");

 HttpSession session = request.getSession(true);
 /* コードを取得 */
 String strCD = request.getParameter("cd");
 session.setAttribute("cd", strCD);

 中略

 response.sendRedirect(response.encodeURL(httpのメニュー画面の絶対パス));

 }
}
//////////////////////////////////

メニュー画面開くとき以下のVAVA関数を実行

//////////////////////////////////
public class Login {
 public void chkLogin(HttpServletResponse response, HttpSession session, String strJumpPage) throws Exception {

 /* セッション変数より取得する */
 String strCD = (String)session.getAttribute("cd");
 /* ↑取得できない↑2回目は取得できる */

 /* セッションが取得できない場合以下を実行 */
 response.sendRedirect(response.encodeURL(httpsのログイン画面の絶対パス));

 }
}
//////////////////////////////////

SSLでセッションがクリアされるとかいうことはあるのでしょうか?
よろしくお願いします。



[ メッセージ編集済み 編集者: 名無し初心者 編集日時 2006-02-03 17:24 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-02-03 17:26
sessionの属性がnullになっているのではなく、request.getParameter() で取得した値が null なのではないでしょうか。
1回目はログインフォームに飛ばされて、POSTした内容がサーブレットに伝わらずリクエストパラメータが取得できていないのでしょう。
ログインフォームには"cd"って入力項目はないですよね?

POSTじゃなくてGETにすればログインフォーム後にリダイレクトしてくれるパスからでもパラメータを取得できそうです。
もも
会議室デビュー日: 2005/11/30
投稿数: 17
投稿日時: 2006-02-03 17:38
回答ありがとう御座います。

>sessionの属性がnullになっているのではなく、request.getParameter() で取得した値が
> null なのではないでしょうか。
String strCD = request.getParameter("cd");
session.setAttribute("cd", strCD);
System.out.println(getAttribute("cd"));
では問題なく取得できています。

その後のメニュー画面を開いたときに一番最初に実行される関数 Login で
セットしたセッションがNullになっています。

>1回目はログインフォームに飛ばされて、POSTした内容がサーブレットに伝わらずリクエスト
>パラメータが取得できていないのでしょう。
>ログインフォームには"cd"って入力項目はないですよね?
ログインフォームに
<INPUT type="text" name="cd" style="ime-mode: disabled" autocomplete="off">
という部品を置いているので問題ないかと...?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-02-03 17:44
>ログインフォームに
><INPUT type="text" name="cd" style="ime-mode: disabled" autocomplete="off">
>という部品を置いているので問題ないかと...?
えーと、ちょっと混乱してきました。このフォームの POST 先は j_security_check ですよね?
#それともログイン処理は車輪から作っていますか?
コンテナがログイン処理をした後に当初ユーザがアクセスしようとした URL にリダイレクトしてくれると思いますが、そこでは POST のパラメータは取得できないのではないでしょうか。
もも
会議室デビュー日: 2005/11/30
投稿数: 17
投稿日時: 2006-02-03 17:57
>えーと、ちょっと混乱してきました。このフォームの POST 先は j_security_check ですよね?
>#それともログイン処理は車輪から作っていますか?
[j_security_check],[車輪] すいませんちょっと意味がわかりません...

<INPUT type="text" name="cd" style="ime-mode: disabled" autocomplete="off">
のあるフォームをサブミットすると記述してあるサーブレットが実行されます。

>コンテナがログイン処理をした後に当初ユーザがアクセスしようとした URL に
>リダイレクトしてくれると思いますが、そこでは POST のパラメータは
>取得できないのではないでしょうか。
1.httpsログイン画面(CD入力)
2.サーブレット実行(CD取得できる)
3.httpメニュー画面
4.Login 関数実行(CD取得できず)
5.再びhttpsログイン画面(CD入力)
6.サーブレット実行(CD取得できる)
7.httpメニュー画面
8.Login 関数実行(CD取得できる)
9.メニュー画面維持

わかりずらいですね...

申し送れましたが、https を使用しないで http だけでアクセスした場合は何の問題もありません。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-02-03 18:07
j_security_check というのはサーブレットコンテナがログイン処理をするための特殊なURIです。
これ↓とか参考になるかもしれません。
・フォーム認証でログイン画面をカスタマイズする
http://www.atmarkit.co.jp/fjava/javatips/012jspservlet003.html

要するに、ログイン処理ってプログラムしなくても良いんです。
「車輪から」っていうのは、すでに用意されているものを一から作り直すことをシニカルに表現したものです

同じセッションを参照しているかどうか調べるため、isNew() とか getId() をダンプしてみてはいかがでしょう。
あと、他の属性は参照できるのでしょうか?
さらに、サーブレットコンテナは何をお使いですか?バージョンは?

[ メッセージ編集済み 編集者: インギ 編集日時 2006-02-03 18:10 ]
もも
会議室デビュー日: 2005/11/30
投稿数: 17
投稿日時: 2006-02-06 09:33
>あと、他の属性は参照できるのでしょうか?
他の属性も駄目です。

>サーブレットコンテナは何をお使いですか?バージョンは?
jdk1.3.1 を使用しています。

何で2回目以降はうまくいくのでしょう...?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-02-06 10:19
同じセッションを参照しているかどうか調べるため、isNew() とか getId() をダンプしてみてはいかがでしょう。

スキルアップ/キャリアアップ(JOB@IT)