No projeto da web atual, muitas situações são que as mesmas informações da conta podem ser conectadas em diferentes portais de login desta vez, por isso não será tão bonita.
Leitura recomendada:
Implementação de restrições de login de vários usuários Java
Agora existem duas soluções:
1. Salve as informações de login do usuário com um campo em um sinalizador. Cada vez que o login é bem -sucedido, está marcado 1 e o login é marcado 0. Quando está marcado 1, não é permitido fazer login.
2. Salve as informações de login do usuário no escopo interno do aplicativo e, em seguida, use o ouvinte da sessão para monitorar o status de login de cada usuário logado.
Obviamente, o primeiro método requer operação do banco de dados toda vez que você efetuar login, o que adiciona uma sobrecarga desnecessária de desempenho. Além disso, se o computador desligar de repente durante o estado de login, você nunca poderá fazer login e a usabilidade é relativamente baixa.
Mas o segundo método é diferente, é altamente operável e conveniente manter as informações de todos os usuários on -line.
Em seguida, apresentaremos principalmente a implementação específica do segundo método:
1. No método de login para processar o login, primeiro consulte o banco de dados para verificar se o usuário existe. Se houver, determine se a conta de login foi bloqueada. Em seguida, retire todas as informações de login do objeto de escopo interno do aplicativo para verificar se a conta de nome de usuário foi conectada. Se ele estiver conectado, será um prompt amigável. Caso contrário, isso significa que você pode fazer login e salvar as informações de login no aplicativo na forma de um par de valores-chave.
O código é o seguinte:
// Ação deve ser adicionada a cada método de acesso antes da configuração zero, caso contrário, 404 @Action (value = "Login", Results = {@Result (name = "index", location = "index.jsp"),}) public string Login () lança excepção {try {resulta uservice.Login (user.getFuUSEnMe; if (resultado! = null) {if (resultado.getfustatus ()! = null && result.getfustatus () == 0) {super.setRequestattr (constant.Message, "Desculpe, este usuário foi bloqueado!"); retornar "erro"; } Mapa <string, string> loginUserMap = (map <string, string>) super.getApplicationAttr (constant.login_user_map); boolean isexist = false; String sessionId = super.getSessionId (false); if (loginUserMap == null) {loginUserMap = new Hashmap <string, string> (); } para (Nome de usuário da String: LoginUserMap.KeySet ()) {// julga se as informações do usuário logadas foram salvas ou se o mesmo usuário fez login repetidamente, o login é permitido se (! Username.equals (Result.getfuusername) || LoginUserMap.contalue (IdId) (sesst.getfuusername) || LoginUserMap.contalue (IdId) (sesst.getfuusername) || LoginUserMap.Contansvalue (IdId) {Setts) {continue) {continua) {continua) {continua)). } isExist = true; quebrar; } if (isexist) {super.setRequestattr (constant.message, "Desculpe, o usuário está conectado!"); retornar "erro"; } else {loginUserMap.put (resultado.getfuUserName (), sessionId); } // Login Super.SetSessionAttr (constant.login_user, resultado); super.setApplicationAttr (constant.login_user_map, loginUserMap); Logger.info (resultado.getfuUserName () + "Login com sucesso!"); // Se FromUrl tiver um valor na sessão, pule para a string da página deurl = (string) super.getSessionAttr (constant.from_url); if (Fromurl! = null) {super.setsessionAtTtr (constant.from_url, null); super.getResponse (). Sendredirect (Fromurl.toString ()); retornar nulo; } retornar "índice"; }} catch (Exceção e) {e.printStackTrace (); logger.info ("Login falhou:"+e.getMessage ()); } super.setRequestattr ("mensagem", "erro"); retornar "erro"; }2. Depois que o portal de login é processado, considerando que a sessão termina, o usuário de login correspondente também deve sair do login de acordo. Podemos escrever um ouvinte de sessão. Quando a sessão é destruída, registramos o usuário logado, ou seja, remove-o do aplicativo. Isso significa que o usuário está offline.
O código é o seguinte:
pacote com.facelook.util; importar java.util.map; importar javax.servlet.http.httpSessionEvent; importar javax.servlet.http.httpSessionListener; importar org.apache.log4j.logger; importar com.facelook.entity.User; classe pública sessionListener implementa httpsessionListener {private logger logger = logger.getLogger (this.getclass ()); @Override public void sessionCreated (evento httpSessionEvent) {} @Override public void sessionDestroyed (evento httpsessionEvent) {// limpe os pares de valores de chave salvos no LoginUserMap quando a sessão é destruída usuário do usuário = (usuário) Event.getSession (). if (user! = null) {map <string, string> loginUserMap = (map <string, string>) event.getSession (). getServletContext (). getAttribute ("LoginUserMap"); loginUserMap.remove (user.getfuUserName ()); event.getSession (). getServletContext (). SetAttribute ("LoginUserMap", LoginUserMap); }}}A configuração em web.xml é a seguinte:
<!-Sessão ouvinte-> <Ilvier> <lister-class> com.facelook.util.sessionListener </lirer-class> </lister>
3. Além disso, há outro problema. Se o usuário conectado de repente fechar o navegador ou a página sem clicar no botão Logout. Em seguida, você pode usar o evento antes do UNOLLOAD para disparar quando o navegador atualizar ou fechar.
// Eventos $ (janela) .bind ('antes do UNLOAD', function () {$ .ajax ({url: "$ {ctx} /system/user/user !logout.action", type: "post", sucesso: function () {alert ("você possui logouged out");});););No entanto, se alguns motivos objetivos, como o computador desligado repentinamente, reinicialização automática etc., eles não podem ser evitados, para que você possa apenas aguardar a sessão do servidor sessão para redefinir antes de poder fazer login novamente.
A menos que seja um módulo que conta todo o pessoal on -line, o administrador gerencia o status de login e logout do pessoal on -line e destrói diretamente os usuários conectados aos usuários com problemas.
Em seguida, vamos apresentar brevemente o gerenciamento de módulos de pessoal on -line:
1. Primeiro, é necessário um ouvinte de sessão para monitorar todas as respostas, crie situações. Nesse momento, toda vez que uma sessão é criada, a contagem+1 pode ser contada e, em seguida, a contagem-1 é destruída. Além disso, é necessário um ouvinte de servletContext para monitorar o ciclo de vida do aplicativo da web, obter o objeto ServletContext e, em seguida, contar o número total de pessoal on -line e armazená -lo;
O código específico é o seguinte:
pacote com.facelook.util; importar java.util.map; importar javax.servlet.servletContext; importar javax.servlet.servletContextevent; importar javax.servlet.servletContextListener; importar javax.servlet.http.httpSessionEvent; importar javax.servlet.http.httpSessionListener; importar javax.servlet.http.httpSessionListener; importar org.apache.log4j.logger; importar com.facelook.entity.User; classe pública sessionListener implementa httpSessionListener, servletContextListener {private int count; ServletContext privado servletContext = null; public sessionListener () {count = 0; } private logger logger = logger.getLogger (this.getClass ()); @Override public void sessionCreated (evento httpSessionEvent) {count ++; setContext (evento); Logger.info ("************ A sessão http é criada ... ******************"); } @Override public void sessionDestroyed (evento httpSessionEvent) {// limpe os pares de valor da chave salvos no LoginUserMap quando a sessão é destruída usuário do usuário = (usuário) event.getSession (). GetAttribute ("loginUser"); if (user! = null) {map <string, string> loginUserMap = (map <string, string>) event.getSession (). getServletContext (). getAttribute ("LoginUserMap"); loginUserMap.remove (user.getfuUserName ()); event.getSession (). getServletContext (). SetAttribute ("LoginUserMap", LoginUserMap); } contar--; setContext (evento); Logger.info ("************ A sessão http é destruída ... ***********************"); } public void setContext (httpSessionEvent httpSessionEvent) {httpSessionEvent.getSession (). } @Override public void contextDestroy (servletContextevent servletContextevent) {this.servletContext = null; logger.info ("************ O contexto do servlet é destruído ... *********************"); } @Override public void contextinitialized (servletContextevent servletContextevent) {this.servletContext = servletContextevent.getServletContext (); Logger.info ("************ O contexto do servlet é inicializado ... ******************"); }}2. Crie um módulo para gerenciar usuários on -line na UserAction e suportar a função de saída forçada;
/ ** * logout * @return * @throws servletexception * @throws ioexception */ public string logout () lança servleTexception, ioexception {try {map <string, string> loginUserMap = (map <string, string>) super.getApplicationAttr (constant.Login_USAP_MAP); Usuário do usuário = (usuário) super.getSessionAtTr (constant.login_user); super.removeattribute (constant.login_user_map); loginUserMap.remove (user.getfuUserName ()); super.setApplicationAttr (constant.login_user_map, loginUserMap); Logger.info ("Login Login bem -sucedido!"); } catch (Exceção e) {e.printStackTrace (); logger.error ("Login falhou:"+e.getMessage ()); } retornar entrada; } / *** Gerenciamento de usuário on -line* @return* / public String LoginManager () {return Success; } / *** Força a saída de outros usuários* @return* / public String LogOutOther () {try {string userName = servletActionContext.getRequest (). GetParameter ("nome de usuário"); Mapa <string, string> loginUserMap = (map <string, string>) super.getApplicationAttr (constant.login_user_map); if (nome de usuário! = null && loginUserMap.containsKey (nome de usuário)) {loginUserMap.remove (nome de usuário); super.setApplicationAttr (constant.login_user_map, loginUserMap); }} catch (Exceção e) {e.printStackTrace (); Logger.Info ("Saída à força falhou:"+e.getMessage ()); } retornar nulo; }3. Carregue a lista de usuários on -line na página de gerenciamento;
Depois que o método correspondente é definido, adicione uma lista on -line à página de gerenciamento correspondente, como segue:
<%@página import = "java.util.map"%> <%@página import = "java.util.map.entry"%> <%@page idioma = "java" pageEncoding = "utf-8"%> <%@incluir file = "/Common/taglib.jsp"%> <! Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content = "text/html; charset = utf-8"/> <title> Bem-vindo ao FACELOOK </ititure> < %@ incluir file = "/Common/Resource.jsp" %> <script type = "text/javascript"> <!-// eventos $ (janela) .bind ('Antes donload', function () {. URL: "$ {ctx} /system/user/user! função logout (nome de usuário) {if (nome de usuário == "$ {sessionscope.loginuser.fuusername}") {alert ("logout da sua conta!"); retornar; } $ .AJAX ({url: "$ {ctx} /system/user/user!Logouther.action?username ="+nome de usuário, tipo: "post", success: function () {($ ("#". $ ("count"). html (contagem-1); } //-> </script> </ad Head> <body> <%@ incluir file = "/Common/header.jsp"%> <div id = "main"> <%@ incluir file = "/Common/lefter.jsp"%> <div> <dr> <h2> login list </h2> <%map <tring, (string> map = (map> <div> out.println ("Atualmente, existem <font id = 'count'>"+map.size ()+"</font> usuários online !!"); %> <table> <%para (entrada <string, string> m: map.entrySet ()) {%> <tr id dr = "tr <%= m.getKey ()%>"> <td> <%= m.getKey ()%> </td> <td> <a href = "javascript: logout ('<%= M.) <%}%> </tabela> </div> </div> </div> <%@ incluir file = "/Common/Footer.jsp"%> <%@ incluir file = "/Common/message.jsp"%> </body> </html>OK, inicie o projeto de implantação, inicie o serviço e digite o módulo de gerenciamento de usuários on -line. O efeito simples é o seguinte:
Deve -se notar que o usuário atual de login não tem permissão para forçar o logon de suas informações de login.
Dessa forma, os casos de impedir que vários usuários efetuem login podem basicamente ser realizados!
O exposto acima é a solução perfeita para o desenvolvimento da web do Java para impedir que vários usuários registrem repetidamente. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!