Session会话简介与基本知识点
当浏览器第一次访问服务器时,无论先访问哪一个页面,服务器就会给用户分配一个唯一的会话标识,即jsessionid然后以cookie的形式返回给用户。
会话是指在一段时间内,用户使用同一个浏览器进程与Web应用之间的交互过程。
会话(Session)通常用来跟踪用户的状态,缓存用户在此浏览器进程中的信息。
当用户关闭浏览器,上一个Session也就无法再次获得了(Cookie的maxAge为-1的情况)。再次打开新的浏览器,将开始一个新的会话。
类javax.servlet.http.HttpSession。每一个HttpSession代表用户的一个会话。
每一个Session的过期时间默认为30分钟。
服务器给每个用户创建一个会话,即HttpSession对象,保存在服务器端。
那么,当用户再次访问服务器时,服务器是如何知道还是当前用户呢?
当浏览器再次访问服务器时,会携带包含了jsessionid的cookie访问服务器。服务器根据此id返回此用户的HttpSession对象,就保持了会话。
每一个Session都一个唯一标识,即ID。
当浏览器获取一个新的Session时,用户即可以通过session.geId();打印出ID的值 。
再不关闭浏览器的情况下,在多个页面上跳转,使用的是同一个Session。
画图演示:
1、演示request,session,servletContext这3个容器:
index.jsp:
<h1>演示session技术</h1> <h2>演示request,session,servletContext这3个容器</h2> <form action="SaveServlet" method="post"> name:<input type="text" name="name"/> <input type="submit" /> </form> <br/> <a href="GetServlet">读取这3个容器中的数据</a>
web.xml:
<servlet> <servlet-name>SaveServlet</servlet-name> <servlet-class>cn.hncu.servlets.session.SaveServlet</servlet-class> </servlet> <servlet> <servlet-name>GetServlet</servlet-name> <servlet-class>cn.hncu.servlets.session.GetServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>SaveServlet</servlet-name> <url-pattern>/SaveServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>GetServlet</servlet-name> <url-pattern>/GetServlet</url-pattern> </servlet-mapping>
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 doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //System.out.println("aaaaa"); 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); this.getServletContext().setAttribute("name", "servletContext---"+name); //把cookie技术和session技术联合起来做应用的一个例子--- //功能:让用户在关闭浏览器之后,如果5分钟之内再登陆本网站,还能访问到session //其实原理很简单,就是向客户端写一个key为"JSESSIONID",value用sessionid的cookie //System.out.println(request.getSession().getId()); //System.out.println(request.getSession().getAttribute("JSESSIONID"));//这个的值是null Cookie c = new Cookie("JSESSIONID", request.getSession().getId()); c.setMaxAge(60*5);//5分钟后过期 c.setPath(request.getContextPath());//权限给本站的所有网页/servlet //---根据客户端无论访问那个网站的哪个网页都会有JSESSIONID可以知道,这个的权限路径肯定是项目根目录下面 response.addCookie(c); out.print("<h1>保存成功!</h1>"); //System.out.println("bbbbbb"); 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 sessName = (String) request.getSession().getAttribute("name"); String contName = (String) request.getServletContext().getAttribute("name"); out.print(reqName+"<br/>"); out.print(sessName+"<br/>"); out.print(contName+"<br/>"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } }
演示结果:
我再到另外一个浏览器打开:
可以看到session的name值没有了。