2015-03-12 4 views
1

Я хочу проверить свой url с помощью поверхностей и получить HTTP 404, если объект не существует. Мой URL должен выглядеть как /code/788?date=13.12.2015.Проверка правильности URL-адресов

Мой 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> 

В настоящее время действие будет принимать параметр из бобов, смотрите, если код существует на определенную дату в базе данных, а затем перенаправить либо на главную страницу (с параметры, установленные в сеансе) или на странице 404. Однако коды HTTP будут 302 и 200 вместо прямого 404.

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

Версия для моих приложений - 2.0.12.Final.

ответ

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 

} 
+0

спасибо! Прекрасно работает! Важно вернуть null (как показано в вашем примере), в противном случае я получаю java.lang.IllegalStateException: не удается вызвать sendRedirect() после того, как ответ был исправлен. – leo

Смежные вопросы