1、session是由服务器建立的,并保存在服务器上。服务器会为每一个浏览器创建一个session。如果访问的资源中调用了reques.getSession()方法,那就会创建一个HttpSession,并产生一个JSESSIONID。
2、服务器响应浏览器时,则响应中会包含cookie(set-cookie),cookie的值中会放入JSESSIONID的值
3、浏览器会将这个cookie放入内存中
4、浏览器再次请求时,会将这个cookie放在请求头中,给服务器发送请求
5、服务器会在缓存中查找等于JSESSIONID的session的内容,并发送给浏览器
场景:
1、用户登录某系统后,创建了session(这个session中存入了此用户的用户名,并保存在服务器上),并产生了JSESSIONID。同时本地浏览器会保存这个JSESSIONID。
2、进入某个菜单时需要知道这个用户的用户名,那么这时不需要用户再次输入用户名。当发送请求时在请求头中加入JSESSIONID,服务器会在缓存中查找等于JSESSIONID的session的内容,并发送给浏览器
测试:
1、首先创建一个TestServlet,继承自HttpServlet
public class TestServlet extends HttpServlet{ public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException { HttpSession session=request.getSession();//创建session response.setContentType("text/html;charset=utf-8"); response.getWriter().write("查看是否有cookie:"); //判断session是不是新建的 if(session.isNew()) { response.getWriter().write("新建session,JSESSIONID="+session.getId()); session.setAttribute("username1", "admin");//将数据保存到session中 }else { response.getWriter().write("session已经存在,JSESSIONID="+session.getId()); response.getWriter().write((String)session.getAttribute("username1")); } } }
知识点:
(1)用HttpServletRequest 的getSession()方法获取HttpSession;
(2)用HttpSession的setAttribute方法设置session
(3)用HttpSession的getAtrribute方法获取session
(4)用HttpSession的getId()方法获取session的id
2、在web.xml中创建TestServlet类所映射的访问路径
<servlet> <servlet-name>testServlet</servlet-name> <servlet-class>com.htkeystone.rqi.test.TestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>testServlet</servlet-name> <url-pattern>/SessionServlet</url-pattern> </servlet-mapping>
3、在浏览器中访问http://localhost:8081/htRQI/SessionServlet ,浏览器输出如下:
可见,浏览器新建了session。
4、打开浏览器的session界面,如下图:
上图中的“内容”就是session的id。
5、再次访问http://localhost:8081/htRQI/SessionServlet ,浏览器输出如下:
可见浏览器没有再创建新的session,并且取出了username1所对应的值。
打开浏览器,按F12打开开发者工具,点击网络,并打开捕获按钮,重新刷一下界面。访问:http://localhost:8081/htRQI/SessionServlet
双击对应访问路径这一行,可以看到请求标头中包含了cookie。