2017-06-23 12 views
0

が関連web.xml部品は次のようになります。Tomcatのではないリダイレクト後にフィルタを適用する(転送?)のTomcat 7を使用して

<filter> 
    <filter-name>Filter</filter-name> 
    <filter-class>my.company.Filter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>Filter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<error-page> 
    <error-code>404</error-code> 
    <location>404.jsp</location> 
</error-page> 
Filterのコードは次のようになります

(簡体字):

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
    System.out.println("Filter start"); 
    chain.doFilter(request, response); 
    System.out.println("Filter finish"); 
} 

404.jspは次のようになります(簡略化されています):

<%@ page language="java" contentType="text/html; charset=UTF-8" 
    pageEncoding="UTF-8"%> 
<% 
    System.out.println("404 here"); 
%> 

Tomcatは存在しないページが正しくFilter実行存在しないことを考え出すされている間、他の言葉で、だから、

Filter start 
Filter finish 
404 here 

:存在しないページ(/foobarなど)を開くの出力TDOUTこれです。しかし、その直後に404ページをレンダリングしている間は、Filterにラップされていません。それ以外の場合は、404ページが正常にレンダリングされ、Filterが他のすべての(転送されていない)JSPに正しく適用されます。

404.jspに直接アクセスすると、Filterが正しく適用されます。 Filterが最初に呼び出されたJSP(不足しているJSP)にアクセスし、404.jspだけが評価されますが、Filterにはラップされません。

フィルタを404.jspにラップさせるにはどうすればよいですか?

+0

あなたのフィルタコードでは、コンテナがあなたの404.jspを呼び出すように404のステータスを返す必要があります。 –

+0

はい、見つからないものを要求する必要がありました。この特定の場合、/ *へのマッピングは、すべてがフィルターによって傍受されることを意味します。現在のところ、フィルタによって200が返され、404.jspがトリガされません。 –

+0

Ops、私はあなたの質問を誤解しました...あなたの言うTomcatは404.jspを実行しましたか?だから問題は何ですか? –

答えて

1

サーブレット仕様のセクション6.2.5を読む必要があります。

<filter-mapping> 
    <filter-name>Filter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>ERROR</dispatcher> 
</filter-mapping> 

だから、フィルタマッピングは、エラーページだけでなく、通常の要求に適用されます。

あなたのマッピングは、あなたが、少なくともたい

<filter-mapping> 
    <filter-name>Filter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
</filter-mapping> 

に相当します。

その他のディスパッチャ設定が利用可能です。

+0

ありがとうございます - これは私が逃したものです。魅力のように動作します。 – vektor

-1

404.jspはresponse.setStatus(404);です。このページは404ステータスを処理するためにコンテナによって呼び出されるため、再度設定する必要はありません。

+0

良い点、ありがとう。その 'response.setStatus(404);という考え方は、404.jspページを直接訪問するだけでHTTP 404が返されるということです。しかし、私の問題は変わりません。 – vektor

+0

'setStatus(404)'が削除されたのでもう一度テストできますか?私が困惑しているのは、あなたのマッピングが '/ *'であり、あなたのフィルタがステータス404を設定していないということです。なぜTomcatはマッピングされていない(見つからない)URLを要求していると思いますか? –

関連する問題