Будучи восходящей звездой, JSP может занять определенную позицию в среде серверного программирования, что тесно связано с хорошей поддержкой ряда отраслевых стандартов. Сессия — это одна из инфраструктур, которые он предоставляет. Как программист, вы можете легко реализовать простое управление пользователями на основе сеансов, не беспокоясь о том, как оно реализовано на клиенте. В наши дни существует несколько различных способов взаимодействия с онлайн-пользователями.
Во-первых, обновление страницы контролируется пользователем, а сервер управляет тайм-аутом, например 30 минут. По истечении времени пользователь будет исключен, если не предпримет никаких действий. Преимущество этого метода в том, что если пользователь забудет выйти из системы, это может предотвратить злонамеренные операции других лиц. Недостаток заключается в том, что если вы делаете что-то, что занимает много времени и превышает этот срок, вам, возможно, придется снова войти в систему при отправке. Если исходная поверхность листа снова выйдет из строя, вы можете потерять проделанную работу. С точки зрения реализации это самый простой вариант, и серверная часть реализует этот режим по умолчанию.
Другой способ заключается в том, что сайт использует фреймовую структуру и имеет фрейм или скрытый iframe, который постоянно обновляется, поэтому вас никогда не выгонят. Однако, чтобы определить, находитесь ли вы в сети, серверу необходимо установить фрейм. Если вы превысите это время, если вы не обновите другие страницы, кроме этой автоматически обновляемой страницы, будет считаться, что вы больше не в сети. Типичным примером такого подхода является xici.net. Его преимущество заключается в том, что он может использовать непрерывное обновление для реализации некоторых функций, подобных серверным, таких как отправка сообщений между пользователями сети.
Независимо от того, какой режим используется, необходимо выполнить некоторую дополнительную работу, чтобы просмотреть всех пользователей, находящихся в сети в данный момент. В API сервлетов нет API для получения списка сеансов.
Что можно использовать, так это Listener. Спецификации сервлетов 2.2 и 2.3 здесь немного отличаются. HttpSessionBindingListener в версии 2.2 может реализовать класс, который уведомляет вас об изменении атрибута в HTTPSession. HttpSessionAttributeListener также был представлен в версии 2.3. Поскольку я использую среду Visual Age для Java 4 и сервера JRun 3.1, они напрямую не поддерживают программирование Servlet 2.3. Здесь я использую HttpSessionBindingListener,
включая создание нового класса. реализовать интерфейс HttpSessionBindingListener. Этот интерфейс имеет два метода:
public void valueBound(событие HttpSessionBindingEvent)
public void valueUnbound(событие HttpSessionBindingEvent).
При выполнении Session.addAttribute(String,Object), если вы добавили класс, реализующий интерфейс HttpSessionBindingListener в качестве атрибута, Session уведомит об этом. свой класс и вызовите метод valueBound. Напротив, метод Session.removeAttribute соответствует методу valueUndound.
общедоступный класс HttpSessionBinding реализует javax.servlet.http.HttpSessionBindingListener { Приложение ServletContext = null; public HttpSessionBinding (приложение ServletContext) { супер(); если (приложение == ноль) throw new IllegalArgumentException("Нулевое приложение не принято."); это.приложение = приложение; } public void valueBound(javax.servlet.http.HttpSessionBindingEvent e) { Вектор activeSessions = (Вектор) application.getAttribute("activeSessions"); если (активные сеансы == ноль) { activeSessions = новый вектор(); } JDBCUser sessionUser = (JDBCUser)e.getSession().getAttribute("пользователь"); если (sessionUser != ноль) { activeSessions.add(e.getSession()); } application.setAttribute("activeSessions",activeSessions); } public void valueUnbound(javax.servlet.http.HttpSessionBindingEvent e) { JDBCUser sessionUser = (JDBCUser)e.getSession().getAttribute("пользователь"); если (sessionUser == ноль) { Вектор activeSessions = (Вектор) application.getAttribute("activeSessions"); если (activeSessions != ноль) { activeSessions.remove(e.getSession().getId()); application.setAttribute("activeSessions",activeSessions); } } } } |
Предположим, что класс JDBCUser является произвольным классом User. При выполнении входа пользователя добавьте в сеанс класс User и класс HttpSessionBinding.
Таким образом, каждый раз, когда пользователь входит в систему, запись будет добавляться к вектору атрибута «activeSessions» в приложении. Каждый раз, когда время ожидания сеанса истекает, срабатывает valueUnbound, и сеанс, время ожидания которого истекает, удаляется из этого вектора.
публичный недействительный вход в систему() выдает ACLException,SQLException,IOException { /* получаем пользовательский класс JDBC */ если (пользователь != ноль) { выход из системы(); } { // если время сеанса истекло или пользователь не вошел в систему, временно сохраните целевой URL. JDBCUserFactory uf = новый JDBCUserFactory(); if ( (this.request.getParameter("userID")==null) || (this.request.getParameter("password")==null)) { throw new ACLException("Пожалуйста, введите допустимое имя пользователя и пароль."); } Пользователь JDBCUser = (JDBCUser) uf.UserLogin( this.request.getParameter("userID"), this.request.getParameter("пароль") ); user.touchLoginTime(); this.session.setAttribute("пользователь",пользователь); this.session.setAttribute("BindingNotify",new HttpSessionBinding(application)); } } |
При входе в систему добавьте в сеанс пользователя и целевой класс BindingNotofy. При выходе из системы необходимо активно удалить сеанс в векторе activeSessions. |
|
Эти две функции расположены в классе HttpSessionManager. Этот класс ссылается на глобальный объект приложения в jsp. Другой код этого класса не имеет отношения к этой статье и довольно длинный, поэтому выкладывать его не буду. Давайте посмотрим, как использовать его в JSP. Предположим, что форма входа отправлена в doLogin.jsp и содержит поля имени пользователя и пароля. Выдержки из: |
|
Давайте посмотрим, как мы получаем список пользователей, которые в данный момент находятся онлайн. |
|
Приведенный выше код извлекает активные сеансы из приложения и отображает конкретное время. Предполагается, что класс BeaconDate является форматированным классом времени. Таким образом, мы получаем основу для просмотра списка онлайн-пользователей. Что касается пейджинга онлайн-списков пользователей и других функций, они не имеют отношения к этой статье и обсуждаться не будут. Это пример модели без обновления, основанной на механизме тайм-аута сеанса. Мой коллега из Sonymusic отметил, что во многих случаях это может быть ненадежно из-за разных идей каждого производителя. Учитывая это требование, необходимо определить, превышает ли время с момента последнего использования текущим пользователем заданное значение времени, когда обновляется каждая листовая поверхность. По сути, это реализация тайм-аута сеанса самостоятельно. Если вам нужно реализовать модель обновления, вы должны использовать этот метод оценки обновления для каждой конечной поверхности. |