Это неправильно игнорировать ViewExpiredException?

Неделю назад я изучал ViewExpiredException и прочитал несколько вещей об этом.

Моя проблема, которая в некоторых случаях, я хотел бы игнорировать ViewExpiredException, Это ситуации, которые не нуждаются в "сеансе", и мои Бины @RequestScoped, Как пример, страницы login.xhtml, register.xhtml а также passwordRecovery.xhtml,

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

Итак, мое решение до сих пор заключается в создании ExceptionHandler игнорировать эти исключения:

@Override
public void handle() throws FacesException {
    for (Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); i.hasNext();) {
        ExceptionQueuedEvent event = i.next();
        ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource();
        Throwable t = context.getException();
        // just remove the exception from queue
        if (t instanceof ViewExpiredException) {
            i.remove();
        }
    }
    getWrapped().handle();
}

Затем я создал фильтр, чтобы проверить, вошел ли пользователь в систему, если нет, то перенаправлен на страницу входа (этот фильтр применяет только страницы, требующие аутентификации):

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
        throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    if (!loginManagedBean.isLogged()) {
        String pathLogin = request.getContextPath() + "/" + LOGIN_VIEW;
        if (isAJAXRequest(request)) {
            response.setContentType("text/xml");
            response.getWriter()
                    .append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
                    .printf("<partial-response><redirect url=\"%s\"></redirect></partial-response>", pathLogin);
            return;
        }

        pathLogin += "?source=" + request.getServletPath();

        response.sendRedirect(pathLogin);
        return;
    }

    chain.doFilter(request, response);
}

Таким образом, когда сеанс истекает, не влияет на пользовательский опыт на страницах входа и регистрации. А на страницах желаю сессии, обрабатываются фильтром.

Это было бы хорошим решением? Есть ли риск для безопасности, чтобы игнорировать ViewExpiredException в ExceptionHandler?

1 ответ

Решение

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

Просто сделайте именно эти взгляды лицами без гражданства.

<f:view transient="true">
    ...
</f:view>

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

Смотрите также:

Другие вопросы по тегам