本文共 3508 字,大约阅读时间需要 11 分钟。
在之前学习HTTP时我们说:标准HTTP协议既有优点也有缺点,优点在于极大地减轻了服务器的压力,每一次请求不会造成不必要连接占用;缺点在于繁复地建立连接和断开连接,请求会传输大量重复的信息,所以随后出现了Keep-Alive、Cookie、HttpSession在某些程度上弥补了标准HTTP的缺点。在上一篇博客我们学习了Cookie,在本篇博客中我们来一起学习HttpSession
与客户端技术Cookie技术不同,HttpSession是服务端技术。在WEB开发中,服务器可为用户的每个浏览器创建一个会话对象即HttpSession。默认情况下,一个浏览器独占一个HttpSession对象。因此,服务器程序可将用户数据存入用户浏览器对应的独占的HttpSession中,当用户使用浏览器访问当前应用下的其它程序时,其它程序也可以从该HttpSession中取出该用户的数据。
HttpSession对象由服务器创建
开发人员可调用request.getSession()得到该对象
在同一个会话下多个Servlet可共享数据
比如用户访问一个含有多个Servlet的网站,那么这些Servlet可共享一个HttpSession。比如,登录后把User存放到HttpSession后其他Servlet都可以使用该对象,并且在结算Servlet时用此对象判断用户是否登录。还记得之前的ServletContext么?对于存放在ServletContext中的数据,其它用户也有权限访问,但是存放在HttpSession中的数据其他应用是无法访问的。
Cookie只能存字符串但是HttpSession可以存对象
服务器重启时会将HttpSession中的数据保存到服务器硬盘,并在重启完成后将这些数据恢复到内存中。但是请注意这些数据要实现序列化否则无法保存和还原。
请看如下代码:
/** * 本文作者:谷哥的小弟 * 博客地址:http://blog.csdn.net/lfdfhl */package cn.com;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;import javax.servlet.http.HttpSession;public class TestHttpSession extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String NAME="name"; String JSESSIONID="JSESSIONID"; response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter writer = response.getWriter(); HttpSession httpSession = request.getSession(); String httpSessionID=httpSession.getId(); String name=(String) httpSession.getAttribute(NAME); Cookie[] cookies = request.getCookies(); for(int i=0;cookies!=null&&i"+"JSESSIONID="+cookie.getValue()+""); } } if(httpSessionID!=null){ writer.println(" "+"httpSessionID="+httpSessionID+"
"); } if(name==null){ writer.println(""+"还没有存放数据"+"
"); httpSession.setAttribute(NAME, "zxx9527"); }else{ writer.println(""+"从HttpSession中获取到数据name="+name+"
"); } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }}
代码解析如下:
运行后如效果如下图所示:
在刚才的示例中我们只调用了一句request.getSession()就可以开始对HttpSession的操作,那么这句代码的内部到底做了哪些事情呢?
通过之前的讲解我们知道:HttpSession是依赖于Cookie的,如果用户禁用了Cookie此时也就谈不上什么HttpSession了。所以,我们需要方法应对该情况的发生。
解决方案:利用response.encodeURL( )方法对网站的所有URL进行重写
在重写URL后新的URL中就会包含JSESSIONID的值,比如JSESSIONID=30578BE1BD6600C2908607EE381BBB9B,从而将JSESSIONID携带至服务端。