Проверка URL 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 будут 302 а также 200 вместо прямого 404,

Я пробовал валидатор как в шаблоне, так и в параметре запроса, но в любом случае у меня нет доступа к другой части URL-адреса, и поэтому я не могу проверить, существует ли объект.

Моя версия prettyfaces - 2.0.12. Наконец.

1 ответ

Решение

Я думаю, что самый простой способ выполнить такую ​​проверку - сделать это в методе действия. Там у вас есть вся необходимая информация, и отправка 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

}
Другие вопросы по тегам