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

 セッションタイムアウト時、その旨のページを表示すること考えてい
ます。表示方法をご存知の方、もしくは別のアプローチをご存知の方、
御教授下さい。

(1)セッションタイムアウトの検知はHttpSessionBindingListenerを使用。
(2)セッションタイムアウトしたときに表示するページは、用意している
  sessiontimeout.htmlにRequestDispatcherを用い、ディスパッチ。
(3)ディスパッチ処理は、セッションタイムアウト時に呼ばれる
  valueUnbound(...)メソッドに記述。
<問題点>
 RequestDispatcherを用いてディスパッチするときのメソッドは引数にHttpServletRequest,HttpServletResponseが必要です。
 これをvalueUnbound(...)メソッド内で行う場合、
上記2つの引数をどのように取得すればよいのでしょうか?
--------------------------------------------------------------------

public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {

HttpSession s = req.getSession(false);

if(s == null) {
   s = req.getSession(true);
   s.setAttribute("listener", this);
  }
}

 //中略

//HttpSessionBindingListener
public void valueUnbound(HttpSessionBindingEvent event) {
  System.out.println("valueUnBound");

//セッションタイムアウト時、sessiontimeout.htmlを表示
  ServletConfig config = this.getServletConfig();
  ServletContext context = config.getServletContext();
  RequestDispatcher rd =
    context.getRequestDispatcher("/sessiontimeout.html");
  rd.forward(req,res);
  //HttpServletReqest,HttpServletResponseをどう取得する?---
}

A 回答 (1件)

やったことが無いので想像で書きます。



servlet 自体を session に setAttribute する、ってことは、その servlet が
持つ属性もセッションに保持されているんじゃないかと想像します。

マニュアルを読む限り HttpSessionBindingListener.valueUnbound() は、セッション
から unbound されようとしているときに呼出されるように思えます。つまり、
このメソッドが呼ばれるときには、まだ unbound されていない、と。

なので、servlet の属性として request などを保存しておけば良いんじゃないで
しょうか?

public class MyServlet extends HttpServlet implements HttpSessionBindingListener {

HttpServletRequest req_;
HttpServletResponse res_;

 public void doPost(HttpServletRequest req, HttpServletResponse res)
  throws ServletException, IOException {

  req_ = req;
  res_ = res;

  …
 }

 public void valueUnbound(HttpSessionBindingEvent event) {
  /*
  ここで、
  ((MyServlet)event.getSession().getAttribute("listener")).req_;
  で、保存した request が取得できるんじゃないか、と。
  */
 }
}

全くの思い付きなので、上手くいったら教えて下さい。
    • good
    • 0

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