Как перенаправить пользователя, вышедшего из системы, на домашнюю страницу в Java EE / JSF? - PullRequest
0 голосов
/ 05 февраля 2012

Мне нужно разрешить только зарегистрированным пользователям большинство страниц моего приложения.Я разрабатываю приложение Java Enterprise с JSF 2. Кто-нибудь знает, как я могу это сделать?может быть, с файлом конфигурации?

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

Ответы [ 2 ]

2 голосов
/ 05 февраля 2012

Есть разные способы сделать это.Во-первых, вы можете использовать фильтры для управления доступом к странице или использовать слушатели фазы, которые слушают фазы jsf.

Я хочу дать вам два примера для них;

  public class SecurityFilter implements Filter{
      FilterConfig fc;

   public void init(FilterConfig filterConfig)throws ServletException {
      fc = filterConfig;
   }
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
   throws IOException, ServletException{
      HttpServletRequest req = (HttpServletRequest)request;
      HttpServletResponse resp = (HttpServletResponse) response;
      HttpSession session = req.getSession(true);

      String pageRequested = req.getRequestURI().toString();
      if(session.getAttribute("user") == null && !pageRequested.contains("login.xhtml")){
         resp.sendRedirect("login.xhtml");
      }else{
        chain.doFilter(request, response);
      }
   }
   public void destroy(){

   }

}

И вы должны добавить этот фильтрto web.xml;

<filter>
    <filter-name>SecurityFilter</filter-name>
    <filter-class>com.webapp.SecurityFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>SecurityFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

Пример Phase Listener;

public class SecurityFilter implements PhaseListener {


    public void beforePhase(PhaseEvent event) {
    }

    public void afterPhase(PhaseEvent event) {
      FacesContext fc = event.getFacesContext();

      boolean loginPage =
      fc.getViewRoot().getViewId().lastIndexOf("login") > -1 ? true : false;
        if (!loginPage && !isUserLogged()) {
             navigate(event,"logout");
        }
    }

    private boolean isUserLogged() {
        //looks session for user 
    }
    private void navigate(PhaseEvent event, String page) {
       FacesContext fc = event.getFacesContext();
       NavigationHandler nh = fc.getApplication().getNavigationHandler();
       nh.handleNavigation(fc, null, page);
    }
    public PhaseId getPhaseId() {
        return PhaseId.RESTORE_VIEW;
    }

}

Так что если вы хотите использовать listener, вы должны добавить это в файл Face-Config.xml;Примечание: «Выход из системы» - это правило навигации, которое определено вface-config

<lifecycle>
 <phase-listener>com.myapp.SecurityFilter</phase>
</lifecycle>

Редактировать: Правило навигации;

<navigation-rule>
        <from-view-id>/*</from-view-id>
        <navigation-case>
            <from-outcome>logout</from-outcome>
            <to-view-id>/login.xhtml</to-view-id>
            <redirect/>
        </navigation-case>
    </navigation-rule>

Вы можете указатьпользователь для сеанса в методе входа в систему, как это;

FacesContext context = FacesContext.getCurrentInstance(); 
HttpSession session = 
(HttpSession)context.getExternalContext().getSession(true); 

session.setAttribute("user", loggedUser);
0 голосов
/ 05 февраля 2012

Есть много способов достичь этого.Самый простой и, вероятно, самый популярный способ - использовать фильтр сервлетов. Более подробную информацию о таком механизме можно найти здесь: Базовая безопасность в JSF

...