Alguns dias atrás, quando eu estava trabalhando em um sistema de check-in, encontrei um problema de sessão popular. O projeto é a estrutura Spring+Springmvc+Mybatis, o sistema de gerenciamento de Maven Javaweb. Para algumas questões da sessão, a seguinte análise é feita. Aqui, nos concentramos na questão do ciclo de vida da sessão. Quanto a outras definições, não explicaremos:
Primeiro, vamos explicar o ciclo de vida da sessão:
Armazenamento: a sessão é armazenada no lado do servidor. Geralmente, para impedir que ele seja armazenado na memória do servidor (para acesso de alta velocidade), o Sessinon é criado quando o usuário acessa o servidor pela primeira vez. É necessário observar que a sessão será criada apenas ao acessar JSP, Servlet e outros programas. Acesso apenas recursos estáticos, como HTML e imagem, não criará uma sessão. Em um aplicativo Javaweb, você pode ligar para o request.getSession (boolean xxx) para gerar uma sessão. Observe que quando o parâmetro booleano é verdadeiro, uma nova sessão é forçada a ser gerada aqui.
1. Tempo de vencimento da sessão:
A sessão expira após a última vez que a sessão foi usada atingindo o tempo de falha definido.
2. Outra sessão de método.invalidate () é executada, que torna ativamente inválido a sessão.
Para o tempo de invalidação, você pode defini -lo configurando propriedades em web.xml:
<Session-Config> <session-timeout> Tempo de expiração </session-timeout> </session-config>
A unidade de tempo de falha é minutos. Se a sessão for válida por um dia, ela poderá ser definida como 60*24. Quando definido como 0 ou negativo, a sessão é permanentemente válida. De acordo com a definição do tempo de falha, é fácil entender essa situação.
Por que a sessão falha após o fechamento do navegador?
Com base no que se sabe, um exemplo simples foi escrito:
@ControllerPublic Class SessionTest {@RequestMapping ("/sessionTest") public String SessionTest (solicitação httpServletRequest, httpServletResponse resposta) {System.out.println ("Sucesso!"); Session httpSession = request.getSession (); session.setMaxinActiveInterval (259200); request.setAttribute ("CreationTime", session.getCreationTime ()); // Criação Time Request.SetAttribute ("ID", session.getId ()); // ID request.setAttribute ("max", session.getMaxActiveInterval (-1); request.setAttribute("lasttime",session.getLastAccessedTime());//Last usage time request.setAttribute("sessionTest",session);// System.out.println(session.getCreationTime());// System.out.println(session.getMaxInactiveInterval());// System.out.println(session.getLastAccessedTime()); retornar "Page/ShowSession"; } <tabela CellPacing = "0" CellPadding = "0"> <tr> <td> Tempo de criação: </td> <td> $ {CreationTime} </td> </tr> <tr> <td> id: </td> <td> $ {id} </td> </th Tempo: </td> <td> $ {max} </td> </tr> <tr> <td> Última vez usado: </td> <td> $ {lasttime} </td> </tr> <tr> <td> sessão: </td> <td> $ {sessionTest} </td>Análise:
Pode -se observar que o tempo de invalidação da sessão é realmente quando o navegador está fechado; portanto, apenas se o navegador não fechar e acessar novamente, você poderá continuar usando o estado de login. O que representa o tempo de invalidação acima?
Foi criada uma sessão entre o navegador e o servidor. Como o cliente não interagiu com o servidor por um longo tempo (tempo de hibernação), o servidor destruiu esta sessão. A sessão anterior quando o cliente interagiu com o servidor novamente não existia. Meu entendimento é que o tempo de invalidação só entra em vigor durante uma sessão. Se o navegador estiver fechado e a sessão terminar, o tempo de invalidação será definido como válido permanentemente, que é o momento em que o navegador está fechado e a sessão será fechada. Para resolver esse problema, você pode misturar cookies com sessões. Existe uma maneira tão estúpida:
Adicione ativamente cookies para definir o Diretório de Salvar e o tempo de sobrevivência
public static void addCookie (nome da string, valor da string, idade int, httpServletResponse resposta) lança não suportadoEncodingException {cookie c = novo cookie (nome, urlencoder.encode (valor, "utf-8"); C.setMaxage (idade); c.setPath (caminho); Response.Addcookie (C); } Ao acessar novamente, use Cookie[] cookies = request.getCookies(); Para atravessar os biscoitos, obtenha o biscoito desejado de acordo com o nome do cookie, ou pode -se dizer que é uma sessão. Por fim, você obtém o resultado desejado e a sessão (o cookie chamado JSessionId) escapa da prisão do navegador.
Resumir
O exposto acima é a solução para o problema da falha da sessão J2EE após o fechamento do navegador. 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!