Como uma estrela em ascensão, o JSP pode ocupar uma determinada posição no ambiente de programação de servidores, o que está intimamente relacionado ao seu bom suporte a uma série de padrões da indústria. A sessão é uma das infraestruturas que ela fornece. Como programador, você pode implementar facilmente o gerenciamento simples de usuários baseado em sessão, sem se preocupar com como ele é implementado no cliente. Existem algumas maneiras diferentes de lidar com usuários online atualmente.
Uma é que a atualização da página é controlada pelo usuário e o servidor controla um tempo limite de 30 minutos. Após o tempo acabar, o usuário será expulso se não houver ação. A vantagem desse método é que se o usuário esquecer de fazer logout, ele pode impedir que outros realizem operações maliciosas. A desvantagem é que se você estiver fazendo algo que leva muito tempo e ultrapassa esse limite de tempo, pode ser necessário fazer login novamente ao enviar. Se a superfície da folha original for forçada a falhar novamente, você poderá perder o trabalho realizado. Do ponto de vista da implementação, este é o mais simples e o lado do servidor implementa esse modo por padrão.
Outra forma é que o site adote uma estrutura de frame, e haja um Frame ou iframe oculto que é constantemente atualizado, para que você nunca seja expulso. Porém, para determinar se você está online, o servidor precisa definir um. tempo de atordoamento. Se você exceder esse tempo de atordoamento, se você não atualizar outras páginas, exceto esta página atualizada automaticamente, será considerado que você não está mais online. Um exemplo típico dessa abordagem é xici.net. Sua vantagem é que ele pode usar atualização contínua para implementar algumas funções semelhantes a push de servidor, como o envio de mensagens entre internautas.
Não importa qual modo seja usado, algum trabalho adicional precisa ser feito para navegar por todos os usuários online no momento. Não há API para obter a lista de sessões na API do Servlet.
O que pode ser usado é o Listener. As especificações do Servlet 2.2 e 2.3 são um pouco diferentes aqui. HttpSessionBindingListener na versão 2.2 pode implementar uma classe que notifica quando o atributo em uma sessão HTTP é alterado.
HttpSessionAttributeListener também foi introduzido em 2.3. Como o ambiente que estou usando é Visual Age para Java 4 e servidor JRun 3.1,eles
não suportam diretamente a programação do Servlet 2.3. Aqui eu uso HttpSessionBindingListener.
implementar a interface HttpSessionBindingListener. Esta interface possui dois métodos:
public void valueBound (evento HttpSessionBindingEvent)
public void valueUnbound (evento HttpSessionBindingEvent)
Quando você executa Session.addAttribute (String, Object), se você adicionou uma classe que implementa a interface HttpSessionBindingListener como um atributo, a sessão notificará sua classe e chame seu método valueBound. Pelo contrário, o método Session.removeAttribute corresponde ao método valueUndound.
public class HttpSessionBinding implementa javax.servlet.http.HttpSessionBindingListener
{
ServletContext application = null;
public HttpSessionBinding(ServletContext application)
{
super();
if (application ==null)
throw new IllegalArgumentException("Aplicativo nulo não é aceito.")
; .application = aplicação;
}
public void valueBound(javax.servlet.http.HttpSessionBindingEvent e)
{
Vector activeSessions =(
Vetor) application.getAttribute("activeSessions"
)
;
}
JDBCUser sessionUser = (JDBCUser)e.getSession().getAttribute("user");
if (sessionUser != null)
{
activeSessions.add(e.getSession()
}
application.setAttribute("activeSessions",activeSessions) ;
}
public void valueUnbound(javax.servlet.http.HttpSessionBindingEvent e)
{
JDBCUser
sessionUser
= (JDBCUser)e.getSession().getAttribute("user")
; .getAttribute("activeSessions");
if
(activeSessions != null)
{
activeSessions.remove(
e.getSession(
)
.getId()
)
;
Classe é uma classe de usuário arbitrária. Ao realizar o login do usuário, adicione a classe User e a classe HttpSessionBinding à Sessão.
Desta forma, toda vez que um usuário efetuar login, um registro será adicionado ao vetor de atributo “activeSessions” da aplicação. Sempre que a sessão expira, valueUnbound é acionado e a sessão que atingirá o tempo limite é excluída deste vetor
public void login()
throws ACLException,SQLException,IOException
{
/* get JDBC User Class */
if (user != null )
{
logout(
);
}
{
//se
o tempo de sessão expirou ou o usuário não fez login, salve o URL de destino temporariamente.
=null) || (this.request.getParameter("password")==null) )
{
throw
new ACLException("Insira um nome de usuário e senha válidos."
)
;
.request.getParameter("userID"),
this.request.getParameter("
senha") );
user.touchLoginTime
();
,new HttpSessionBinding (application));
Ao
efetuar login,adicione
a classe de finalidade User e BindingNotofy à sessão. Ao efetuar logout, você deve excluir ativamente a sessão no vetor activeSessions.
public void logout()
throws SQLException,ACLException
{
if (this.user == null && this.session.getAttribute("user")==null)
{
return ;
}
Vetor activeSessions = (Vetor) this.application.getAttribute("activeSessions");
if
(activeSessions
!= null)
{
activeSessions.remove(this.session)
;
util.Enumeration e = this.session.getAttributeNames();
while (e.hasMoreElements())
{
String
s
= (String)e.nextElement()
;
);
this.user = null
}
Essas duas funções estão localizadas em uma classe HttpSessionManager. Esta classe refere-se ao objeto global do aplicativo em jsp. O outro código desta classe não tem nada a ver com este artigo e é bastante longo, então não vou publicá-lo.
Vamos dar uma olhada em como usá-lo em JSP.
Suponha que um formulário de login seja enviado para doLogin.jsp e que o formulário contenha os campos Nome de usuário e senha. Trecho:
<%
HttpSessionManagerhsm
= new HttpSessionManager(application,request,response);
try
{
hsm.login
(
)
;
.");
return;
}
catch (InvalidPasswordException e2)
{
response.sendRedirect("InsufficientPrivilege.jsp?detail=Invalid%20Password");
return;
}
catch (Exception e3)
{
%> Erro:<%=e3. toString( ) %><br>
Pressione <a href="login.jsp">Aqui</a> para fazer login novamente
<% return
}
response.sendRedirect("
index.jsp")
;
tenho agora Como obter uma lista de usuários atualmente online.
<body bgcolor="#FFFFFF">
<table cellpacing="0" cellpadding="0" width="100%">
<tr >
<td style="width:24px">SessionId
</td>
<td style= "largura:80px" >Usuário
</td>
<td style="largura:80px" >Tempo de login
</td>
<td style="largura:80px" >Hora do último acesso
</td>
</tr>
<%
Vetor activeSessions=
(Vetor) application.getAttribute("activeSessions");
if (activeSessions
== null)
{
activeSessions = new Vector()
;
;
while (it.hasNext())
{
HttpSession sess = (HttpSession)it.next(
)
;
():"Nenhum";
%>
<tr>
<td nowrap=''><%= sess.getId() %></td>
<td nowrap=''><%= userId %></td>
<td nowrap=''>
<%= BeaconDate.getInstance( new Java.util.Date(sess.getCreationTime())).getDateTimeString()%></td>
<td class="<%= stl %>3 " nowrap=''>
<%= BeaconDate.getInstance( new java.util.Date(sess.getLastAccessedTime())).getDateTimeString()%></td>
</tr>
<%
}
%>
</table>
</body>
O código acima recupera activeSessions do aplicativo e exibe o horário específico. A classe BeaconDate é considerada uma classe de tempo formatada.
Desta forma, obtemos uma estrutura para visualizar a lista de usuários online. Quanto à paginação de listas de usuários online e outras funções, elas são irrelevantes para este artigo e não serão discutidas.
Este é um exemplo de modelo sem atualização que depende do mecanismo de tempo limite da sessão. Meu colega sonymusic destacou que muitas vezes isso pode não ser confiável devido às ideias diferentes de cada fabricante. Considerando este requisito, é necessário determinar se o tempo desde a última utilização pelo utilizador actual excede um valor de tempo predeterminado quando cada superfície de folha é actualizada. Isso é essencialmente implementar você mesmo o tempo limite da sessão. Se precisar implementar um modelo de atualização, você deverá usar este método para julgar a atualização para cada superfície de folha.