Fiquei ocioso recentemente e não tenho projetos a fazer, então resolvi alguns problemas comuns que encontrei no meu trabalho diário. Primeiro de tudo, pensei no problema das restrições de login de vários usuários. Deixe -me pensar sobre esse assunto.
Leituras relacionadas:
Solução Perfeita de Desenvolvimento da Web Java para impedir que vários usuários sejam repetidos de login
1. Cena de design
1) Um usuário não tem permissão para fazer login em vários lugares ao mesmo tempo
2) O usuário efetuou login em A. agora é permitido fazer login a partir de B, mas espremerá um (considerando que o usuário esteve em B devido a algumas circunstâncias após o login em A, mas ainda quer continuar o trabalho anterior, para que ele precise fazer login no sistema)
3) Depois de espremer um de B, o sistema fornecerá um aviso quando A fizer outras operações. O usuário faz login em outros lugares. Se a senha puder vazar se não for para sua própria operação, altere a senha.
2. Mapa de ideias
Quando cada usuário faz login, geralmente armazenamos informações do usuário na sessão para que o sistema possa obter facilmente as informações básicas do usuário quando o usuário executar operações. No entanto, esta sessão é privada e só é visível para o usuário atual (se você concorda que o usuário receberá sessões diferentes, que é a causa raiz de por que vários usuários podem fazer login). Então a pergunta vem: como um usuário pode saber se ele está online ao fazer login? Eu acredito que você é inteligente, você já pensou que isso não é fácil. Não é o problema de armazenar informações de usuário on -line em um local público? Depois de verificar on -line, a solução é completamente diferente e é aproximadamente os dois tipos a seguir.
1) Identifique usuários on -line no banco de dados
2) Armazene em aplicação
Após muitas considerações, descobriremos que a solução 1 precisa resolver muitos problemas difíceis (saída anormal do usuário e status de modificação futura, acesso frequente ao banco de dados afeta o desempenho, etc.), o que é obviamente inadequado para você que exige perfeição. Por isso, adotamos a solução 2, salvando as informações do usuário on -line no aplicativo e o design específico é o seguinte.
1) fluxograma de login
2) fluxograma de operação após ser espremido
3. Código
1) Método de login
@RequestMapping (value = "/login", método = requestmethod.post) public string login (nome de usuário da string, senha da string, redirectattributes redirectattributes, httpServLeTrequest Solicy) {// julgar o usuário online e processar (remover é online) stringinlimite = limite; Correto String result = UserService.login (nome de usuário, senha); if (resultado.equals ("succcess")) {request.getSession (). setAttribute ("agora_user", userservice.findbyusername (nome de usuário)); // criar token e verificar string jwtToken = thokenservice.createUserauthToken (userVice.fIndername (username)); tokensystem.out.println (jwttoken); userauthenticationToken authToken = tokenservice.retrieveserauthtoken (jwttoken); // parsés de token system.out.println (authToken.isauthenticated ()); system.out.println (idh = " UserauthenticationToken.getCurrentToken (). GetUseruuID ()); // O usuário está desconectado e redireciona para o link salvo após o login. if (url! = null) {request.getSession (). removeattribute ("redirect_link"); retorna "redirecionar:" + url.toString ();} return "index";} redirectattributes.addflashattribute ("Mensagem", resultado); retorno "Redirect:/outros/;2) Faça login para determinar se já está online
@Service @transactionalpublic class LimitELOGIN {Logger estático privado = logger.getLogger (sessionListener.class); mapa estático privado <string, string> loginUserMap = new Hashmap <> (); // Usuários on -line Usuários privados mapa estático <string> loginouttime = new Hashmap <> (); armazenamento; Loginlimite Solicitação (httpServletRequest, string userName) {usuário user = userservice.findbyusername (nome de usuário); string sessionId = request.getSession (). getId (); para (string key: loginUserMap.keySet ()) «// o usuário registrou em outro lugar se (key.equals (key.equals (keyeyyset ()). ! LoginUserMap.ContainsValue (sessionID)) {log.info ("User:" + user.getUserName () + ", em" + dateUtil.dateFormat (new Date (), "AATINOTTIME.TM-DD HH: MM: SS") + "excluded! "yyyy-mm-dd hh: mm: ss")); loginUserMap.remove (user.getUserName ()); break;}} loginUserMap.put (user.getUserName (), sessionId); request.getSession (). LoginUserMap); request.getSession (). getServletContext (). SetAttribute ("LoginoutTime", LoginoutTime); retornar "Sucesso";}}3) Interceptador de login (sem login para saltar para a página de login)
public class LogIninterceptor estende o HandlerInterceptAdapter {@OverridePublic Boolean Prehandle (solicitação httpServletRequest, resposta httpServletResponse, manipulador de objetos) lança exceção {httpSession Session = request.getSession (); User = (User) session.gettttioTttTrtTrtTrtTrtTrtTSession = request.getSession (); User = (User ).get.gttioTttTrtTrtTrtTrtTrtTtSession = request. null) {Response.sendRedirect (request.getContextPath () + "/outro/tologin"); retorna false;} // Julgamento de restrição de login de vários usuários e dê uma mensagem pronta para boolean islogin = false; if (user! session.getServletContext (). getAttribute ("LoginUserMap"); String sessionId = session.getId (); para (String Key: LoginUserMap.KeySet ()) {// O usuário está conectado a outro local se (key.equals (user.getUsername) &&! true; break;}}} if (islogin) {map <string, string> loginoutTime = (map <string, string>) session.getServletContext (). getAttribute ("loginouttime"); session.setAttribute ("Mess", "user:" + user.getUsName () + ", in", " em outros lugares! "); loginoutTime.Remove (user.getUserName ()); session.getServletContext (). SetAttribute (" LoginUserMap ", LoginoutTime); Response.SendRedirect (requestConteCtPath () +"/outros/tologin,); retorno;} Return; Postandle (solicitação httpServletRequest, resposta httpServletResponse, manipulador de objetos, modelAndView ModelAndView) lança a exceção {super.PosTHandle (solicitação, resposta, manipulador, modelAndView);}@httpersPublic void Aftercompletion (HTTPSTPSELHE {super.aftercompletion (solicitação, resposta, manipulador, ex);}}4) Quando a sessão for destruída, limpe os pares do valor da chave salvos no LoginUserMap
public ClassSessionListener implementa httpSessionListener {logger estático privado log = logger.getLogger (sessionListener.class);@SubsteridePublic void sessionCreated (HttpSessionEvent Event) {} @OverridePublic void (HttTPSess.Sevent) {} @overridepublic void (HtttT. session.getId (); // Quando a sessão é destruída, limpe o par de valores de chave salva no usuário do usuário do LoginUserMap = (usuário) session.getAttribute ("agora_user"); if (user! = null) {map <string, string> loginUserMap = (map <string, string>) event.getSession (). getServletContext (). getAttribute ("LoginUserMap"); if (LoginUserMap.get (user.getUserName ()). Equals (sessionId)) {log.info ("Limpe o usuário do aplicativo:" + user.getUserName ()); loginUserMap.remove (user.getUserName ()); event.getSession (). getServletContext (). SetAttribute ("LoginUserMap", LoginUserMap);}}}}5) web.xml
<!-Lista de sessões Restrições de login de vários usuários, faça logon para limpar as informações da sessão enquanto limpa as informações de login do usuário armazenadas no aplicativo-> <Ilanter> <lister-class> com.service.limiteLogin.sessionListener </lister-class> </ivener>
6) Código da página (usado para limpar as informações da sessão do usuário espremido ao fornecer um prompt, caso contrário, as informações prompts serão exibidas o tempo todo)
<script type = "text/javascript"> $ (document) .ready (function () {var message = '$ {Mess}'; if (message! = "") {$ .ajax ({type: 'get', assíncrono: false, cache: false, url: '/outros/clearSession', datatype: ', dados, dados: {false: url:'/outros/clearSession ', datatype:' ', dados, dados: dados: {': '/outros/clearSession', datatyc: ', dados, dados, dados: {': '/outros/clearSession', datatyc: ', dados, dados: dados: {': '/outros/clearSession', datatyp: '', {}}); $ ('#mess'). html (mensagem);}}); </script>7) Limpe o código da sessão do usuário
/*** Restrições de login multi-usuários, Informações sobre a sessão limpa (informações de login, informações rápidas) ** @param request*@return*/ @ResponseBody @requestmapping (value = "/clearuserSession") public string clearussession (httpServletRequest solicitação) {httpsession httpsession = request.getSession (); // httpsession.Invalidate (); httpsession.Removeattribute ("agora_user"); httpsession.Removeattribute ("Mess"); retorno "sucesso";}O trabalho de desenvolvimento está concluído aqui
4. Resultados da operação
O exposto acima é o método de implementação das restrições de login de vários usuários Java introduzidos a você pelo editor. Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a você a tempo. Muito obrigado pelo seu apoio ao site wulin.com!