• 締切済み

擬似クライアントプログラムでセッションを認識させたい

サーブレットでのセッションの扱いは、クライアントにセッションIDをCookieとして保存しておき、次回以降のアクセスではクライアントからそのIDをサーバに通知することにより、セッションを維持するという仕組みですよね。 そこで、以下のようなコードを含むクライアントプログラムを動作させました。 // cookieのハンドリングにCookieManagerを設定 CookieManager cookieManager = new CookieManager(); CookieHandler.setDefault(cookieManager); HttpURLConnection conn = ... // 1度目の通信 conn.disconnect; conn = ... // 2度目の通信 conn.disconnect; この状態でHttpURLConnectionを使用してサーブレットと通信を行うと、CookieHandlerが自動的にCookieのやりとりを行ってくれるため、セッションIDのやりとりについても自動化してくれて、サーバとの通信でセッションが確立できるはずです。(この情報の信頼性がいまいちです) しかし、私が試した限りでは、セッションは保持されませんでした。 擬似クライアントの変わりにブラウザで試してみましたが、きちんとセッションは認識されるので、サーブレット側の問題ではありません。 また、CookieManagerはcookieをメモリ上に保存しますが、擬似クライアントは同一VM上で複数回の接続を試しています(よって揮発している可能性はありません)。 そして、サーブレット側で(セッションではなく)cookieを意図的に食べさせた場合には、きちんとその内容を復元することができます。 セッションやCookieManager等についての私の認識が誤っていることが原因だと思うのですが、おかしなところがあればご指摘お願いします。

みんなの回答

回答No.1

使ったことないのでよくわかりませんが、ググッてみたら出てきましたよ。参考になると良いのですが。。。

参考URL:
http://itpro.nikkeibp.co.jp/article/COLUMN/20070801/278817/?ST=develop
ggaogg
質問者

お礼

解決しました。 JavaSE APIに、ちゃんと書いてありました・・。 // this should be done at the beginning of an HTTP session CookieHandler.setDefault(new CookieManager()); // this can be done at any point of an HTTP session ((CookieManager)CookieHandler.getDefault()).setCookiePolicy(new MyCookiePolicy()); セッション開始の前に自前の(デフォルトでない)クッキーポリシーを設定しろと書いてあります。 もっとちゃんと読んでいれば・・。chomakichiさん、お時間とらせて申し訳ないです。 具体的には、以下のコードを追加することで解決しました(Java6)。 cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); CookiePolicyインスタンスは、大きく分けて3つ用意されているようですが、セキュリティ等の面も考えると、実際に自分で実装する必要があるようです。 しかしテストのための擬似クライアントとしてならばこのコード(すべてのクッキーを許可)で問題ないと思います。

ggaogg
質問者

補足

すみません、参考になりませんでした。 クッキーはうまくいくんです。 しかしセッションになるとうまくいかないんです。 まるでセッションIDの保存にcookieが使われていないかのようにです。 提示して頂いたサイトの情報では、クッキーの事しかわかりません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • セッションとクッキーの関わりについて

    いつもお世話になりますm( __ __ )m 質問の前に前提条件としてセッションによるログインサイトなどは、以下のようなやり取りを行っていると認識しています。 1. サーバーからクライアントにセッション ID を発行する 2. クライアントのクッキーにセッション ID が保存される 3. 以降、クライアントがサーバーにアクセスするとクッキーに保存されているセッション ID が一緒にサーバー側に送信され、サーバー側で保存しているセッションデータと関連つける。 ここまで間違っていたらご指摘ください。 以下、質問です。 上記の仕組みを PHP などを用いて既存のセッション関数を使わず自作するとした場合、以下のシーケンスで同等と考えてよろしいでしょうか? 1. サーバー側で乱数などを用いてセッション ID を独自に生成する 2. Set_Cookie 関数などでクライアントのクッキーにセッション ID を保存する。 3. 以降、クライアントのクッキーからセッション ID を取得し、サーバー側でその値を元に DB などから値を取り出す。 私には前者と後者が全く同じ処理に見えるのですが、違うのでしょうか。それとも同じなのでしょうか。と言ったところが聞きたいと考えています。 以上です。 よろしくご教授くださいm( __ __ )m

  • セッション管理におけるクライアント同時接続制限について。

    皆さんこんにちは。セッション管理について教えて下さい。 Perlを使用し、cgiでWebのUIを作製中でして、CGI::Session.pmのモジュールで セッション管理を行っており、クライアントの同時接続数を1台に制限したいのですが、 うまくいかずに困っております。 クライアントからアクセスがあった場合に、最新のセッションを $session->expire 及び $session->empty で確認し、期限切れ、又は無効となっていたら新規セッションを発行している為、 クライアントがログアウトした場合は$session->deleteでサーバ内のセッションファイルを 削除できて問題はないのですが、ブラウザのxボタンで閉じてしまった場合、サーバ内の セッションファイルが削除されず、他のクライアントがログインできない状況になってしまいます。 セッションのデータはサーバ内のディレクトリに、セッションIDのみcookieで クライアントに保存という形態をとっております。 何か良い方法はないでしょうか?何卒ご教授のほど、お願い致します。 OS:FedraCore3 使用言語:Perl 5.8.6 Webサーバ:thttpd

  • セッションについて

    セッションについていくつか質問させて頂きたい事があります。 よろしくお願いします。 1. Cookieの場合、Windowsだと通常C:\Documents and Settings\AAA\Cookies のようなディレクトリにデータが保存されるが、セッションを扱う場合、クライアントのどのディレクトリにセッションIDの情報が記憶されるのか? 2.初期設定では、サイトにアクセスして発行されたセッションIDは、ブラウザを閉じた時に自動的に破棄されるようになっているのか? 3.上記の2が真の場合、ブラウザを閉じた後にまた開き、再度サイトにアクセスする毎に毎回異なる値のセッションIDを発行することは出来るのか? 以上の3つです。 また、参考になりそうなサイトがありましたらURLを載せて頂けるととても助かります。 どなたか詳しい方いらっしゃいましたらご教授よろしくお願いします。

    • ベストアンサー
    • PHP
  • sessionについて

    こんばんは。お世話になっております。 題名にあるようにセッションに関してアドバイスいただきたく投函させて頂きます。 (他に似たような質問はあったものの、上手く解釈できなくて・・) 現在、DBに登録された会員のみがログイン出来る機能を有したサイトを作成しておりますが、DB参照の後、idなどを、セッション変数に代入し、そのデータを持ち歩いています。 書籍や他の方からセッションIDのことを耳にしますが、いまいち、その必要性というものを理解する事が出来ないのですが、このセッションIDは、どこでどういったところで必要になってくるものなのでしょうか? また、チェックボックスなどで任意により、自動でログインする機能を持たせるとした場合、クッキーを用いるという事までは理解したのですが、調べた範囲では、先のセッションIDをクッキーに保存させる・・という内容を多くみました。 現在、セッションハイジャックを避けるようサーバー側に保存されるセッションIDを書き換える設定をしているのですが、このような場合はクッキーを用いての自動ログインはどうしたらいいのだろう?と糸口が見えずにいる次第です。 以下、アドバイスを頂戴したいことをまとめると、 1.ログイン状態を認識させるためには、セッション変数だけで事足りるのか?また、この場合においてのセッションIDの意味するとは? 2.セッションハイジャックを避けるためサーバー側に保存させるセッションIDを随時変更している場合、自動ログイン機能を用いるには、どのような流れ(内容)になるのか? です。お忙しい中恐縮ですが、アドバイスなど頂けたら幸いに思います。宜しくお願い致します。

    • ベストアンサー
    • PHP
  • PerlモジュールのCGI::Sessionでセッション管理

    PerlモジュールのCGI::Sessionでセッション管理をしようとしています。 具体的なコードは %cookie=raw_fetch CGI::Cookie; $S_id=$cookie{'S_id'};#クッキーに保存されたセッションIDを取得 $session = new CGI::Session("driver:MySQL", "$S_id", {Handle=>$dbh}); その後 $Ses_id=$session->id(); とすると本来ならばクッキーに保存された既存のセッションID($S_id)が$Ses_idに入ると思うのですが、$Ses_idには新しいセッションIDが入ってしまいます。 そこで疑問なのですが (1)$S_idにクッキーに保存されたセッションIDを指定すると既存のセッションをオープンするのではないのでしょうか? (2)$Ses_id=$session->id();にはなぜ新しいセッションIDが入ってしまうのでしょうか? 2点の質問ですが、どうか宜しく教えてくださいまし。

  • セッションの仕組み

    php初心者です セッションの仕組みを教えてください 質問1 セッションidとセッションクッキーは同じものですか? 質問2 セッションidやセッションクッキーはデフォルトでは、ブラウザを閉じた時に削除されますか? 質問3 レンタルサーバーのphp.iniを調べてみたところ 保存場所がsession.save_path no valueでした。この場合、訪問者のパソコンにクッキーが保存されてしまうのでしょうか?サーバーに保存する方法はありますか? 質問3 session_start();でセッションを開始したときセッションidが自動で付けられるのはわかりましたが、 セッションid(MD5で作られた数字)の使い道がわかりません 質問4 セッションidはどこに利用すればいいのでしょうか? session_start(); session_id(); //このセッションidの利用方法がわかりません $_SESSION['id'] = $_POST['id']; よろしくお願いします

    • ベストアンサー
    • PHP
  • セッションIDについての質問です。

    サーバ・クライアント間での【コネクション】が途切れた際にも、【セッション】は維持されているそうですが、それは”Cookie”によって叶えられているのでしょうか?

  • WebクライアントでDBセッションを維持させたい

    C/S系システムをWebシステムに移行することを考えてます。 Webクライアントにおいて、アプリでログイン後にDBセッションをずっと保持させたままにしておきたいのです。(WebクライアントとDBセッションを1対1にしたい) APサーバ上でコネクションプーリングしてDBとのセッションを維持させておくことは知ってます。 実現方法や、実現された事例等がありましたら教えて頂けないでしょうか? DBはORACLEを利用してますが、 Webクライアントと dbms_session.unique_session_id を一意に定めたいのです。

  • [PHP]セッション破棄について

    はじめまして。 phpを始めて1週間の初心者です。 現在、ホームページでログイン処理とログアウト処理をphpのセッションを使って作成しています。 今回質問させて頂くのはログアウト処理についてです。 ログアウト処理をでセッションを破棄する際に http://oshiete1.goo.ne.jp/qa3224862.html を参考にして下記の処理を行わせています。 -------------------- logout01.php -------------------- <?php session_start(); $_SESSION = array(); if(isset($_COOKIE[session_name()])){setcookie(session_name(),'',time()-4200,'/');} session_destroy(); header("location: http://~トップページのURL~/"); ?> -------------------- 確認をしたところ、ログインしたユーザの情報は削除されているようでした。 また、http://oshiete1.goo.ne.jp/qa3224862.htmlを参考に下記のようなログアウト処理も行わせてみました。 -------------------- logout02.php -------------------- <?php session_start(); unset($_SESSION['access']); header("location: http://~トップページのURL~/"); ?> -------------------- 同じく確認したところ、ログインしたユーザ情報は削除されているようでした。 -------------------- 環境 -------------------- <サーバ> 【OS】 windows XP(テスト環境)、CentOS 5.2(公開環境) 【PHP】 5.2.6 【Apache】 2.2 <クライアント> 【OS】 windows XP 【ブラウザ】 Firefox 3.0.8 IE 7 -------------------- -------------------- 質問 -------------------- (1)logout01.phpとlogout02.phpの違いは何でしょうか。 (2)「unset($_SESSION);」は使用すると「$_SESSION」が使えなくなるとのことですが、  それはphpを再インストールしない限りは使えなくなるということでしょうか。  それとも、ブラウザを再起動すれば使えるという意味でしょうか。 (3)「unset($_SESSION);」と「unset($_SESSION['access']);」では何が違うのでしょうか。 (3)セッションを使用するとサーバ側にセッションIDを保存したファイルが保存され、  クッキーがクライアント側に保存されるとのことですが、logout01.phpとlogout02.phpを  実行した場合、サーバ側のセッションIDを保存したファイルとクライアント側のクッキーを  保存したファイルは削除されているのでしょうか。 (4)セッションの有効期限を指定していないため、logout01.phpとlogout02.phpを実行せずに  ブラウザを終了させた時もログインしたユーザ情報は削除されているようでしたが、  この場合もサーバ側のセッションIDを保存したファイルとクライアント側のクッキーを  保存したファイルは削除されているのでしょうか。 初歩的な質問で申し訳御座いませんがよろしくお願いします。

    • ベストアンサー
    • PHP
  • phpのsessionとcookieについて

    質問は以下に2つです。 プログラムの説明は、pass,idから認証を行い、sessionidを発行します。二度目の以降はsessioidから認証します。 sidpost.phpからpostでIDとパスワードを入力させます。 データベースはid, pass, sidの3つのカラムがあります。 <?PHP require_once'DB.php'; session_name("sid"); session_start(); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <?php $id = $_POST['id']; $pass =$_POST['pass']; $cookie = $_COOKIE['sid']; $sid = session_id(); //データベース参照 //プレースホルダーを使用 //id からpassを参照する //cookie から sidを参照する $data=$sth->fetchRow(DB_FETCHMODE_ASSOC);//参照したデータを$dataの連想配列に格納 //sid保存のプレースホルダー $sth2 = $dbh->prepare('UPDATE accountid SET sid=? WHERE id=? AND pass=?'); //cookieが保存されていない場合 if(!isset($cookie) && isset($pass) && isset($id)){ //idとpassから認証 if($pass === $data['pass']){ $sth2 = $dbh->execute($sth2, array($sid, $id, $pass)); echo "初めてのログインsid登録"; } //sidがある場合cookieとデータベースのsidを比較 }else if(isset($cookie)){ if($cookie == $data['sid']) echo "sidあり成功"; //クッキーがあり、データベースと一致しない場合,sidを破棄する }else{ echo"あるはずのクッキー" .$COOKIE['sid']."<br>"; $_SESSION=array(); setcookie('sid', '', time()-3600); session_destroy(); echo "ないはずのクックキー".$_COOKIE['sid']; } //それ以外は入力フォームにリダイレクト }else{ header("location: ./sidpost.php?error=error"); } $dbh->disconnect(); ?> </body> </html> 上のようなセッション管理のプログラムを書きました。 質問は2つありまして、 ・1つめは、通常セッション管理を行う際の、条件はどのようにするのが一般的ですか? IDとパスワードがデータベースと一致する場合としない場合の2通り、cookieがある場合、ない場合の2通り、もしcookieがある場合は、データベースの値と一致する場合としない場合の2通りが考えられます。一番最適な条件文はどのようにすればよいでしょうか? またその処理はどのようにすればよいのでしょうか。 例えばcookieがあり、データベースと一致しない場合、$_SESSIONの初期化、setcookieでクッキーの削除、session_destroy()するなど。。。なにかよくわからなくなってしまいました。 ・二つ目は、 上のプログラムではじめsession_name('sid')およびsession_start()を宣言し、クライアントとサーバに$sid=session_idを発行しています。なので、$_COOKIE['sid'];の値には session_id()($sid)になっているはずです。 下のほうで、セッションの管理を行う際、 //クッキーがある場合 else if(isset($cookie)){ if($cookie == $data['sid']) echo "sidあり成功"; //クッキーがあり、データベースと一致しない場合,sidを破棄する }else{ echo"あるはずのクッキー" .$COOKIE['sid']."<br>"; $_SESSION=array(); setcookie('sid', '', time()-3600); session_destroy(); echo "ないはずのクックキー".$_COOKIE['sid']; } クッキーがあり、データベースと一致しない場合に、sessionおよび、cookieの破棄をしています。この前後でechoをもちいて$_COOKIE['sid']の値を出力すると、 破棄するの前のechoでクッキーが表示されず、 破棄したあとのechoでクッキーが表示されました。 なぜこのような結果になるのですか、逆では?と思いました。

    • 締切済み
    • PHP
このQ&Aのポイント
  • iPadから印刷する際にオフライン表示がでて印刷できません
  • iPad第8世代を使用しており、無線LAN(Wi-Fi)で接続しています
  • 関連するソフト・アプリとしてはナンバーズを利用しています
回答を見る