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