Introdução à sessão
Uma sessão refere -se ao processo de interação entre um usuário usando o mesmo processo de navegador e um aplicativo da Web por um período de tempo.
As sessões geralmente são usadas para rastrear o status do usuário e cache as informações do usuário neste processo do navegador.
Quando o usuário fecha o navegador, a sessão anterior não pode ser obtida novamente (o caso em que o maxage do cookie é -1). Abra um novo navegador novamente e uma nova sessão começará.
Classe javax.servlet.http.httpSession. Cada httpSession representa uma sessão do usuário.
O tempo de validade de cada sessão é de 30 minutos por padrão.
Quando o navegador acessa primeiro o servidor, independentemente da página visita primeiro, o servidor atribuirá um identificador de sessão exclusivo ao usuário, ou seja, JSessionId e depois o devolverá ao usuário na forma de um cookie.
A figura a seguir é um cabeçalho de resposta (a figura a seguir é baseada no servlet 3.0 e não há atributo httponly no servlet 2.5)
O servidor cria uma sessão para cada usuário, a saber, o objeto HTTPSession e o salva no lado do servidor.
Então, quando o usuário acessa o servidor novamente, como o servidor conhece ou o usuário atual?
Quando o navegador acessa o servidor novamente, ele carrega um cookie que contém o JSessionID para acessar o servidor. O servidor retorna o objeto HTTPSession desse usuário com base nesse ID e mantém a sessão.
(Então, é possível implementar a mesma sessão em diferentes navegadores?
Aqui está um URL típico, que tem um certo efeito de falsificação e pode implementar a mesma sessão em diferentes navegadores:
http: // localhost: 8080/Day07_2/cNcookieServlet;
A relação entre o navegador e o servidor é a seguinte:
HTTPSession:
Em um servlet, o objeto de sessão é obtido através do método httpServletRequest.getSession.
Os seguintes métodos da interface HTTPSession são usados para compartilhar dados para toda a sessão:
getAttribute ("name") setAttribute ("nome", objeto); getAttributenames () removeattribute ("nome")Invalidar(); - Este método exclui fortemente a sessão em cache do servidor.
Exemplo:
SetAttribute no httpssession de um servlet.
Vá para outro servlet via HyperConnect ou de outra forma e exiba as informações via getAttribute.
Ligue para GetAttribute em qualquer servlet para exibir informações.
Feche este navegador e revise o servlet que obtém informações, e você descobrirá que não há mais informações.
do seguinte modo:
Nome da string = request.getParameter ("nome"); request.setAttribute ("nome", "request ---"+nome); request.getSession (). setAttribute ("nome", "sessão ---"+nome); getServletContext (). setAttribute ("nome", "aplicativo ---"+nome); O identificador exclusivo da sessão:
Cada sessão tem um identificador exclusivo, ou seja, um ID.
Quando o navegador obtém uma nova sessão, o usuário pode imprimir o valor do ID através da sessão.geid ().
Sem fechar o navegador, pulando em várias páginas, usando a mesma sessão.
como:
request.getSession (). getId ()
O que é Sapa Saída:
Quando um usuário sai, ele deve limpar suas informações da sessão - ou seja, saia com segurança.
A saída segura é limpar as informações que você deixa no servidor para impedir que ele seja invadido.
Session.Invalidate ();
1. Request.getSession (). Invalidate ();
Isso permite que os objetos correspondentes no pool de sessões sejam excluídos.
2. Session.Removeattribute (…)
como:
request.getSession (). removeattribute ("RealCode");
Usado para excluir atributos em objetos de sessão
Acompanhe a sessão reescrevendo o URL:
Como mencionado anteriormente, o contêiner servlet primeiro salva um SessionID no cliente. Mais tarde, quando o navegador emite uma solicitação HTTP, ele conterá este SessionID. O contêiner do servlet lê o SessionID na solicitação HTTP e retira o objeto HTTPSession do contêiner com base neste SessionID para facilitar o rastreamento a qual sessão a solicitação HTTP pertence. Esse processo é chamado de rastreamento da sessão.
Se o navegador suportar cookies, o contêiner de servlet salvará o SessionID como um cookie no cliente do navegador. Mas se o usuário desativa os cookies por motivos de segurança, como o contêiner do servlet pode rastrear a sessão?
Primeiro, vamos desativar os cookies no IE (Nota: ele não funciona para alguns sistemas fantasmas).
IE> Ferramentas> Opções da Internet> Privacidade> Avançado e, em seguida, desative os cookies:
Podemos adicionar um hiperlink tão
<H2> Demonstre a tecnologia de URL de reescrita ---- quebrando o problema de que nossa sessão é inválida depois que o usuário desabilita cookies </h2> <form Action = "< %= Response.Encodeurl (" SaveServlet ") %>" Método = "Post"> Nome: <input Type = "Text =" Name "/> <br/> href = "< %= resposta.encodeurl (" getServlet ") %>"> Reescreva os dados do URL-Read em vários contêineres </a> <br/>Esta frase <form ação = "<%= resposta.encodeurl ("/aa ")%>"> pode realizar esta função
Depois de desativar os cookies aqui, o navegador ainda pode receber cookies enviados pelo servidor, mas o navegador só pode aceitá -los e não pode enviá -los para o servidor. Se os cookies não puderem ser enviados, ele não poderá ir ao pool de sessões para obter o objeto correspondente.
Depois de inserir o valor desejado no formulário, vá para o hiperlink no GetServlet abaixo para verificar se o valor de entrada ainda pode ser exibido. A resposta é sim. O caminho de acesso aqui é semelhante
http://localhost:8080/day07_2/CNCookieServlet;jsessionid=F8692D61CD46D094DBB7A8FC7387649C, the jsessionid=F8692D61CD46D094DBB7A8FC7387649C behind it is its id. Dessa forma, você pode acessá -lo inserindo este URL em outro navegador.
Aqui, quero acrescentar: (a situação a seguir é que, quando escrevo o objeto HttpSession no pool de sessões, o valor e o valor do JSessionID da sessão correspondente no cookie. Este cookie substituirá o criado pelo sistema, que não é o que é equivalente a ser criado por mim.
Nos dois casos, se os cookies são desativados, os IDs de objetos recém -criados no pool de sessões são diferentes. Ou seja, se você inserir um valor de um nome no formulário quando os cookies são desativados, o resultado da consulta é o seguinte:
E JSessionId é 2BB51EBDEAAF14D19656C71E1B6F9FF6
Em seguida, mude imediatamente para o modo de cookie sem desativá -lo, insira outro nome como Tom, e o resultado da consulta será naturalmente dois Tom, e o JSessionID é
203F9E4DB5D874476B81DAF350661B6A, que é diferente da desativação, o que faz com que os seguintes resultados apareçam.
Então, neste momento, fechamos o navegador, entramos no navegador novamente e visualizamos os resultados do acesso sem desativar o modo de cookie, como segue:
Vou postar o código principal abaixo:
SaveServlet.java
pacote cn.hncu.servlets.session; importar java.io.ioException; importar java.io.printwriter; importar javax.servlet.servletexception; importar javax.servlet.http.cookie; importar javax.servlet.http.httpServlet; importar javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletResponse; classe pública SAVeServlet estende httpServlet {public void Doget (solicitação httpServletRequest, httpServletResponse resposta) lança servletexception, ioexception {dopost (solicitação, resposta); } public void DoPost (solicitação httpServletRequest, resposta httpSertletResponse) lança servletexception, ioexception {Response.setContentType ("text/html; charset = utf-8"); PrintWriter out = Response.getWriter (); request.setcharacterencoding ("UTF-8"); Nome da string = request.getParameter ("nome"); request.setAttribute ("nome", "request ---"+nome); request.getSession (). setAttribute ("nome", "sessão ---"+nome); getServletContext (). setAttribute ("nome", "aplicativo ---"+nome); // Um exemplo de combinação de tecnologia de cookies e tecnologia de sessão para aplicação -※ Função: Após fechar o navegador, se o usuário puder fazer login neste site em 10 minutos, ele também poderá acessar as informações na sessão // escrever um cookie com uma chave "jSessionId" e valorizar como sessionID para o cliente. Cookie c = novo cookie ("JSessionId", request.getSession (). GetId ()); c.setMaxage (60*10); // O fenômeno acima é causado por esta frase. Sem essa frase, não haverá esse fenômeno como mencionado acima C.SetPath (request.getContextPath ()); Response.Addcookie (C); out.println ("Salve com sucesso ..."); out.flush (); out.Close (); }}GetServlet.java
pacote cn.hncu.servlets.session; importar java.io.ioException; importar java.io.printwriter; importar javax.servlet.servletexception; importar javax.servlet.http.httpServlet; importar javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletResponse; classe pública getServlet estende httpServlet {public void Doget (solicitação httpServletRequest, httpServletResponse resposta) lança servletexception, ioexception {Response.setContentType ("text/html; charset = utf-8"); PrintWriter out = Response.getWriter (); out.println ("<! doctype html public/"-// w3c // dtd html 4.01 transitório // en/">"); out.println ("<html>"); out.println ("<head> <title> um servlet </ititle> </ad Head>"); out.println ("<body>"); String reqname = (string) request.getAttribute ("nome"); String sename = (string) request.getSession (). GetAttribute ("nome"); String appName = (string) getServletContext (). GetAttribute ("nome"); out.println (reqname+"<br/>"); out.println (sename+"<br/>"); out.println (AppName+"<br/>"); out.println ("</body>"); out.println ("</html>"); out.flush (); out.Close (); }}LogoutServlet.java
pacote cn.hncu.servlets.session; importar java.io.ioException; importar java.io.printwriter; importar javax.servlet.servletexception; importar javax.servlet.http.httpServlet; importar javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletResponse; classe pública LogoutServlet estende httpServlet {public void Doget (solicitação httpServletRequest, resposta httpServletResponse) lança servletexception, ioexception {Response.setContentType ("text/html; charset = utf-8"); PrintWriter out = Response.getWriter (); // saída segura --- Assim que o objeto de sessão for inválido request.getSession (). Invalidate (); out.println ("Saída de saída ..."); }}O exposto acima é o gerenciamento de sessão de Javaweb introduzido pelo editor. Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem. O editor responderá a você a tempo!