アプリ版:「スタンプのみでお礼する」機能のリリースについて

今JSPとJavabeansを使ってログイン認証のプログラムを作ってます。
JSPのsessionスコープを使って一度ログイン画面で認証に成功すれば、セッション継続中はログインの必要なページに行ったとき認証されるというプログラムです(認証されてない場合ログイン画面に飛ぶ。jsp内でif文分岐)
認証成立した場合、javabeansに結果(true)を保存してします。
これでログイン認証は成功したのですが、別のページに行った後
再びログインの必要なページに行ったとします。
ここで問題なのですが、認証に成功しているのにエクスプローラーの更新ボタンを押さないと認証されません(つまりログイン画面に飛び、更新ボタンを押さないといけない)。
セッションは継続しているのに更新ボタンを押さないといけないのはなぜなのかわかりません。
だれかログイン認証のセッションのわかる人教えてください。お願いします。

A 回答 (3件)

>No2.回答への返信



仰っている通りです。
基本的に認証が必要なページがキャッシュされてしまうのは問題です。
何故かと言うと認証が必要なページ=会員のページだったりした時に
キャッシュから他の人の個人情報が見えてしまったりするなどの問題があるからです。
(クライアントキャッシュしかり、プロキシキャッシュしかり)
だいたい下記の通り対策します。

1・今回のケース同様、応答ヘッダにキャッシュさせない命令
2・リクエストは全てPOSTで発行させる(GETはブラウザがキャッシュするため
3・URLのクエリパラメータに乱数を付与して別URLに見せかける

で、キャッシュされていなければご質問者様がやられているように
サーバセッションで常に管理できます。

教えてGOOがどうなっているかわかりませんが、
パケットキャプチャソフトを使用して応答ヘッダを見てみると何かわかるかもしれません。

>3.対応するjspにno-cacheヘッダを埋め込む→だめだった。

すいません、no-cacheはHTTP1.0用の命令だったような気がしてきました・・・
現在は一般的にHTTP1.1が使われていますので

>4.対応するspにLast-ModifiedヘッダとExpiresヘッダを埋め込む

という結果になっているのだと思います。
    • good
    • 0
この回答へのお礼

お世話になっております。
回答ありがとうございました。

ひとつだけ報告があります。
今回のプログラムは某参考書を参考にして作っているのですが、
セッションスコープをapplicationにしてたりGETリクエストだったり他にも怪しい部分がありそうです。
だからキャッシュ以前の問題かもしれません。
Last-ModifiedヘッダとExpiresヘッダはあとで分かったのですが、ログインできたのにセッションIDが別のユーザーになってました。
今はヘッダになにもつけずにちゃんと動いてます。
なぜ動いたのかはわかりません。

でも今回キャッシュという存在がわかったのでよかったです。
勉強不足で申し訳ありませんでした。また出直します。
いろいろとありがとうございました。

お礼日時:2007/05/01 18:38

→はい。

ちなみにwebサーバはtomcat5.5です。

今回のケースがクライアントキャッシュ依存であるならばAPサーバはまったく関係ありません。

→(cert-top.jsp)でキャッシュを無効にすればいいのですか?

常に最新のページを見せたい画面をキャッシュさせないようにしてください。
どこでやるかは、質問者様の画面構成によります。
例えば
ログイン画面→マイページ→マイページから遷移する画面
で、マイページをキャッシュさせたくないなら
マイページの応答ヘッダにno-cacheヘッダを埋め込むのです。
JSPでのキャッシュ無効化については参考URLを参照してください。

参考URL:http://www.atmarkit.co.jp/fjava/rensai2/jspservl …
    • good
    • 0
この回答へのお礼

ARIA9さん!ありがとうございます。
無事解決しました!

結果は以下の通り
1.キャッシュの無効化というのを知る
2.responseオブジェクトを知る
3.対応するjspにno-cacheヘッダを埋め込む→だめだった。
4.対応するspにLast-ModifiedヘッダとExpiresヘッダを埋め込む
<%
response.setDateHeader("Last-Modified",0);
response.setDateHeader("Expires",0);
%>
5.4では成功!更新ボタンの代わりに自動で新しいコンテンツを読み込み

専門的にはオンラインショップなどでログイン認証ページを作る際(ログイン後もリンクをはった別ページに移動可能 例 HMV、教えてgooのログインシステム)、ログインの必要なページ(注文ページなど)にはキャッシュ無効やキャッシュの最終更新日を指定するのが定石なのですか?
もしその仕組みも教えていただければ幸いです。

お礼日時:2007/04/29 14:10

>エクスプローラーの更新ボタンを押さないと認証されません



エクスプローラーとはインターネットエクスプローラーのことですか?
だとしたらクライアントのキャッシュではないでしょうか。
前の画面からGETでリクエストを発行していませんか?
キャッシュされたくない場合はPOSTにするとか、クエリストリングにランダムな文字列を含むなどした方が良いでしょう。
    • good
    • 0
この回答へのお礼

へたな質問で申し訳ありません。以下補足します。
>エクスプローラーとはインターネットエクスプローラーのことですか?
→はい。ちなみにwebサーバはtomcat5.5です。
>前の画面からGETでリクエストを発行していませんか?
→はい。ログイン画面(login.html)で認証成功後(certify.jsp)はマイページ(cert-top)に移動させます。前の画面とはログイン認証が必要な
(cert-top.jsp)です。

(certify.jsp)
<%@ page import="javax.servlet.*,java.lang.*,java.util.*" %>
<jsp:useBean id="usercertify" scope="session"
class="mybeans.UserCertBeans" />

<html>
<body>
<%
usercertify.setLoginName(request.getParameter("name"));
usercertify.setPassword(request.getParameter("password"));
usercertify.UserCertify(); //ログイン認証
if(usercertify.getBresult())
{
%>
<jsp:forward page="cert-top.jsp" />
<%
}
 以下省略 エラーページなど

(cert-top)
<%@ page import="javax.servlet.*,java.lang.*,java.util.*" %>
<jsp:useBean id="usercertify" scope="session"
class="mybeans.UserCertBeans" />
<body bgcolor="silver">

<%!
boolean b;
%>
<%
if((b=usercertify.getBresult()) == false)
{
%>
<jsp:forward page="Login.html" />
<%
}
%>

<html>
<head>
<title>Members Page</title>
</head>
以下省略 マイページ表示など

>クライアントのキャッシュではないでしょうか。
→(cert-top.jsp)でキャッシュを無効にすればいいのですか?
もう少しアドバイスお願いします。

お礼日時:2007/04/29 12:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!