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

(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をどう取得する?---
}

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qタイムアウト

接続のタイムアウトとトランザクションタイムアウト以外に
タイムアウトってありますか?
教えてください。
よろしくお願い致します。

Aベストアンサー

参考になりますか、わかりませんが、、、

remote query timeout とか知ってます。
あと接続のタイムアウトも、ODBCの接続プールのタイムアウトとか。
あと、、、セッションタイムアウトとか。。。

Qclass Test_A {  main(){}}の実行順序は?

public class Test_A {
public static void main(){

int a = 0;
int b = 1;

}
}
例えば上のようなサンプルで何故 main()がクラスTest_A の中に挟まっているのでしょうか?実行順序としては main()が終了したら、クラスTest_A の方はどうなるのでしょうか? main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。よろしくお願いします。 

Aベストアンサー

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時には、Test_Aクラスのインスタンスは生成されません。
質問のコードでは変数a,bに値が代入され、それで終わりです。

Javaでは、(正確にはJavaVMは)実行するclassファイルにある、
String[]引数を持ったvoid mainメソッドを実行する仕様になっています。
しかし、mainメソッドを実行するときには何のインスタンスも生成されていないので、
何かのインスタンスのメソッドを実行することはできません。
なので、staticなメソッドでないとJavaVMが実行できないのです。
さらに、JavaVMからアクセス可能なスコープを与える必要があるので、
publicである必要もあるのです。

あとは、そのmainメソッドに指定されたコードを実行し、mainメソッドの最後まで処理が進んだら
そこでJavaVMが終了し、プログラムも終了します。

※細かい話ですが、main()からプログラムは始まりません。
正確に言うと、引数なしのmain()メソッドは他のメソッドと何ら代わりがありません。
プログラムを始めるには、
アクセススコープがpublicで、staticな戻り値のなく、引数にString配列を取るmainメソッド
であることが必要です。つまり、
public static void main(String[] args)
とするのが通常です。
試しに質問のコードをjavaコマンドで実行すると、NoClassDefFoundErrorが出るはずです。

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時...続きを読む

Qシステムエラーの回避法とタイムアウトを早める方法

ブログのRSSを取得し最新5件の記事タイトルを取得するスクリプトを作りました。
スクリプト自体は問題なく動いているのですが、RSSを発行しているサイトがダウンした場合にちょっと困った事が…

問題1:タイムアウトが長すぎる
スクリプトは2回読んでいて、RSSのサーバーがダウンしている場合、タイムアウトしないと画面が表示されません。
タイムアウトが返って来るまでの時間は約6分です。
試しにfsockopenというのを使用してタイムアウトを5秒に設定したところ、タイムアウトは2分まで短縮されました。
タイムアウトが上手く動かないのは一体何故でしょうか?
10秒くらいで接続できなかったらタイムアウトさせて画面を全て表示させたいのですが、どうすればよいのでしょうか。

問題2:エラーを回避させてもシステムエラーになる。
システムエラーがあった場合、システムエラーの画面に飛ぶようになっています。
上記のブログでタイムアウトした場合、システムエラーとなり通常のページが表示されません。
関数に@をつけるとエラーメッセージは表示されないと教えていただきましたが、メッセージが表示されないだけでエラーには変わりありませんでした。
システムエラーとして認識させないためにはどうすればよいでしょうか?

現在のソースはこんな感じです。
$fp = fsockopen("www.hoge.jp", 5);
if(!$fp) {
 return "タイムアウト\n";
} else {
 //RSSの読み込み処理
}

アドバイスお願いします。

ブログのRSSを取得し最新5件の記事タイトルを取得するスクリプトを作りました。
スクリプト自体は問題なく動いているのですが、RSSを発行しているサイトがダウンした場合にちょっと困った事が…

問題1:タイムアウトが長すぎる
スクリプトは2回読んでいて、RSSのサーバーがダウンしている場合、タイムアウトしないと画面が表示されません。
タイムアウトが返って来るまでの時間は約6分です。
試しにfsockopenというのを使用してタイムアウトを5秒に設定したところ、タイムアウトは2分まで短縮されまし...続きを読む

Aベストアンサー

先ほどは触れるのを忘れていたのですが、fsockopen関数は正常にタイムアウトの設定が働いてないのかな、って思ってます。

以前、別なアプリケーションでfsockopenを使ってました。STMPのプロセスを書いていたのですが、ごく稀に相手から何の反応も帰ってこない事がありました。このスクリプトは元々処理時間が掛かるのでスクリプト自体の時間制限もナシにしていたので、fsockopenが無反応になる時は、エラーが出るどころか、永遠に処理が戻ってこないという状況でした。色々と設定を変えたりしてもダメだったので、そういうものだと思っていました。

Q"try{}catch(){}"文で"close()"はどのように書けばよいのでしょうか。

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プログラム1
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


●プログラム2
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


なお、私の環境は以下の通りです。
OS: Microsoft Windows XP Professional SP2
開発環境:Eclipse 3.2.2
java: java version "1.4.2_13"

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プロ...続きを読む

Aベストアンサー

>私のこの考え方は正しいのでしょうか。
正しいです。質問者さんが書かれているやり方が一般的です。
念のため書いておきますが、outをtryの外で宣言しないとコンパイルが通りません。

まぁ、あくまでデザインパターンを学ぶための本ですから、細かなコーディングについて気にする必要はないでしょう(疑問を持つことは良いことですが)。

Q嵐の宿題くんの番組協力をメールで応募したんですが、タイムアウトですと表

嵐の宿題くんの番組協力をメールで応募したんですが、タイムアウトですと表示されてしまいました。まだ応募時間が終了していないのになんでタイムアウトなのかわかりません。

Aベストアンサー

応募が殺到して、サーバが処理しきれずにタイムアウトしたものと思われます。

QJavaScriptで【window.google={kHL:"ja"};】という記述はどういう意味?

JavaScriptで【window.google={kHL:"ja"};】という記述はどういう意味?


YOUTUBE日本語版
http://jp.youtube.com/
のHTMLソースを見ていたら、



<script type="text/javascript">
    window.google={kHL:"ja"};
</script>


という記述を目にしたのですがこれはどういう意味あいというか目的のものなのでしょうか?


教えていただければ幸いです。

Aベストアンサー

これは、window.googleに'kHL'というキー(値は'ja')を持つ連想配列を
作成しています。

JavaScriptでの連想配列は

var 変数名 = {
キー : '値',
キー : '値',
:,
キー : '値'
};

というような感じで作成します。
キーはダブルクォートまたはシングルクォートで囲まなくても
いいようです。

参考URL:http://javascriptist.net/docs/basic_hash.html,http://www.openspc2.org/JavaScript/kouza2007/array/hash/index.html

Qサーバーに接続すると発生するタイムアウトとは?

アメリカと日本にサーバーを設置、データのやり取りを行っているのですが、接続して所定のデータを引っ張り出そうとすると、タイムアウトが発生してデータ転送ができません。

ちなみに日米間の回線はVPNで20Mbpsです。

タイムアウトとはどうして発生するのでしょうか?またデータ転送の解決方法はどのようなケースがある、または考えられるのでしょうか?

タイムアウトの問題について詳しい方、どんなことでも構いませんのでご存知の方よろしくアドバイスをお願いします。

Aベストアンサー

あ、タイムアウトとは?ってことですね。

 タイムアウトはどうして発生するかというと、タイムアウトが起こるようにしてあるからです。

# 意味不明っすね。

 コンピュータからコンピュータへ接続するにも、ウィンドウズのアイコンからそのコンピュータにインストールしてあるプログラムを呼び出すにも、何かから何かに「接続」して「対象」に対して「要求」し、期待する「反応」を待ってその「反応」に対して何らかの「動作」をします。その「反応」が返ってくるまでの間、「要求」した側は「待ち」の状態になりますよね?
 もし、これらの「要求」に対して何らかの原因で「反応」が返ってこなかった場合、「要求」した側はいつまでも待ち続けなければいけません。「反応」するはずの側も実は「待ち」続けているかもしれません。これは意図的に切断してあげないと、いつまでも待ち続けてしまいますので、こういった操作には「タイムアウト」という「時間切れ」が設定してあって、「何秒以内に反応が無ければ自動的に切断する」ということになっています。

 ですので、タイムアウト自体の機能は正常に動作しているわけですが、この場合の問題は、「なぜタイムアウトが発生するほど時間がかかるのか?」ということであって、「なぜタイムアウトが発生するのか?」ということではありません。

 実際にどういう構成でその作業をしてあるのか分かりませんが、暫定的にタイムアウトの設定を長く取ってみるという手はあります。ただ、20Mbpsもあり、その帯域がしっかり取れているのであれば、何かの設定ミスなどの可能性も否めません。
 ログイン自体はできているのですよね?ログイン後、「データを引っ張り出そうとする」と、タイムアウトが発生するんですよね?そのデータを引っ張りだせる権限はあるのかな?案外そんなところに原因があったりします。

あ、タイムアウトとは?ってことですね。

 タイムアウトはどうして発生するかというと、タイムアウトが起こるようにしてあるからです。

# 意味不明っすね。

 コンピュータからコンピュータへ接続するにも、ウィンドウズのアイコンからそのコンピュータにインストールしてあるプログラムを呼び出すにも、何かから何かに「接続」して「対象」に対して「要求」し、期待する「反応」を待ってその「反応」に対して何らかの「動作」をします。その「反応」が返ってくるまでの間、「要求」した側は「待ち」の...続きを読む

QRequestDispatcher.forwardメソッドで遷移する際のURL

お世話になります。
JSP/サーブレットを使用してwebアプリケーションを作成しています。

タイトルの通りRequestDispatcher.forwardメソッドで遷移する際のURL
についてうまくいかず、原因がわからない為質問させて頂きます。
ご教授宜しくお願い致します。
Aproject/jsp/login.jsp
Aproject/jsp/top.jsp
Aproject/WEB-INF/src/servlet/Login.java
という3つのファイルを使用しています。

login.jspにて<form action="../Login" method="post">で
Login.javaサーブレットにIDとパスワードを渡し、
サーブレットで認証を行ったあと
RequestDispatcher.forwardメソッドにて以下のように
遷移するようになっています。
RequestDispatcher rd = request.getRequestDispatcher("./jsp/top.jsp");
rd.forward(request, response);

遷移はうまくいくのですが、top.jspが表示される時のURLが
http://localhost:8080/Aproject/jsp/top.jspとなるはずが、
http://localhost:8080/Aproject/Login
となってしまいます。
web.xmlの記述は
<servlet>
<servlet-name>Login</servlet-name>
<servlet-class>servlet.Login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Login</servlet-name>
<url-pattern>/Login</url-pattern>
</servlet-mapping>
としています。
forwardメソッドではなく、sendRedirectメソッドを使用した場合
http://localhost:8080/Aproject/jsp/top.jsp
とうまくいきます。

どのような原因が考えられますでしょうか?
宜しくお願い致します。

お世話になります。
JSP/サーブレットを使用してwebアプリケーションを作成しています。

タイトルの通りRequestDispatcher.forwardメソッドで遷移する際のURL
についてうまくいかず、原因がわからない為質問させて頂きます。
ご教授宜しくお願い致します。
Aproject/jsp/login.jsp
Aproject/jsp/top.jsp
Aproject/WEB-INF/src/servlet/Login.java
という3つのファイルを使用しています。

login.jspにて<form action="../Login" method="post">で
Login.javaサーブレットにIDとパスワードを渡し、
...続きを読む

Aベストアンサー

そういう仕様です。
RequestDispatcherはリクエスト(URL)から実体のデータ(JSP)を隠匿します。

QIISのタイムアウト設定について

Windows2000+IIS6.0+ActivePerlで、時間がかかる処理を行うプログラムを作成しているのですが、
CGIタイムアウトが発生してしまい、最後まで実行
出来ません。

IISの設定で、ASPのタイムアウトや、セッションタイムアウトを30分とかに設定してもなぜか5分ほどでエラーになってしまいます。

どのようにすればCGIの実行時間を延ばせるのでしょうか?

Aベストアンサー

根本的な解決になるかどうか分かりませんが、以前にASPでタイムアウトを
アプリ側で回避するために用いたのは、処理を行っている間、
定期的にクライアント側にコメント文を送ってやるという方法でした。

Perl でもこれと同様の処理を行えばとりあえずは解決できるのでは
ないかと思います。

ASP版ですがその時と同じような処理を解説しているサイトが
あったので載せておきます。

参考URL:http://www.geocities.co.jp/SiliconValley/4334/unibon/asp/adoasync.html

Qpublic static void main (String args[])

基本すぎて申し訳ありませんが、
public static void main (String args[])とはどういう意味を持っていますか?
教えてください。。

Aベストアンサー

staticとかの意味はNo1の方の説明以外にありません。

mainは最初に実行されるメソッドという説明がされますので、「クラスを実行する時の引数とは?」と引っかかっているのかもしれませんね。
これはコマンドライン引数と呼ばれます。

たとえば、次のプログラム

public class ArgsTest{
  public static void main(String[] args){
    System.out.println(args.length);
    for(int i = 0 ; i < args.length ; i++){
      System.out.println(args[i]);
    }
  }
}

これを
>java ArgsTest abcde fghij(エンター)
として実行するとabcdeとfghijが引数となります。

ちなみに、mainはpublicでstaticなメソッドなので、
public class ArgsTest2{
  public static void main(String args[]){
    tamesi();
  }
  void tamesi(){
    String[] test = {"abcde","fghij"};
    ArgsTest.main(test);
  }
}
のように、外部のクラスからクラス名.mainで呼び出せます。(この2つのプログラムは、私が悩んだ時に試しにつくったものです)

ちなみにargsはarguments(=引数)の略で、mainの引数として、よく使われます。
argvのほうはargument valueの略です。C言語を使っていた人の中にはargvを使う人がいるかもしれません。

staticとかの意味はNo1の方の説明以外にありません。

mainは最初に実行されるメソッドという説明がされますので、「クラスを実行する時の引数とは?」と引っかかっているのかもしれませんね。
これはコマンドライン引数と呼ばれます。

たとえば、次のプログラム

public class ArgsTest{
  public static void main(String[] args){
    System.out.println(args.length);
    for(int i = 0 ; i < args.length ; i++){
      System.out.println(args[i]);
    }
  }
}

...続きを読む


人気Q&Aランキング