今JSPとJavabeansを使ってログイン認証のプログラムを作ってます。
JSPのsessionスコープを使って一度ログイン画面で認証に成功すれば、セッション継続中はログインの必要なページに行ったとき認証されるというプログラムです(認証されてない場合ログイン画面に飛ぶ。jsp内でif文分岐)
認証成立した場合、javabeansに結果(true)を保存してします。
これでログイン認証は成功したのですが、別のページに行った後
再びログインの必要なページに行ったとします。
ここで問題なのですが、認証に成功しているのにエクスプローラーの更新ボタンを押さないと認証されません(つまりログイン画面に飛び、更新ボタンを押さないといけない)。
セッションは継続しているのに更新ボタンを押さないといけないのはなぜなのかわかりません。
だれかログイン認証のセッションのわかる人教えてください。お願いします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.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ヘッダを埋め込む
という結果になっているのだと思います。
お世話になっております。
回答ありがとうございました。
ひとつだけ報告があります。
今回のプログラムは某参考書を参考にして作っているのですが、
セッションスコープをapplicationにしてたりGETリクエストだったり他にも怪しい部分がありそうです。
だからキャッシュ以前の問題かもしれません。
Last-ModifiedヘッダとExpiresヘッダはあとで分かったのですが、ログインできたのにセッションIDが別のユーザーになってました。
今はヘッダになにもつけずにちゃんと動いてます。
なぜ動いたのかはわかりません。
でも今回キャッシュという存在がわかったのでよかったです。
勉強不足で申し訳ありませんでした。また出直します。
いろいろとありがとうございました。
No.2
- 回答日時:
→はい。
ちなみにwebサーバはtomcat5.5です。今回のケースがクライアントキャッシュ依存であるならばAPサーバはまったく関係ありません。
→(cert-top.jsp)でキャッシュを無効にすればいいのですか?
常に最新のページを見せたい画面をキャッシュさせないようにしてください。
どこでやるかは、質問者様の画面構成によります。
例えば
ログイン画面→マイページ→マイページから遷移する画面
で、マイページをキャッシュさせたくないなら
マイページの応答ヘッダにno-cacheヘッダを埋め込むのです。
JSPでのキャッシュ無効化については参考URLを参照してください。
参考URL:http://www.atmarkit.co.jp/fjava/rensai2/jspservl …
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のログインシステム)、ログインの必要なページ(注文ページなど)にはキャッシュ無効やキャッシュの最終更新日を指定するのが定石なのですか?
もしその仕組みも教えていただければ幸いです。
No.1
- 回答日時:
>エクスプローラーの更新ボタンを押さないと認証されません
エクスプローラーとはインターネットエクスプローラーのことですか?
だとしたらクライアントのキャッシュではないでしょうか。
前の画面からGETでリクエストを発行していませんか?
キャッシュされたくない場合はPOSTにするとか、クエリストリングにランダムな文字列を含むなどした方が良いでしょう。
へたな質問で申し訳ありません。以下補足します。
>エクスプローラーとはインターネットエクスプローラーのことですか?
→はい。ちなみに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)でキャッシュを無効にすればいいのですか?
もう少しアドバイスお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- Gmail 10年以上使ってるGoogleアカウント (gmail、YouTube)に、久しぶりにパソコンからロ 3 2022/07/03 03:43
- UNIX・Linux Ubuntu on Xorgのログインについて 2 2023/08/10 15:16
- PHP 掲示板のセキュリティについてアドバイスお願い致します 1 2023/08/11 20:44
- その他(セキュリティ) googleにログインできない(PCのシークレットブラウザで) 1 2022/09/20 11:29
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- 確定申告 e-taxの暗証番号 4 2023/03/08 01:59
- Android(アンドロイド) スマホでの認証コード入力について 10 2023/03/25 11:21
- MySQL 「掲示板のログイン画面」はPHP~MySQLに「データベース認証のシステム」方式です。 1 2022/09/27 05:00
- その他(セキュリティ) システムのセキュリティに詳しい方〜 飛行機のチケット使わなかったときのチケット費用補償保険/旅行キャ 1 2022/04/06 09:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
jsessionidの有効期限を延長す...
-
ブラウザバック禁止
-
HttpSessionListenerクラスに関...
-
グローバルIPアドレスの変更タ...
-
ASP.NETのGlobal.asaxについて
-
エクリプスを使ってのセッショ...
-
ASP Session変数名の取得
-
ドットネットフレームワークのD...
-
画面遷移でセッション切れにな...
-
フォーム上で押されたボタンに...
-
三菱GOTの画面切り替えについて
-
ボタンが活性化の場合とは、ボ...
-
遷移元を判定したい!
-
Java-jspの画面入力値保持について
-
リクエストに応じたselectedの...
-
腕時計の時報をならないように...
-
ServletからServletへの値渡し
-
Javascriptのhistory.back()が...
-
「<c:forEach タグが終了し...
-
jspからServletを呼び、元のjsp...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
javascriptでセッションを取得
-
グローバルIPアドレスの変更タ...
-
setAttribute getAttribute 配...
-
javascriptでのログアウトボタン
-
フレームを使用した際のセッシ...
-
javascriptでセッションの削除...
-
sessionスコープとapplication...
-
セッションの情報の消去について
-
HTMLのSELECTタグの使い方、JSP...
-
エラーページ遷移後に入力値を残す
-
ブラウザバック禁止
-
MySQL・Tomcat・JSP 何度もSub...
-
ASP.NETのGlobal.asaxについて
-
複数Webサーバーでのセッション...
-
HttpSessionListenerクラスに関...
-
jsessionidの有効期限を延長す...
-
Tomcatでの同一セッション同時...
-
aタグによる複数リンクを別セッ...
-
JSPでブラウザ終了時にPostgreS...
-
XMLHTTPを使って、セッションID...
おすすめ情報