2

Tomcat 7.0.35 を搭載した JSF アプリケーションに取り組んでいます。カスタム エラー ページを作成したいので、構成ファイルの<error-page>タグで遊んでみました。web.xml

<error-page>
    <error-code>404</error-code>
    <location>/error</location>
</error-page>

404 の場合、返されたページに正しい HTTP 本文があるという意味で機能しているようです。<error-page>ただし、HTTP リターン コードは 200です。 が構成されていないときに、予期された 404 が正しく受信されました。

が指定されていない場合、同じソフト 404<error-code>問題が発生します。

<error-page>
    <location>/error</location>
</error-page>

エラー コードを失わずにこのエラー ページを構成する方法を探しています。

役立つ可能性のあるさらに2つの情報:

  • JSF プロジェクトのステージは Production です
  • Pretty URL は Pretty Faces 3.3.3 で次のように処理されます。

    @Named(value = "error")
    @RequestScoped
    @URLMappings(mappings = {
        @URLMapping(id = "error", pattern = "/error", viewId = "/faces/error.xhtml")})
    public class ErrorController implements Serializable {
    
4

1 に答える 1

2

サーブレット フィルタによってエラー ページが処理されると、コンテナが適切に動作しないように見えることがあります。この場合、おそらく "/error" を PrettyFaces にマップし、それを内部的に別のリソースに転送しているようです。(PrettyFaces はサーブレット転送で動作します)

ここで起こることは、コンテナーが新しい Forward を認識し、実際にエラー ページを表示していたことを忘れて、Forwarded 要求が成功したために 200 ステータスを送信することだと思います。

これを解決するために必要なことは<action>#{bean.send404}</action>、エラー ページの prettyfaces マッピングに 404 ステータスを設定する を追加することです。

<url-mapping>
   <pattern value="/error" />
   <view-id="/faces/error.xhtml" />
   <action>#{bean.send404}</action>
</url-mapping>

次に、Bean メソッドは HttpServletResponse を取得する必要があります。これは通常、FacesContext から取得できます。

HttpServletResponse response = (HttpServletResponse)FacesContext.getCurrentInstance()
         .getExternalContext().getResponse();
response.sendError(HttpServletResponse.SC_NOT_FOUND);

それはあなたのためにトリックをするはずです。

于 2013-04-17T15:39:26.740 に答える