Prettyfaces URL验证

时间:2015-03-12 13:33:55

标签: jsf prettyfaces

我想用prettyfaces验证我的url,如果对象不存在,则获取HTTP 404。我的网址应该像/code/788?date=13.12.2015

我的prettyfaces配置看起来像:

<url-mapping id="code">
    <pattern value="/code/#{/[0-9]+/ code: prettyUrlCheckBean.newCode}" />
    <query-param name="date">#{navigationBean.calendarDateAsString}</query-param>
    <view-id value="/content/codes.jsf"/>
    <action>#{prettyUrlCheckBean.checkEntryUrlWithNewCode}</action>
</url-mapping>

目前,该操作将从bean中获取参数,查看代码是否存在于数据库中的给定日期,然后重定向到主页(在会话中设置参数)或404页面。但是,HTTP代码将是302200,而不是直接404

我在模式和查询参数中都尝试过验证器,但在任何一种情况下我都无法访问URL的其他部分,因此无法验证对象是否存在。

我的漂亮面版版本是2.0.12.Final。

1 个答案:

答案 0 :(得分:1)

我认为执行此类验证的最简单方法是在action方法中执行此操作。在那里,您拥有所需的所有信息,并且在验证错误的情况下发送404是直接的。我总是使用一个小助手类:

public class FacesRequests {

  public static void sendForbidden() {
    sendStatusCode( 403 );
  }

  public static void sendNotFound() {
    sendStatusCode( 404 );
  }

  private static void sendStatusCode( int status ) {

    FacesContext context = FacesContext.getCurrentInstance();

    try {
      HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
      response.sendError( status );
      context.responseComplete();
    }
    catch( IOException e ) {
      throw new IllegalStateException( "Could not send error code", e );
    }

  }

}

你基本上可以这样做:

public String myActionMethod() {

  boolean valid = ...;
  if( !valid ) {
    FacesRequests.sendNotFound();
    return null;
  }

  // business code here

}