1. Uma breve introdução à sessão
No desenvolvimento da Web, o servidor pode criar um objeto de sessão (objeto de sessão) para o navegador de cada usuário. Nota: Um navegador possui exclusivamente um objeto de sessão (por padrão). Portanto, quando for necessário salvar os dados do usuário, o programa do servidor pode gravar dados do usuário em uma sessão exclusiva do navegador do usuário. Quando o usuário usa o navegador para acessar outros programas, outros programas podem recuperar os dados do usuário da sessão do usuário para servir o usuário.
2. As principais diferenças entre sessão e cookies
Os cookies são o navegador que grava os dados do usuário para os usuários.
A tecnologia da sessão grava dados do usuário em sessões de propriedade do usuário.
O objeto de sessão é criado pelo servidor e os desenvolvedores podem chamar o método GetSession do objeto de solicitação para obter o objeto de sessão.
3. Princípio da implementação da sessão
3.1. Como um servidor implementa uma sessão para servir o navegador de um usuário?
Depois que o servidor cria a sessão, ele gravará o número de ID da sessão de volta ao cliente na forma de um cookie. Dessa forma, desde que o navegador do cliente não esteja fechado, ao acessar o servidor, ele trará o número de ID da sessão. Quando o servidor descobrir que o navegador do cliente possui o ID da sessão, ele usará a sessão correspondente na memória para atendê -lo. Pode ser comprovado com o seguinte código:
package xdp.gacl.session;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpSession;public class SessionDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Response.SetcharAcTerEncoding ("UTF = 8"); Response.setContentType ("Texto/html; charset = utf-8"); // Use o getSession () do objeto de solicitação para obter a sessão. Se a sessão não existir, crie uma sessão httpSession = request.getSession (); // armazenar os dados na sessão session.setAttribute ("dados", "solly canglang"); // Obtenha o ID da sessão String sessionId = session.getId (); // julga se a sessão foi criada recentemente se (session.isnew ()) {Response.getWriter (). Print ("Sessão foi criada com sucesso, o ID da sessão é:"+sessionID); } else {Response.getWriter (). print ("A sessão já existe no servidor, o ID da sessão é:"+sessionID); }} public void DoPost (solicitação httpServletRequest, httpServletResponse resposta) lança servletexception, ioexception {doget (solicitação, resposta); }}Ao acessar pela primeira vez, o servidor criará uma nova sessão e enviará o ID da sessão para o navegador do cliente na forma de um cookie, conforme mostrado na figura abaixo:
Clique no botão Atualizar e solicite o servidor novamente. No momento, você pode ver que, quando o navegador solicitar o servidor novamente, o ID da sessão armazenado no cookie será passado para o lado do servidor juntos, conforme mostrado na figura abaixo:
Eu acho que o método request.getSession () deve ter feito o seguinte processamento após a sessão recém -criada dentro
// Obtenha a sessão idstring sessionId = session.getId (); // armazenamento o ID da sessão no cookie com o nome JSessionId Cookie Cookie = new Cookie ("JSessionId", SessionID); // Defina o caminho válido do cookie cookie.setPath (requestContextPath ()); Response.Addcookie (Cookie);4. O processamento da sessão após o navegador desativa os cookies
4.1. IE8 Desative os cookies
Ferramentas -> Opções da Internet -> Privacidade -> Configurações -> Puxe o controle deslizante para o topo (bloqueie todos os cookies)
4.2. Solução: Reescrita de URL
Response.EncodedirectURL (Java.lang.String URL) é usado para reescrever o endereço da URL após o método SendReRect.
Response.Encodeurl (java.lang.string URL) é usado para reescrever o endereço da URL da ação do formulário e do hiperlink
4.3. Exemplo: Após desativar os cookies, os servlets compartilham dados na sessão
IndexServlet
pacote xdp.gacl.session; importar java.io.ioException; importar java.io.printwriter; importar java.util.LinkedHashmap; importar java.util.map; importVletLevern; javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletSponse; // homepage: listar todos os livros da classe pública IndextleTtlendLendleTtLeTLeTleTSonse; HttpServletResponse Response) lança servletexception, ioexception {Response.setContentType ("text/html; charset = utf-8"); PrintWriter out = Response.getWriter (); // crie session request.getSession (); out.write ("Este site possui os seguintes livros: <br/>"); Set <pap.entry <string, book >> set = db.getall (). EntrySet (); para (map.entry <string, book> me: set) {book book = me.getValue (); String url = request.getContextPath () + "/servlet/buyServlet? Id =" + book.getId (); //resposta. Encodeurl (java.lang.string URL) é usado para reescrever a ação do formulário e o endereço da URL do hyperlink url = resposta.encodeurl (URL); // Reescreva o endereço URL do hiperlink out.println (book.getName ()+"<a href = '"+url+"'> compra </a> <br/>"); }} public void DoPost (solicitação httpServletRequest, httpServletResponse resposta) lança servletexception, ioexception {doget (solicitação, resposta); }}/*** @author gacl* simular banco de dados*/classe db {mapa estático privado <string, book> map = new LinkedHashmap <string, book> (); estático {map.put ("1", novo livro ("1", "desenvolvimento de javaweb")); map.put ("2", novo livro ("2", "Spring Development")); map.put ("3", novo livro ("3", "Hibernate Development")); map.put ("4", novo livro ("4", "Struts Development")); map.put ("5", novo livro ("5", "Ajax Development")); } mapa estático público <string, book> getall () {return map; }} Classe Book {private String ID; nome de string privado; public book () {super (); } public book (string id, nome da string) {super (); this.id = id; this.name = nome; } public string getId () {return id; } public void setId (string id) {this.id = id; } public string getName () {return name; } public void setName (nome da string) {this.name = name; }}BuyServlet
package xdp.gacl.session;import java.io.IOException;import java.util.ArrayList;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.httpServletResponse; importar javax.servlet.http.httpsession; classe pública BuSServlet estende httpServlet {public void doget (httpServErquest Solicy, htttletroSponsensonse). Livro de livros = db.getall (). Get (id); // Obtenha o livro que o usuário deseja comprar session httpSession = request.getSession (); List <Book> list = (list) session.getAttribute ("list"); // obtenha o contêiner usado pelo usuário para salvar todos os livros se (list == null) {list = new ArrayList <Book> (); session.setAttribute ("List", List); } list.add (livro); //resposta. EncoderedirectURL (java.lang.string URL) é usado para reescrever o endereço da URL após o método sendReCTIRCT String url = Response.encoderedirectUrl (request.getContextPath ()+"/servlet/listCartServlet"); System.out.println (URL); Response.sendRedirect (URL); } public void DoPost (solicitação httpServletRequest, httpServletResponse resposta) lança servletexception, ioexception {doget (solicitação, resposta); }}ListCartServlet
package xdp.gacl.session;import java.io.IOException;import java.io.PrintWriter;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.httpServletResponse; importar javax.servlet.http.httpsession; public class ListCartServlet estende httpServlet {public void Doget (httpServletRequest Solicition, htttpsetResponsonsonsonsooroming) (httpservleTrequest Solicition, httttSlestonsOnse Response) (httpSertrequest, solicitação de htttpslestonsonsonsonsensensex) (httpserveletrequest, solicitação, htttpslestonsonsonsonsoor). Response.setContentType ("Texto/html; charset = utf-8"); PrintWriter out = Response.getWriter (); Session httpSession = request.getSession (); List <Book> list = (list) session.getAttribute ("list"); if (list == null || list.size () == 0) {out.write ("Desculpe, você ainda não comprou nenhum produto !!"); retornar; } // Mostra os produtos comprados pelo usuário out.Write ("Você comprou os seguintes produtos: <br>"); para (Livro: Lista) {Out.Write (book.getName () + "<br/>"); }} public void DoPost (solicitação httpServletRequest, httpServletResponse resposta) lança servletexception, ioexception {doget (solicitação, resposta); }}O efeito de operação no IE8 com cookies desativados é o seguinte:
Efeito de demonstração
Observando o código HTML gerado pelo IndexServlet, você pode ver que cada hiperlink tem o ID da sessão seguido, como mostrado abaixo
// Este site possui os seguintes livros: <br/> Desenvolvimento Javaweb <a href = '/javaweb_session_study_20140720/servlet/buyServlet; jsessionId = 96bdfb9d87a08d5ab1aaaaaaaaaaaaaaaaaaaaa) href = '/javaweb_session_study_20140720/servlet/buyServlet; jSessionId = 96bdfb9d87a08d5ab1eaaa2537cde2db2? id = 2'> compra </a> <br/ble> // hibernate href = '/javaweb_session_study_20140720/servlet/buyServlet; jSessionId = 96bdfb9d87a08d5ab1eaaaa2537cde2db2? id = 3'> compra </a> <br/br/ // de desenvolvimento <a href = '/javaweb_session_study_20140720/servlet/buyServlet; jSessionId = 96bdfb9d87a08d5ab1eaaa2537cde2db2? id = 4'> compra </a> <br/ble> // ajax desenvolvimento <a href = '/javaweb_session_study_20140720/servlet/buyServlet; jSessionId = 96bdfb9d87a08d5ab1eaaaa2537cde2db2? id = 5'> compra </a> <br/s>
Portanto, quando o navegador desativa os cookies, ele pode reescrever essa solução com URLs para resolver o problema de compartilhamento de dados da sessão. Além disso, resposta. Encoderedirecturl (java.lang.string URL) e resposta. Encodeurl (java.lang.string URL) são dois métodos muito inteligentes. Quando é detectado que o navegador não desative os cookies, a reescrita de URL não será realizada. Nós o acessamos no navegador Firefox sem desativar os cookies, o efeito é o seguinte:
Como pode ser visto na animação de demonstração, quando o navegador acessa primeiro, o servidor cria uma sessão e depois envia o ID da sessão de volta ao navegador na forma de um cookie. A resposta. O método Encodeurl (java.lang.String URL) também reescrito o URL. Quando o botão de atualização é clicado para a segunda visita, o navegador do Firefox não desativa os cookies, por isso traz o cookie na segunda visita. No momento, o servidor pode saber que o navegador atual não desativa os cookies, por isso notifica a resposta. Método Encodeurl (java.lang.string URL) que não precisa reescrever o URL.
5. O momento da criação e destruição de objetos de sessão
5.1. O tempo de criação do objeto de sessão
Uma nova sessão será criada quando o método request.getSession () for chamado pela primeira vez no programa. Você pode usar o método iSnew () para determinar se a sessão foi criada recentemente.
Exemplo: Crie uma sessão
// Use o getSession () do objeto de solicitação para obter a sessão. Se a sessão não existir, crie uma sessão httpSession = request.getSession (); // obtenha o idstring sessionId = session.getId (); // julgue se a sessão é criada recém -criada se (sessão.isnew ()) {Response.getWriter (). é: "+sessionID);}5.2. Tempo de destruição do objeto de sessão
O objeto de sessão não é usado por 30 minutos por padrão, e o servidor destruirá automaticamente a sessão. O tempo de falha da sessão pode ser configurado manualmente no arquivo web.xml, por exemplo:
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <lame> </dollamed> <lmed-list--list> Er
Quando você precisar definir manualmente a sessão para falhar no programa, você pode ligar manualmente no método session.invalidar para destruir a sessão.
1 Sessão HttpSession = request.getSession ();
2 // Ligue manualmente ao método session.invalidate para destruir a sessão
3 session.invalidate ();
O exposto acima é tudo sobre este artigo, espero que seja útil que todos aprendam a sessão.