- - PR -
フィルタ中でgetServletPathを取得すると動きが止まる
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 ] |
|
投稿日時: 2005-09-15 18:58
動きが止まる、とは具体的にどういう状態でしょうか?
フィルタを実行しているスレッドがハングするということですか?(恐らく違うと思いますが・・・) その場合はスレッドダンプをとりましょう。 |
|
投稿日時: 2005-09-15 19:05
インデントされてないので読み違えているかもしれませんが、(session.getAttribute("type") == null) が false の場合の処理が記載されていない見たいです。
chain.doFilter(req,res); が必要かな? |
|
投稿日時: 2005-09-15 19:07
(requestPath.equals("Bサーブレット") == false) が false の場合もそんな雰囲気。
# if(!requestPath.equals("Bサーブレット")) とも書けますよ 特定の条件にひっかからない場合では chain.doFilter(req,res); をちゃんと呼び出すようにしましょう。 |
|
投稿日時: 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文を記述しても 出力がなされていませんでした。 |
|
投稿日時: 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) を呼び出す必要があります。 #もしかするとご質問の意味理解できていないかもしれません・・・だとしたらごめんなさい |
|
投稿日時: 2005-09-16 19:16
インギさん ありがとうございます。
chain.doFilter、・・・やっとわかりました。 次のフィルタを呼び出すもので、フィルタがなければ リクエスト先のサーブレットへ遷移されるんですね。 そこまで知りませんでした ![]() そうとは知らずにこのスレッドへの書き込み後 リクエスト先に無理矢理forwardしようとしてました。 記述したプログラムの中で 「System.out.println("Filter終わり"); 」 の位置まで到達すればよかったので、 ここにchain.doFilterを書くことでリクエスト先に飛びました。 ありがとうございました。 |
1