- PR -

HttpSessionEvent で HttpServletRequest

投稿者投稿内容
ぶんぶん
会議室デビュー日: 2003/12/11
投稿数: 17
お住まい・勤務地: 東京・品川区
投稿日時: 2004-03-10 21:51
はじめまして。
何か良い案はないかと思いまして、質問させて頂きます。
tomcat 4.1.24 で動作させています。
web.xml の <listener> を指定し、セッションタイムアウトを取得しています。
この中の処理で、どうしても「直前のリクエスト内容」を取得したいのです。
 (正確には getParameter() の値ですが)
取得するためには、どうするのが望ましいでしょうか。

一応確認ですが、HttpSessionEvent の中では HttpServletRequest は取得できない
ですよね?(そう思っているんですが…)
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-03-11 00:17
HttpSessionBindingListenerを使用してはいかがでしょうか。
ぶんぶん
会議室デビュー日: 2003/12/11
投稿数: 17
お住まい・勤務地: 東京・品川区
投稿日時: 2004-03-11 10:37
ありがとうございます。
HttpSessionBindingListener ですか?
ドキュメントには
「オブジェクトがセッションに結びつけられたり取り外されたりした時に通知を
 受けるためのインタフェースです。」
とあります。
結局このクラスも、通知を受け取るだけだと思っていたのですが…
セッションしかないのでリクエストは取得できない、と思っているのですが、
間違ってますかね。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-03-11 15:42
Servletのservice起動時に、今処理を行っているrequestのパラメータをSessionに保存する(Session毎に直前のrequestの履歴を残す)ようにすれば、リスナのハンドリングメソッド内部でEventオブジェクトにぶら下がっているSessionには、必ず望みのものが入っているようになるのでは、ということです。
間違ってますかね。^^;

はしもと
大ベテラン
会議室デビュー日: 2003/02/05
投稿数: 182
投稿日時: 2004-03-12 00:07
セッション・タイムアウト処理は、リクエストとは非同期に行われるので
HttpSession から ServletRequest を取得するのは無理です。

モノを予め HttpSession#setAttribute() しておいて、
HttpSessionListener#sessionDestroyed() で処理するか、

モノ自体に HttpSessionBindingListener をインプリメントして、
同じく予め HttpSession#setAttribute() しておくかでしょうね。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-03-12 11:58
変な文章を書いてしまってすみません。
以下のようなコードでいかがでしょうか?

コード:

class History implements HttpSessionBindingListener{

private HashMap impl ;

public void registerRequestParameter(HttpServletRequest request){
impl = new HashMap(request.getParameterMap());//シャローコピー作成
}

public void valueUnbound(HttpSessionBindingEvent event){
/*そんぶんさんの希望の処理を記述する位置*/
/*ほしいデータはimplに詰まっていると思います*/
}
}

public class HistoryFilter implements Filter{
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain){
HttpSession session = request.getSession();
History history = (History)session.getAttribute("History");
if(history == null){
history = new History();
session.setAttribute("History",history);
}
history.registerRequestParameter(request);
chain.doFilter(request,response);
}
}



[ メッセージ編集済み 編集者: シュン 編集日時 2004-03-12 12:01 ]

[ メッセージ編集済み 編集者: シュン 編集日時 2004-03-12 14:00 ]
はしもと
大ベテラン
会議室デビュー日: 2003/02/05
投稿数: 182
投稿日時: 2004-03-12 12:40
ひょっとして、私の発言がシュンさんの発言の否定と取られて
しまったでしょうか。だとしたら、すみません。

私は単に、HttpSession から ServletRequest を取る事は出来ないので、
予め必要な情報は HttpSession に setAttribute() しておく必要がある
事を表現したかったのです。

ただ、提示されたコードでは HttpServletRequest を HttpSession に
セットしてますが、この点はあまりお勧めできない様な...
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-03-12 13:57
引用:

はしもとさんの書き込み (2004-03-12 12:40) より:

ただ、提示されたコードでは HttpServletRequest を HttpSession に
セットしてますが、この点はあまりお勧めできない様な...




いえ、Historyに適当なコレクションをメンバで持たせておいて、registerRequestParameter()内部で、引数のHttpServletRequestからそのコレクションに対してパラメータをコピーするような仕組みではどうか、というつもりでした。ちょっと意図がはっきりしないようなので、コードを直しておきますね。

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