JSF PhaseListener viewId всегда на один позади

Я пытаюсь запретить пользователям доступ к специальным страницам с помощью PhaseListener. по этой причине я пытаюсь выяснить, на какую страницу они пытаются получить доступ.

но моя проблема в том, что я получаю только ту страницу, где они были раньше. не настоящая страница.

public void afterPhase(PhaseEvent event) 
{
    FacesContext fc = event.getFacesContext();
    System.out.println("test1" + fc.getViewRoot().getViewId());
}

и здесь то же самое

public void afterPhase(PhaseEvent event) 
{
    FacesContext fc = event.getFacesContext();
    HttpServletRequest request = (HttpServletRequest) fc.getExternalContext().getRequest();
    String uri = request.getRequestURI();

    System.out.println("uri: " + uri);
}

почему это так и как мне получить имя страницы, к которой пытается получить доступ пользователь? Не тот, который им требовался за шаг до этого, или, лучше, та страница, с которой они пришли.


person dustin.b    schedule 27.01.2012    source источник


Ответы (1)


Это на один шаг позади, потому что именно так ведет себя последовательность запросов HTTP POST. Когда вы перемещаетесь в приложении JSF с помощью командных кнопок, каждый запрос идет как почтовый запрос.

Поскольку вы защищаете некоторые ресурсы, убедитесь, что к ним обращаются через HTTP GET, чем вы получите точный идентификатор представления, это может быть достигнуто как

  • Пользователь напрямую нажимает на URL-адрес из адресной строки браузера.
  • После публикации приложения jsf перенаправьте его на ресурс вместо простой навигации JSF. Шаблон POST-REDIRECT-GET относится к этому, посмотрите здесь.
  • Если вы показываете некоторые сообщения после каждого POST, вам может понадобиться Flash карта для этого, которая является новой функцией в JSF2, если вам не повезло с JSF1.x, вы можете реализовать flash, если хотите.

В заключение перехватите идентификаторы представления в HTTP-запросе GET.

Надеюсь это поможет...

person baba.kabira    schedule 27.01.2012
comment
Другими словами, выполняйте навигацию по страницам не с помощью POST, а с помощью GET. См. также stackoverflow. ком/вопросы/4317684/ - person BalusC; 27.01.2012