Проверка 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
}