Каков метод для изящной обработки времени ожидания сеанса? - PullRequest
1 голос
/ 17 октября 2011

Проблема: я нахожусь на какой-то странице своего заявления и ухожу на некоторое время.Возвращаясь и нажимая на ссылку, я получаю сообщение «Невозможно восстановить viewID».То же самое при обновлении.

Я могу начать новый сеанс, но мне нужно вручную отредактировать URL-адрес следующим образом:

Окно активного адреса:

http://localhost:8080/myapp/index.xhtml?windowId=e9d

в

http://localhost:8080/myapp/index.xhtml

Затем устанавливается новый сеанс, и пользователь должен снова войти в систему, что я и хочу.

При исследовании того, как с этим бороться, я вижу много «решений»."которые в основном поддерживают сессию, используя клиентский Javascript для периодической отправки запросов, чтобы поддерживать сессию.Лично я не считаю это желательным решением.

То, что я хочу, это когда время сеанса истекает, все последующие запросы к любой непубличной странице должны быть направлены на index.xhtml.Ссылки на страницы, которые не требуют входа, должны проходить через новый объект сеанса.Желательно, чтобы это выполнялось с использованием только средств, определенных в JSF 2, но я не против написать фильтр сервлетов, если это то, что нужно.

Может кто-нибудь предоставить ссылку на инструкции, которые я пропустил?

1 Ответ

4 голосов
/ 17 октября 2011

Сделай это за Filter, да. Вы можете использовать HttpServletRequest#getRequestedSessionId(), чтобы проверить, отправил ли клиент куки-файл сеанса, и HttpServletRequest#isRequestedSessionIdValid(), чтобы проверить, является ли он все еще действительным (т.е. сеанс не истек в на стороне сервера):

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

    if (req.getRequestedSessionId() != null && !req.isRequestedSessionIdValid()) {
        res.sendRedirect(req.getContextPath() + "/index.xhtml");
    } else {
        chain.doFilter(request, response);
    }
}

Но возникает еще один вопрос: как именно вы фильтруете вошедших в систему пользователей? Если сеанс истек, то пользователь больше не вошел в систему, верно? Вместо этого вы также можете просто проверить в фильтре, вошел ли пользователь в систему или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...