JSF 2.0 web.xml错误页面状态代码

时间:2013-12-03 01:39:58

标签: java tomcat jsf-2 web.xml

我正在修改使用JSF创建的应用程序。有关我正在做的事情的一些背景,请阅读以下内容。

背景

Acunetix扫描在操作javax.faces.ViewState的值时,在我的大多数页面中检测到称为“应用程序错误消息”的中等安全问题。 Acunetix扫描将viewstate更改为随机值或空字符串,导致我的应用程序抛出异常。使用web.xml文件中的以下配置,自定义错误页面会捕获异常。

<error-page>
  <error-code>500</error-code>
  <location>/unhandled.xhtml</location>
</error-page>

<error-page>
  <exception-type>java.lang.Throwable</exception-type>
  <location>/unhandled.xhtml</location>
</error-page>

这可以按预期工作,并显示自定义错误页面。但是,Acunetix扫描将此视为漏洞,因为它在标头中看到500状态代码,并显示错误消息内部服务器错误。

Acunetix扫描摘录

/webapp/login.xhtml
Details
URL encoded Post input javax.faces.ViewState was set to
Error message found: Internal Server Error

问题:

是否可以将错误页面的状态代码更改为200而不是500.如果没有,任何人都可以提出解决方法,这将允许我操作页面状态代码。

注意:

请注意我使用以下框架 Spring,JSF 2.0,Primefaces 3.4,Hibernate,Omnifaces(FacesEceptionFilter&amp; FullAjaxExceptionHandlerFactory),Tomcat 7服务器。

感谢您的帮助......

2 个答案:

答案 0 :(得分:2)

通过这样做我解决了我的问题。在我的错误页面中,我刚刚添加了一个强制状态代码为200的事件监听器。

<?xml version="1.0" encoding="ISO-8859-1" ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:p="http://primefaces.org/ui">

       <f:view contentType="text/html">
          <f:metadata>
             <f:event type="preRenderView" listener="#{errorController.forceStatusCode200()}"></f:event>
          </f:metadata>

          <h:body>
             <h1>ZZZZZZZZZ</h1>
          </h:body>
       </f:view>
    </html>

在我的managedBean

@component("errorController")
@Scope("view")
public class ErrorController
{
   public void forceStatusCode200()
   {
      FacesContext fc = FacesContext.getCurrentInstance();
      ExternalContext ec = fc.getExternalContext();
      HttpServletResponse hp = (HttpServletResponse) ec.getResponse();
      hp.setStatus(HttpServletResponse.SC_OK);
   }
}

当我使用Fiddler检查响应的状态代码时,我无法再看到错误代码500.

我希望这有助于某人。如果有人可以指出任何不良副作用,请不要犹豫发布。

感谢您的时间......

答案 1 :(得分:0)

您应该能够添加一个无条件地将所有响应代码设置为200的servlet过滤器。

  1. 在web.xml中注册过滤器,如下所示:

    &LT; filter&GT;

        <filter-name>StatusCodeFilter</filter-name>
    
        <filter-class>com.foo.StatusCodeFilter</filter-class> 
    

    &LT; /filter&GT;

  2. 在过滤器类的doFilter方法中,按如下方式设置响应代码:

       @Override
       public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
           throws IOException, ServletException {
    
               ((HttpServletResponse)response).setStatus(HttpServletResponse.SC_OK);