A função do sinal único ainda é muito importante nos cenários de aplicação reais. Logicamente, não permitimos que um usuário execute duas operações ao mesmo tempo. Vamos aprender sobre a implementação de assinatura única do SpringMVC.
O interceptador da SpringMVC é diferente do interceptador da Spring. O SpringMVC possui um despachoServlet de entrada unificada. Todas as solicitações passam pelo DispatcheserServlet, portanto, você só precisa fazer uma confusão no DispatcheserServlet. O DispatcheserServlet não possui um proxy e o controlador gerenciado pelo SpringMVC não possui um proxy.
1. Primeiro explore um princípio básico de implementação: esta função é relativamente simples, ou seja, apenas um usuário pode operar no mesmo projeto da web ao mesmo tempo, então aqui está a descoberta de um login remoto e dois caminhos são introduzidos aqui. 1. O servidor descobre que o usuário logado executou a operação de login novamente através de outro IP e, em seguida, pressiona ativamente um lembrete para dizer ao primeiro usuário para fazer login no login remoto; 2. Quando o usuário executa operações, ele descobre que sua conta foi espremida e há um login remoto. Em relação a essas duas soluções, a primeira é mais em tempo real, mas ainda está sendo explorada. Vamos nos concentrar no segundo método abaixo.
2. Implementar o segundo tipo é relativamente simples. Existem duas operações. Uma é adicionar um campo extra ao SessionID do usuário para armazenar o Usuário do Usuário conectado, porque cada solicitação de solicitação corresponde a um SessionID não repetitivo exclusivo. Em seguida, usando a tecnologia interceptadora, interceptando as operações do usuário. No interceptador, a solicitação de URL relevante na página de login é lançada pela primeira vez e a outra é que a solicitação de verificação de login é liberada. Por fim, filtre o usuário. (Sobre o login de usuários, quando a verificação for bem -sucedida, não apenas o usuário deve ser armazenado na sessão para verificação de interceptação de login, mas também o ID da sessão precisa ser armazenado na tabela de sessão correspondente na tabela de usuários.) Para a solicitação de solicitação desta vez, você pode obter a sessão e seu ID e, em seguida, comparar se o mesmo com o Sessão no tanabase, de acordo com este ID e, em seguida, passa. Se a diferença for, o login de salto offline será solicitado a pular no login, porque haverá uma sessão em uma operação do servidor de conexão do usuário. Enquanto a sessão expirar, o ID da sessão de cada operação iniciada pelo usuário é a mesma, para que corresponda ao ID armazenado no banco de dados ao fazer login. Quando alguém passar por outros dispositivos, use a mesma conta para inserir. A sessão será restabelecida ao fazer login. A sessão no banco de dados atualizará o SessionID no banco de dados, mas o SessionID ainda não é alterado. No entanto, a sessão no banco de dados mudou. Portanto, ao verificar se o SessionID no banco de dados é consistente no interceptador, ele não interceptará a operação do usuário para alcançar a função do login de um usuário único. (Uma nota sobre sessão, quando o usuário se conectar pela primeira vez ao servidor, uma sessão será criada no lado do servidor e, em seguida, todas as operações iniciadas pelo usuário carregarão o ID desta sessão, e algumas situações ocorrerão. O usuário não opera com o servidor por um longo tempo. O usuário registra) e faz o servidor o Inválid.
A seguir, a implementação do interceptador em Springmvc
classe pública SingleUserInterScept implementa HandlerInterceptor {@AUTOWIREDEDPRIVATE UsermApper Mapper; public void After comcompletion (httpServletRequest arg0, httpServletResponse arg1, objeto arg2, exceção arg3) joga excepção {// TODO-GENERATETETETETERETERETER ARG2, PublicLe) (///////todretRexponse, objeto arg2, excepção) lança exceção {// TODO GELETS AUTOMEVETER STUB} VOID PublicLe HttpServletResponse arg1, objeto arg2, modelAndView arg3) lança a exceção {// TODO Método Auto-Generado Stub} public boolean Prehandle (httpServletRequest arg0, httpStletResponse arg1, objeto arg2) lança a exceção {string url = arg0.GregEsturi (); if (url.indexof ("login.jsp")> = 0 || url.indexOf ("new/login")> = 0 || url.indexOf ("checkUser")> = 0) {return true;} // se o nome do usuário existe (que for, login e release) arg0.getSession (). getAttribute ("user"); if (user! = null) {string sessionId = mapper.getUserEntity (Integer.valueof (user)). getSessionId (); if (sessionid.equals (arg0.getSession (). getid ())); else {arg1.setStatus (arg1.sc_gateway_timeout); arg1.setContentType ("text/html; charset = utf-8"); printwriter out = arg1.getWriter (); Em outros lugares, você é forçado a ficar offline ') "); out.println (" window.open (' " + arg0.getContextPath () +" /new/login'.'_top'iC.) furln ;out.println("/script>"); arg0.getRequestDispatcher ("login.jsp"). Forward (arg0, arg1); retornar false;}} arg0.getRequestDispatcher ("login.jsp"). Forward (arg0, arg1); retornar false;}}O código acima pode cumprir a função do primeiro usuário conectado a ser espremido na linha quando o mesmo usuário fizer login várias vezes. Ele pode realizar a função de solicitar a conta para fazer login remotamente e depois pular para a página de login. Aqui precisamos explicar os pontos -chave desta função de prompt de alerta simples. Se esse alerta aparecer, ele deve ser capaz de encerrar a solicitação. Em seguida, a função de impressão de resposta produz a instrução Prompt de alerta, para que a instrução JUMP comentada não possa existir. Se houver, a instrução Prompt de alerta não será emitida, porque sua operação não termina corretamente, mas é encaminhada ou redirecionada para outras operações. Se estiver correto ou não, ele será emitido de outras ações para a página, para que sua declaração de impressão de resposta não apareça. Portanto, a maneira correta é: a solicitação de interceptação não foi divulgada (ReturnFalse) e a solicitação ainda é a solicitação original e não vai pular. As informações de impressão da resposta de volta à página podem ser exibidas. Quanto ao pular para a página de login, você pode usar: out.println ("window.open ('"+arg0.getContextPath ()+"/new/login', '_ top');"); Para implementar que uma solicitação de ação é executada em uma seção da saída JS pela resposta, apontando para a página de login.
O código acima foi basicamente considerado uma função de login de usuário, mas você descobrirá que a operação da solicitação AJAX não aponta para a página de login ao fazer login no local remoto e não há informações rápidas. Deixe -me explicar o motivo primeiro, porque seu Ajax está fazendo uma solicitação assíncrona, e o URL solicitado também é comparado no mapeador do processador, por isso será considerado como a solicitação for bem -sucedida (o código de status de retorno é 200). A instrução JS impressa na resposta acima se tornará a solicitação bem -sucedida em sucesso e o valor de retorno. Você pode tentar comentar a frase acima: arg1.setStatus (arg1.sc_gateway_timeout); Neste momento, algumas outras operações precisam ser executadas. A primeira é a declaração arg1.setStatus (arg1.sc_gateway_timeout); Sua função é definir o código de status retornado por resposta. As configurações acima indicam que o código de status 504 será retornado para representar um erro de solicitação. No momento, a solicitação do AJAX não responderá mais no método de sucesso, mas responderá ao método de erro do Ajax. Portanto, você só precisa executar o método correspondente no erro do Ajax, por exemplo:
$ .ajax ({url: 'new/msd2', sucesso: function (a) {alert (a);}, erro: function (rs) {if (rs.status == 504) {document.write (rssponsetext);}}});Quando a solicitação do AJAX for interceptada devido a um login remoto, defina arg1.setStatus (arg1.sc_gateway_timeout); O status de retorno da solicitação pode ser alterado para 504. Então o método de erro responde. Quando é determinado que o status é o código de status que você define, document.write (rs.responsetExt); O AccemeText é a instrução JS impressa na recepção no interceptador. Para que essas declarações sejam executadas, o documento.Write (); O método precisa gravar o código no DOM para entrar em vigor. Neste ponto, todas as solicitações e login único para solicitações assíncronas de Ajax foram basicamente implementadas.
Deixe este artigo apenas para registrar o código -chave, idéias e princípios de operações
Resumir
O exposto acima é tudo sobre a implementação do Single Sign-On no SpringMVC Interceptor, espero que seja útil para todos. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio a este site.