Prettyfaces URL 验证

Prettyfaces URL validation

我想用 prettyfaces 验证我的 url 并在对象不存在时获取 HTTP 404。我的 URL 应该看起来像 /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 的其他部分,因此无法验证对象是否存在。

我的 prettyfaces 版本是 2.0.12.Final.

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

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

}