- PR -

フィルタ中でgetServletPathを取得すると動きが止まる

1
投稿者投稿内容
ma
常連さん
会議室デビュー日: 2004/08/09
投稿数: 34
お住まい・勤務地: 福岡
投稿日時: 2005-09-15 18:31
AのフォームからBのサーブレットの間にフィルタを通して
指定されたURLへ遷移しているか確認し、通っているかいないかによって
フィルタ内で遷移先を変えようとしています。
URLを確認するためにgetServletPathでパスを取得しているのですが、
なぜかifを記述すると動きが止まってしまいます。
フィルタ内でgetServletPathを使うことに何か問題があるのでしょうか。
フィルタプログラムは以下のとおりです

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Filter_Example implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {

HttpSession session = ((HttpServletRequest)req).getSession();
RequestDispatcher rd = null;
System.out.println("Filterはじめ");

//ここでサーブレットパスを取得
String requestPath = ((HttpServletRequest)req).getServletPath();
//この文を入れると動きが止まる
if(requestPath.equals("Bサーブレット") == false){

if(session == null){
rd = req.getRequestDispatcher("エラーページ");
rd.forward(req,res);

}else{

if(session.getAttribute("type") == null){
rd = req.getRequestDispatcher("エラーページ");
rd.forward(req,res);
}
}
}
System.out.println("Filter終わり");
}
public void init(FilterConfig config) throws ServletException {}
public void destroy() {}
}

環境は、
OSがSUSE LINUX
WEBサーバはTOMCAT5.0.28
です。

[ メッセージ編集済み 編集者: ma 編集日時 2005-09-15 18:37 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-09-15 18:58
動きが止まる、とは具体的にどういう状態でしょうか?
フィルタを実行しているスレッドがハングするということですか?(恐らく違うと思いますが・・・)
その場合はスレッドダンプをとりましょう。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-09-15 19:05
インデントされてないので読み違えているかもしれませんが、(session.getAttribute("type") == null) が false の場合の処理が記載されていない見たいです。
chain.doFilter(req,res); が必要かな?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-09-15 19:07
(requestPath.equals("Bサーブレット") == false) が false の場合もそんな雰囲気。
# if(!requestPath.equals("Bサーブレット")) とも書けますよ

特定の条件にひっかからない場合では chain.doFilter(req,res); をちゃんと呼び出すようにしましょう。

ma
常連さん
会議室デビュー日: 2004/08/09
投稿数: 34
お住まい・勤務地: 福岡
投稿日時: 2005-09-16 05:46
インギさん ありがとうございます
すいません インデントはタブや空白をいれてもできなかったので・・・
止まる、と言ったのは目的のサーブレット(ここではBサーブレット)のスレッドが呼び出されていない
ということを言いたかったのです。
if(session.getAttribute("type") == null) と if(requestPath.equals("Bサーブレット") == false)
の処理は省略しているだけです。
本来はここでRequestDispatcherのオブジェクトでgetRequestDispatcherとforwardとやっています。(両方の条件文で、です)
スレッドダンプではないんですが、終わりの方にout文( System.out.println("Filter終わり");  )
と記述しています。するとログには”Filter終わり”と出力されていました。
しかし、Bサーブレット内のメソッド(doGet)のはじめの方にout文を記述しても
出力がなされていませんでした。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-09-16 09:48
>すいません インデントはタブや空白をいれてもできなかったので・・・
これ↓でイケますよ
http://www.atmarkit.co.jp/bbs/phpBB/faq-japanese.php#bbcode

フィルタは条件によって目的のサーブレットを呼び出さずに forward や redirect する権限が与えられているのに引き替え、そのリクエストが元々呼び出そうとしているサーブレット を呼び出す責任もあります。
>本来はここでRequestDispatcherのオブジェクトでgetRequestDispatcherとforwardとやっています。
>(両方の条件文で、です)
これは、いずれかの条件で B サーブレットを呼び出す処理を行っているということでしょうか?
サンプルではエラーページへ forward している部分しか見受けられないのですが。

繰り返しになりますが、特定の条件にひっかかって forward や redirect をする必要がないのであれば(Bサーブレットを呼び出すのであれば) chain.doFilter(req,res) を呼び出す必要があります。
#もしかするとご質問の意味理解できていないかもしれません・・・だとしたらごめんなさい
ma
常連さん
会議室デビュー日: 2004/08/09
投稿数: 34
お住まい・勤務地: 福岡
投稿日時: 2005-09-16 19:16
インギさん ありがとうございます。
chain.doFilter、・・・やっとわかりました。
次のフィルタを呼び出すもので、フィルタがなければ
リクエスト先のサーブレットへ遷移されるんですね。
そこまで知りませんでした

そうとは知らずにこのスレッドへの書き込み後
リクエスト先に無理矢理forwardしようとしてました。
記述したプログラムの中で
「System.out.println("Filter終わり"); 」
の位置まで到達すればよかったので、
ここにchain.doFilterを書くことでリクエスト先に飛びました。
ありがとうございました。
1

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