English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Exemplo detalhado de gerenciamento de sessão Session no JavaWeb

Introdução à Sessão

A sessão se refere ao processo de interação entre o usuário e o aplicativo web em um período de tempo.

A sessão (Session) geralmente é usada para rastrear o estado do usuário, cache as informações do usuário neste processo do navegador.

Quando o usuário fechar o navegador, a última sessão não pode ser obtida novamente (maxAge do Cookie é-1Caso abra um novo navegador, começará uma nova sessão.

Classe javax.servlet.http.HttpSession. Cada HttpSession representa uma sessão do usuário.
O tempo de expiração padrão de cada sessão é30 minutos.

Quando o navegador visitar pela primeira vez o servidor, independentemente de qual página for visitada primeiro, o servidor atribuirá um identificador de sessão único ao usuário, ou seja, jsessionid, e retornará ao usuário na forma de cookie.
A seguir está um cabeçalho de resposta (a seguir é baseado no Servlet3.0 no Servlet2.5Não há atributo HttpOnly)

O servidor cria uma sessão para cada usuário, ou seja, o objeto HttpSession, armazenado no lado do servidor.

Então, como o servidor sabe se é o mesmo usuário quando o usuário visitar novamente o servidor?

Quando o navegador visitar novamente o servidor, ele carregará um cookie que contém jsessionid para acessar o servidor. O servidor retorna o objeto HttpSession deste usuário com base neste id, mantendo a sessão.
Então, será possível implementar a mesma sessão em diferentes navegadores?

A seguir está um URL típico, que tem um efeito de engano e pode implementar a mesma sessão em diferentes navegadores:

http://localhost:8080/day07_2/CNCookieServlet;jsessionid=F8692D61CD46D094DBB7A8FC7387649C )

A relação entre o navegador e o servidor é como nas duas figuras a seguir:


HttpSession:

No Servlet, obter o objeto de sessão através do método HttpServletRequest.getSession().

Os seguintes métodos da interface HttpSession são usados para compartilhar dados dentro do escopo da sessão:

getAttribute(“name”)
setAttribute(“name”,object);
getAttributeNames()
removeAttrubute(“name”)

Invalidate(); - Este método remove fortemente o session armazenado no servidor.

Exemplo:

Em um Servlet, usar o método setAttribute(httpSession) para definir alguns valores.

Passar para outro servlet por hiperlink, ou outro método, e exibir informações por getAttribute.

Chamar getAttribute em qualquer Servlet para exibir informações.

Feche este navegador, acesse novamente o servlet que obteve informações, você descobrirá que não há mais informações.

Como follows:

String name=request.getParameter("name"); 
request.setAttribute("name", "request---"+name); 
request.getSession().setAttribute("name", "session---"+name); 
getServletContext().setAttribute("name", "application---"+name); 

O identificador único da Session é Id:

Cada Session tem um identificador único, chamado ID.

Quando o navegador obtém uma nova Session, o usuário pode usar session.geId(); para imprimir o valor do ID.

Sem fechar o navegador, fazer a transição entre várias páginas usando a mesma Session.

Por exemplo:

request.getSession().getId() 

O que é sair com segurança:

Quando o usuário sai, ele deve limpar suas informações da Session - ou seja, sair com segurança.

Sair com segurança é para limpar completamente as informações deixadas no servidor, para evitar ser hackeado

Session.invalidate();

1、request.getSession().invalidate();

Dessa forma, pode deletar o objeto correspondente no pool de session

2、Session.removeAttribute(…)

Por exemplo:

request.getSession().removeAttribute("realCode");

Usado para deletar atributos do objeto session

Rastrear a sessão através da reescrever URL:

Foi dito anteriormente, o contêiner Servlet salva um SessionID no cliente primeiro, e em seguida, sempre que o navegador emitir uma solicitação HTTP, ele incluirá esse SessionID. O contêiner Servlet lê esse SessionID na solicitação HTTP, pega o objeto HttpSession do contêiner com base nesse SessionID, para rastrear qual solicitação HTTP pertence a qual sessão, esse processo é chamado de rastreamento de sessão.

如果浏览器支持Cookie,Servlet容器就将SessionID作为Cookie保存在浏览器的客户端。但如果出于安全的考虑,用户禁用了Cookie,那么Servlet容器又如何来跟踪会话呢?

首先让我们在IE中禁用Cookie(注意:对于某些GHOST的系统不起作用)。

IE>工具>Internet选项>隐私>高级,然后禁用Cookie:

我们可以在主页加上这样的超链接:(与下面代码中相关的SaveServlet.java GetServlet.java LogoutServlet.java的代码我放在最后面贴)

<h2>演示重写url技术---破解用户禁用cookie之后,我们session无效的问题</h2> 
<form action="<%=response.encodeURL("saveServlet") %>" method="post"> 
name:<input type="text" name="name"/><br/> 
<input type="submit"/> 
</form> 
<a href="<%=response.encodeURL("getServlet") %>">重写url-读取几个容器中的数据</a><br/> 
<a href="<%=response.encodeURL("logoutServlet") %>">重写url-安全退出</a> 

这句<form action=“<%=response.encodeURL(“/aa”)%>”>就可以实现这一功能

在这里禁用了cookie以后,浏览器仍然能够接收到服务器发送过来的cookie,但是浏览器只能接受不能发送出去给服务器,不能发送cookie的话也就不能够去session池中去取相应的对象了。

上面的代码在表单里面输入想要的值之后,再到下面的getServlet这里的超链接处访问看是不是仍然能够显示出输入的值,答案是肯定的。这里的访问路径就相当于类似

http://localhost:8080/day07_2/CNCookieServlet;jsessionid=F8692D61CD46D094DBB7A8FC7387649C 的,后面带的jsessionid=F8692D61CD46D094DBB7A8FC7387649C é seu id, assim, você pode acessar a URL na outra navegador também.
Aqui vou complementar: (A seguir, a situação é que eu escrevo o valor de JSESSIONID e o valor correspondente do objeto HttpSession no cookie do pool de sessão, esse cookie substitui o cookie gerado pelo sistema, é como eu mesmo criei, eu configurei o tempo de existência para dez minutos, se não substituir, o cookie desaparecerá quando o navegador for fechado e o fenômeno mencionado não aparecerá)

Em ambos os casos de desativar ou não desativar cookie, o id do objeto novo criado no pool de sessão é diferente, ou seja, se você inserir um valor de name no formulário quando desativar cookie, o resultado da consulta será como a seguir:

e jsessionid de2BB51EBDEAAF14D19656C71E1B6F9FF6

Depois disso, imediatamente mude para o modo de não desativar cookie, insira outro nome, como Tom, e o resultado da consulta naturalmente será dois Tom, jsessionid de

203F9E4DB5D874476B81DAF350661B6A, diferente do desativado, isso faz com que apareça o seguinte resultado

Depois disso, fechamos o navegador, entramos novamente no navegador, e vemos os resultados de acesso no modo de não desativar cookie, conforme a seguir:

A seguir, coloco o código principal aqui:

SaveServlet.java

package cn.hncu.servlets.session; 
import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.http.Cookie; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
public class SaveServlet extends HttpServlet { 
public void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
doPost(request, response); 
} 
public void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
response.setContentType("text/html;charset=utf-8"); 
PrintWriter out = response.getWriter(); 
request.setCharacterEncoding("utf-8"); 
String name=request.getParameter("name"); 
request.setAttribute("name", "request---"+name); 
request.getSession().setAttribute("name", "session---"+name); 
getServletContext().setAttribute("name", "application---"+name); 
//Um exemplo de aplicação que combina a tecnologia de cookie e a tecnologia de sessão---※Função: Deixar o usuário, após fechar o navegador, se10分钟之内能够登录本站,还能访问到session中的信息 
//向客户端写一个key为"JSESSIONID"用value为sessionid的cookie, 
Cookie c=new Cookie("JSESSIONID", request.getSession().getId()); 
c.setMaxAge(60*10);//上面的现象就是这一句造成的,没有这一句的话就不会有上面说的现象了 
c.setPath(request.getContextPath()); 
response.addCookie(c); 
out.println("保存成功..."); 
out.flush(); 
out.close(); 
} 
}

GetServlet.java

package cn.hncu.servlets.session; 
import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
public class GetServlet extends HttpServlet { 
public void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
response.setContentType("text/html;charset=utf-8"); 
PrintWriter out = response.getWriter(); 
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); 
out.println("<HTML>"); 
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); 
out.println(" <BODY>"); 
String reqName=(String) request.getAttribute("name"); 
String seName=(String) request.getSession().getAttribute("name"); 
String appName=(String) getServletContext().getAttribute("name"); 
out.println(reqName+"<br/>"); 
out.println(seName+"<br/>"); 
out.println(appName+"<br/>"); 
out.println(" </BODY>"); 
out.println("</HTML>"); 
out.flush(); 
out.close(); 
} 
}

LogoutServlet.java

package cn.hncu.servlets.session; 
import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
public class LogoutServlet extends HttpServlet { 
public void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
response.setContentType("text/html;charset=utf-8"); 
PrintWriter out = response.getWriter(); 
//Sair com segurança---Basta tornar o objeto sessão inválido. 
request.getSession().invalidate(); 
out.println("Saiu com segurança..."); 
} 
} 

O que foi mencionado acima é a gestão de sessão JavaWeb apresentada pelo editor para vocês. Espero que isso ajude. Se você tiver alguma dúvida, por favor, deixe um comentário, o editor responderá a você o mais rápido possível!

Declaração: O conteúdo deste artigo é extraído da Internet, pertencente ao respectivo proprietário. O conteúdo é contribuído e carregado voluntariamente pelos usuários da Internet. Este site não possui direitos de propriedade, não foi editado artificialmente e não assume responsabilidade por eventuais responsabilidades legais. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar e forneça provas relevantes. Apenas com a verificação, o site deletará imediatamente o conteúdo suspeito de violação de direitos autorais.)

Você também pode gostar