3

[コンテキスト]tomcat7-java 1.7

こんにちは、みなさん; 私は奇妙な仕事に直面しています。私のweb.xmlファイルでは、次のようにリクエストをマッピングしました。

web.xml

<web-app>
    <filter>
        <filter-name>filter</filter-name>
        <filter-class>demo.DemoFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>Servlet</servlet-name>
        <servlet-class>demo.DemoServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>Servlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

DemoFilter.java(フィルターを実装)

@Override
public void doFilter( ServletRequest req, ServletResponse res, FilterChain chain )
        throws IOException, ServletException
{
    try
    {
        chain.doFilter(req, res);
    }
    catch ( Exception e )
    {
        System.err.println("error");
        ((HttpServletResponse) res).setContentType("text/html");
        ((HttpServletResponse) res).setStatus(HttpServletResponse.SC_NOT_FOUND);
        res.getWriter().write("foo");
    }
}

DemoServlet.java(HttpServletを拡張します)

@Override
protected void doGet( HttpServletRequest req, HttpServletResponse resp )
        throws ServletException, IOException
{
    System.err.println(req.getRequestURI());
    throw new RuntimeException("ERROR");
}

[1 =期待される結果]最初に、「/ foo / bar」をリクエストしようとすると、フィルターとサーブレットが呼び出されました(ページに「foo」という単語が表示されます)。コンソールの結果:

/foo/bar    
error

[2 =予期しない結果]次に、「/ WEB-INF / foo / bar」を要求しようとすると、何も呼び出されず(フィルターとサーブレットがヒットしませんでした)、Tomcatエラーレポートが表示されます。

HTTP Status 404 -

type Status report

message

description The requested resource is not available.
Apache Tomcat/7.0.30

編集:ここで、私は次の結果を得ると期待していました:

/WEB-INF/foo/bar    
error

フィルタを使用して例外(「/ WEB-INF」呼び出しを含む)を処理することを目指しています。

  • 「/WEB-INF/」で始まるリクエストが、「/ *」パターンにマップされたフィルタ/サーブレットにヒットしないのはなぜですか?
  • この問題をどのように解決できますか?

前もって感謝します!

PS:現在のweb.xml構成を保持したい( "url-pattern" = "/ *"; "error-page"を使用せずに)


編集私の質問は誤解されていました。「WEB-INF」ディレクトリでファイルアクセスを提供したくありません。リクエストURIが「/WEB-INF/」で始まっている場合でも、フィルタとサーブレット(url-pattern ='/ *')を使用してすべてのリクエストを処理したいと思います。ありがとう !

4

5 に答える 5

6

ここには大きな概念上の誤解があります。のリソース/WEB-INFは一般公開されていません。質問の仕方は、そうでないことを示しています。これは正しくないです。あなたは具体的な問題について間違った方法で質問しただけだと思います

/WEB-INFコメントに基づいて、アクセスしたファイルと 404 エラーをログに記録したいということを理解しました。直接要求されたリソースの横に、転送されたリソース、含まれているリソース、およびエラーが発生したリソースもログに記録することを実際に意味していたと思います/WEB-INF通常、転送されて含まれるリソースは、直接アクセスできないように隠されています。

フィルターは、デフォルトでは、直接リクエストされたリソースに対してのみ呼び出されます。転送されたリソースや含まれているリソース、または 404 試行のようなエラーが発生したリソースでは呼び出されません。そのためには、適切な<dispatcher>エントリをマッピングに追加する必要があります。

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

(それらはそれぞれオプションです。REQUEST完全に存在しない場合は がデフォルトです)

このようにして、フィルターは直接要求されたリソースだけでなく、転送されたリソース、含まれているリソース、およびエラーが発生したリソースも傍受します。ERRORディスパッチャーは、404 エラーにも対応します。

于 2012-12-30T22:22:51.250 に答える
2

WEB-INF ディレクトリは Web アプリケーションのプライベート領域であり、WEB-INF ディレクトリ以下のファイルは、指定した方法で URL を指定してブラウザから直接アクセスすることはできません。

Web コンテナは、このディレクトリのコンテンツを提供しません。ただし、このディレクトリのコンテンツは、アプリケーション内の web.xml でマップしたサーブレットなどのクラスからアクセスできます。

于 2012-12-30T18:41:51.083 に答える
2

一部のファイルへの直接 URL アクセスを制限したい場合は、それらを WEB-INF ディレクトリの下に置きます。

ここから引用: http://www.servletworld.com/servlet-tutorials/web-application-directory-structure.html

WEB-INF ディレクトリは Web アプリケーションのプライベート領域であり、WEB-INF ディレクトリ以下のファイルは、 のようなURL を指定してブラウザから直接アクセスすることはできませんhttp://somesite/WEB-INF/someresource.html。Web コンテナは、このディレクトリのコンテンツを提供しません。ただし、WEB-INF ディレクトリの内容は、アプリケーション内のクラスからアクセスできます。そのため、Web ブラウザから直接アクセスしたくない JSP や HTML ドキュメントなどのリソースがある場合は、WEB-INF ディレクトリの下に配置する必要があります。

于 2012-12-30T18:42:22.700 に答える
0

投稿された両方の回答は正しいです。これは、使用するアプリケーション サーバーと JDK で同じです。サーブレット仕様 3.0 から web.xml はオプションですが、web-framgment.xml を使用して web.xml を壊すこともできます。

于 2012-12-30T19:01:45.000 に答える
0

サーブレットの仕様によると、WEB-INF/ ディレクトリ内のリソースにアクセスするためのクライアントからの要求は、SC_NOT_FOUND(404) 応答で返される必要があります。セクション 10.5 ディレクトリ構造を参照してください。

https://download.oracle.com/otn-pub/jcp/servlet-3_1-fr-eval-spec/servlet-3_1-final.pdf https://download.oracle.com/otn-pub/jcp/servlet -3.0-fr-eval-oth-JSpec/servlet-3_0-final-spec.pdf

于 2020-02-21T19:30:37.990 に答える