управление сессиями Java - PullRequest
       22

управление сессиями Java

3 голосов
/ 02 декабря 2009

Я работаю над небольшим веб-приложением для развлечения, в настоящее время использую только сервлеты Java. У меня есть две страницы, test1 и test2. На данный момент я создаю новую сессию в test1 следующим образом:

    HttpSession session = request.getSession(true);
    if (session.isNew() == false) {
        session.invalidate();
        session = request.getSession (true);
    }

В test2 я получаю сессию так:

    HttpSession session = request.getSession(false);
    if (session == null) {
        throw new ServletException ("No session.");
    }

Так что проблема в том, что, если я сначала иду на test2, я всегда получаю действительный сеанс, потому что браузер создает его. Я хочу ограничить поток от test1 до test2, чтобы мне сначала нужно было перейти к test1. Мой план состоит в том, чтобы в конечном итоге создать страницу входа, которая создаст сеанс, но проблема, с которой я здесь сталкиваюсь, все равно будет присутствовать.

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

Спасибо!

Ответы [ 3 ]

8 голосов
/ 03 декабря 2009

Это не имеет смысла. Забудьте request.getSession(boolean). Просто получите сеанс по request.getSession() и никогда не беспокойтесь о недействительности / валидности.

Если вы хотите передать данные через атрибуты сеанса, просто введите test1:

request.getSession().setAttribute("test", "foo");

и test2 (что, конечно, запрашивается в том же сеансе после test1):

String test = (String) request.getSession().getAttribute("test"); // Returns "foo".

Редактировать: Что касается использования сеанса для проверки входа в систему User, просто сделайте что-то похожее на код входа в систему:

User user = userDAO.find(username, password);
if (user != null) {
    request.getSession().setAttribute("user", user);
} else {
    // Show error?
}

и затем в Filter, который отображается на url-pattern, который представляет ограниченную область, просто проверьте, присутствует ли User или нет:

if (((HttpServletRequest) request).getSession().getAttribute("user") != null) {
    chain.doFilter(request, response); // Just continue.
} else {
    ((HttpServletResponse) response).sendRedirect("login"); // Not logged-in, redirect to login page.
}

и когда вы выходите из системы, вы просто удаляете User из сеанса:

request.getSession().removeAttribute("user");

// Or, more drastically:
request.getSession().invalidate();

В качестве альтернативы вы также можете посмотреть декларативную Управляемую контейнером безопасность с помощью нескольких простых записей в web.xml и server.xml. Таким образом, вам не нужно возиться с логикой входа / фильтрации самостоятельно.

3 голосов
/ 03 декабря 2009

Сессия - это просто корзина, которая начинается пустой. Понятие того, аутентифицирован ли пользователь или нет, отличается от того, имеет ли пользователь сеанс или нет.

Java EE и спецификации сервлета обрабатывают все входящие в вас материалы, перенаправляя на страницы входа и так далее Ознакомьтесь со встроенными возможностями Java EE. Может быть, начать здесь .

3 голосов
/ 03 декабря 2009

Если вы хотите ограничить поток, чтобы убедиться, что test1 предшествует test2, сделайте так, чтобы test1 поместил значение атрибута в сеанс, который говорит, что он был посещен, и проверьте это значение атрибута в test2. Если значение отсутствует, сделайте перенаправление test2 на test1.

В test1 сделайте это:

HttpSession session = request.getSession();
session.setAttribute("test1",true);

Затем в test2 вы можете сделать это:

HttpSession session = request.getSession();
if (session.getAttribute("test1") == null){
    response.sendRedirect("test1");
    return;
}
...