2

当我从 javax.faces.resource 键入一个不存在的资源的 url 时,例如

http://myapp/javax.faces.resource/noexisting.xhtml 

我正在获取默认的 HTTP 404 页面,而我的 404 错误页面没有被呈现。我知道 FacesServlet 将状态代码设置为 404 而不是发送 en 错误,这就是我的错误页面从未被调用的原因。有没有办法覆盖这个实现来发送错误而不是设置状态码?

我正在使用 primefaces 3.5 和 morajara 2.1.14。

谢谢你的帮助。

4

1 回答 1

5

我自己找到了解决方案。我实现了自己的 ResourceHandlder 并检查资源是否存在。如果资源不存在,我会发送 404 错误。如果其他人有同样的问题,这里是代码:

package com.mypackage;

import java.io.IOException;
import javax.faces.application.Resource;
import javax.faces.application.ResourceHandler;
import javax.faces.application.ResourceHandlerWrapper;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import com.sun.faces.util.Util;

public class MyResourceHandler extends ResourceHandlerWrapper {

  // Properties
  // -----------------------------------------------------------------------------------------------------

  private final ResourceHandler wrapped;

  public MyResourceHandler (final ResourceHandler wrapped) {
    this.wrapped = wrapped;
  }

  @Override
  public ResourceHandler getWrapped() {
    return wrapped;
  }


  /**
   * @see javax.faces.application.ResourceHandlerWrapper#isResourceRequest(javax.faces.context.FacesContext)
   */
  @Override
  public boolean isResourceRequest(final FacesContext context) {
    return super.isResourceRequest(context);
  }

  @Override
  public void handleResourceRequest(FacesContext context) throws IOException {
    String resourceId = normalizeResourceRequest(context);
    if (null != resourceId && resourceId.startsWith(RESOURCE_IDENTIFIER)) {
      Resource resource = null;
      String resourceName = null;
      if (ResourceHandler.RESOURCE_IDENTIFIER.length() < resourceId.length()) {
        resourceName = resourceId.substring(RESOURCE_IDENTIFIER.length() + 1);
        if (!StringUtils.isEmpty(resourceName)) {
          resource =
              context
                  .getApplication()
                  .getResourceHandler()
                  .createResource(resourceName,
                      context.getExternalContext().getRequestParameterMap().get("ln"));
        }
      }
      if (resource == null) {
        HttpServletResponse response =
            (HttpServletResponse) context.getExternalContext().getResponse();
        response.sendError(404);
        return;
      }
    }
    super.handleResourceRequest(context);
  }

  private String normalizeResourceRequest(FacesContext context) {

    String path;
    String facesServletMapping = Util.getFacesMapping(context);
    // If it is extension mapped
    if (!Util.isPrefixMapped(facesServletMapping)) {
      path = context.getExternalContext().getRequestServletPath();
      // strip off the extension
      int i = path.lastIndexOf(".");
      if (0 < i) {
        path = path.substring(0, i);
      }
    } else {
      path = context.getExternalContext().getRequestPathInfo();
    }
    return path;
  }


}
于 2013-09-18T15:37:22.793 回答