Проверьте, существует ли сессия JSF - PullRequest
7 голосов
/ 16 ноября 2011

У меня есть страница входа, где у меня есть бин User для аутентификации имени пользователя и пароля для человека. Этот боб является сессионной областью. Если кто-то пишет URL-адрес и пытается перейти на страницу входа, как я могу проверить это и перенаправить его на страницу входа?

С другой стороны. Предположим, я вошел в систему и работал, и внезапно я ухожу на некоторое время, и мой сеанс истекает. Когда я возвращаюсь и пытаюсь взаимодействовать с формой, она отправляет мне сообщение об окончании сеанса. Как я могу перенаправить снова на форму входа в систему, когда это происходит?

Спасибо заранее. Надеюсь, я объясню.

Мохарра 2.1.4, Tomcat 7, Томагавк 1.1.11

Ответы [ 2 ]

16 голосов
/ 16 ноября 2011

Если кто-то пишет URL-адрес и пытается перейти на страницу входа, как я могу проверить это и перенаправить его на страницу входа?

Кажется, вы используете доморощенную аутентификацию. В этом случае вам нужно внедрить фильтр сервлетов . JSF сохраняет управляемые bean-объекты в качестве атрибутов HttpSession, так что вы можете просто проверить это в doFilter() методе:

HttpServletRequest req = (HttpServletRequest) request;
UserManager userManager = (UserManager) req.getSession().getAttribute("userManager");

if (userManager != null && userManager.isLoggedIn()) {
    chain.doFilter(request, response);
} else {
    HttpServletResponse res = (HttpServletResponse) response;
    res.sendRedirect(req.getContextPath() + "/login.xhtml");
}

Сопоставьте этот фильтр с шаблоном URL, охватывающим защищенные страницы, например, /app/*.


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

Я так понимаю, что это касается запросов Ajax? Для обычных запросов вы могли бы использовать <error-page> в web.xml. Если установить метод сохранения состояния для клиента в web.xml следующим образом

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>

не вариант, тогда вам нужно реализовать пользовательский ExceptionHandler:

public class ViewExpiredExceptionHandler extends ExceptionHandlerWrapper {

    private ExceptionHandler wrapped;

    public ViewExpiredExceptionHandler(ExceptionHandler wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public void handle() throws FacesException {
        FacesContext facesContext = FacesContext.getCurrentInstance();

        for (Iterator<ExceptionQueuedEvent> iter = getUnhandledExceptionQueuedEvents().iterator(); iter.hasNext();) {
            Throwable exception = iter.next().getContext().getException();

            if (exception instanceof ViewExpiredException) {
                facesContext.getApplication().getNavigationHandler().handleNavigation(facesContext, null, "viewexpired");
                facesContext.renderResponse();
                iter.remove();
            }
        }

        getWrapped().handle();
    }

    @Override
    public ExceptionHandler getWrapped() {
        return wrapped;
    }

}

(обратите внимание, что этот конкретный пример переходит на viewexpired, поэтому он ожидает /viewexpired.xhtml как страницу ошибки)

Вышеперечисленное необходимо выпекать с помощью следующей реализации ExceptionHandlerFactory:

public class ViewExpiredExceptionHandlerFactory extends ExceptionHandlerFactory {

    private ExceptionHandlerFactory parent;

    public ViewExpiredExceptionHandlerFactory(ExceptionHandlerFactory parent) {
        this.parent = parent;
    }

    @Override
    public ExceptionHandler getExceptionHandler() {
        return new ViewExpiredExceptionHandler(parent.getExceptionHandler());
    }

}

, который в свою очередь необходимо зарегистрировать в faces-config.xml следующим образом:

<factory>
    <exception-handler-factory>com.example.ViewExpiredExceptionHandlerFactory</exception-handler-factory>
</factory>
1 голос
/ 11 ноября 2014

Если вы внедряете свою собственную систему, вы можете добавить к пользователю атрибут с именем session или любым другим. Этот атрибут может быть логическим , поэтому при каждом запуске сеанса вы можете установить для этого атрибута значение true. Напишите метод с именем разрешение , например:

public void permission() throws IOException {

        if(userStatelessBean.getSession() == false) {
            System.out.println("*** The user has no permission to visit this page. *** ");
            ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
            context.redirect("login.xhtml");
        } else {
            System.out.println("*** The session is still active. User is logged in. *** ");
        }
    }

На каждой странице jsf ( для этого примера ), для которой вы хотите установить ограничения, вы можете добавить следующий код в самом начале вашей страницы:

<f:metadata>
     <f:event type="preRenderView" listener="#{sesija.permission()}"/>
</f:metadata>

Для этого нужно вызвать JSF ManagedBean с именем объекта sesija перед рендерингом страницы и проверить, выполнены ли созданные вами в указанном методе правила.

Надеюсь, вы найдете это полезным,

Спасибо.

...