2009-12-02 2 views
3

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

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. Мой план состоит в том, чтобы в конечном итоге создать страницу входа в систему, которая создаст сеанс, но проблема, которую я вижу здесь, по-прежнему будет присутствовать.

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

Спасибо!

+0

Возможно, я использую сессию здесь неправильно. Я пытаюсь ограничить поток страниц и позже создаю страницу входа, которая, я думаю, приведет к аннулированию текущего сеанса и созданию нового? – Casey

ответ

8

Это не имеет никакого смысла. Забудьте 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(); 

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

+0

Я не смотрю только на передачу данных туда и обратно, но использую его как механизм безопасности. Возможно, я неправильно использую сессию? – Casey

+0

Я обновил ответ соответственно. – BalusC

+0

Спасибо. Это то, что я пытаюсь сделать. – Casey

3

Если вы хотите ограничить поток, чтобы убедиться, что 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; 
} 
3

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

Java EE и спецификации сервлета обрабатывают все элементы входа для вас, перенаправляют на страницы входа и так далее. Прочитайте встроенные возможности Java EE. Возможно начало here.

+0

Спасибо за ссылку, я определенно буду читать об этом. – Casey

Смежные вопросы