как различить новый вход в систему (новый сеанс) и время ожидания сеанса - PullRequest
0 голосов
/ 18 января 2012

Может ли кто-нибудь дать мне знать, как различать новый вход в систему (новый сеанс) и время ожидания сеанса.
Только при входе в систему: пользователь должен пройти проверку подлинности и перенаправиться на сервлет для загрузки сведений о пользователе (для других пользователей screnariosне должен быть перенаправлен на сервлет), а по тайм-ауту пользователь должен быть перенаправлен на страницу тайм-аута.
Чтобы идентифицировать новый сеанс (пользователь не вошел в систему):
- Атрибуты сеанса не могут использоваться, так как сеанс становится пустымon timeout.
- Настройка файлов cookie для управления сеансом не работает.Файлы cookie удаляются для текущего сеанса

Cookie cookie = new Cookie("activeSession", null);
cookie.setMaxAge(0);
cookie.setPath("/");
cookie.setValue("");
httpServletResponse.addCookie(cookie);
getCookieValue(httpServletRequest , "activeSession"); returns null
public static String getCookieValue(HttpServletRequest request, String name) {
    Cookie[] cookies = request.getCookies();
    if (cookies != null) {
        for (Cookie cookie : cookies) {
            if (cookie != null && name.equals(cookie.getName())) {
                return cookie.getValue();
            }
        }
    }
    return null;
}

После выхода из системы или тайм-аута (сеанс недействителен), когда пользователь входит в систему и создает новый сеанс.Файлы cookie, которые были удалены в предыдущих сеансах, снова появляются с предустановленными значениями.

 getCookieValue(httpServletRequest , "activeSession") returns a value; 

Если я использую описанный ниже подход, он работает для 1-й попытки входа в систему.После истечения времени ожидания первого сеанса входа в систему фильтр перенаправляется на страницу времени ожидания.Фактическая проблема возникает, когда пользователь обращается к приложению в том же окне после истечения времени ожидания.

public void doFilter(ServletRequest request, ServletResponse response,FilterChain   filterChain) throws IOException,
{   if ((request instanceof HttpServletRequest)
            && (response instanceof HttpServletResponse)) {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;

HttpServletResponse httpServletResponse = (HttpServletResponse) response;

//Check for a new login 
if (httpServletRequest.getSession(false) == null  && httpServletRequest.getRequestedSessionId()==null)
{
// Create a new session
httpServletRequest.getSession();
//Redirect to servlet on 1 st login to fetch details from DB
httpRequest.getRequestDispatcher("/loginServlet").forward(request,response);
}else{

//validate active or timedout sessions. 
boolean isSessionValid = (httpServletRequest.getRequestedSessionId() != null) && !httpServletRequest.isRequestedSessionIdValid();

if(isSessionValid)
{
httpServletResponse.sendRedirect(getTimeoutPage());
}
}
}
filterChain.doFilter(request, response);
}

Поэтому детали не извлекаются из БД и страница загружается неправильно.

Браузер: IE 8 Сервер: сервер Weblogic

1 Ответ

2 голосов
/ 18 января 2012

Ваш подход к файлам cookie не нужен и технически недействителен.Максимальный возраст 0 заставляет его истечь сразу после обработки ответа.Но в любом случае вам не нужен дополнительный файл cookie.HttpSession уже сам по себе поддерживается cookie, а Servlet API уже предлагает методы для проверки того и другого.Просто сохраните зарегистрированного пользователя как атрибут HttpSession (который, в свою очередь, может быть управляемым компонентом JSF в области сеанса).

Следующий пример должен работать, предполагая, что вы сохранили зарегистрированныйпользователя как свойство сеанса управляемый JSF-компонент с именем управляемого компонента "auth".

public void doFilter(ServletRequest request, ServletResponse response, FilterChain   chain) throws ServletException, IOException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;
    Authenticator auth = (Authenticator) req.getSession().getAttribute("auth");

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