JSF PhaseListener viewId всегда один позади - PullRequest
1 голос
/ 27 января 2012

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

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

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);
}

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

1 Ответ

4 голосов
/ 27 января 2012

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

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

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

Чтобы завершить перехват идентификаторов представлений в HTTP-запросе GET.

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

...