2

我在一个由 Tomcat 7.0.35 提供支持的 JSF 应用程序上工作。我想创建一个自定义错误页面,因此使用了配置文件中的<error-page>标签。web.xml

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

从某种意义上说,在 404 的情况下,返回的页面具有正确的 HTTP 正文似乎有效。但是 HTTP 返回代码是 200。预期的 404 在<error-page>未配置时被正确接收。

如果未指定,则会发生相同的soft-404问题。<error-code>

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

我正在寻找一种方法来配置此错误页面而不会丢失错误代码。

还有两条可能有用的信息:

  • JSF 项目阶段是生产
  • Pretty Faces 3.3.3 正在处理漂亮的 URL,其内容如下

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

1 回答 1

2

有时,当您有一个由 servlet 过滤器处理的错误页面时,容器的行为似乎不太好。在这种情况下,您可能已经将“/error”映射到 PrettyFaces,并且正在内部将其转发到另一个资源。(PrettyFaces 与 Servlet 转发一起使用)

我相信这里发生的情况是,容器看到了新的转发,忘记了它实际上是在显示错误页面,并发送 200 状态,因为转发请求成功。

要解决此问题,您需要做的是<action>#{bean.send404}</action>在错误页面漂亮面孔映射中添加一个设置 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 回答