HttpSession对象
用来解决Http无状态的技术。数据存储在服务器中。
特点
- Session将数据保存在服务器端
- HttpSession使用Key-Value的结构存储数据,Key是字符串类型,Value是Object类型
- HttpSession存储数据相对于Cookie来说是无大小限制的
- HttpSession存储数据比较安全,因为数据存储在服务器中,用户不可见
介绍
- 一个浏览器在服务器中只会创建一个Session对象。不同用户(浏览器)的Session对象之间是互相独立的。
- 服务器中会创建Session对象,创建完成后会将Session对象的Id(JSESSIONID)以Cookie的形式保存在客户端(浏览器)。存储JSESSIONID的Cookie不需要手动创建,Session对象创建完成,Tomcat服务器会自动创建Cookie, 将JESSIONID存储在Cookie中响应回浏览器。
- 用户再次发请求时,会携带该Cookie,也就是JSESSIONID到服务器,服务器会根据该Id找到用户的Session对象。
- 当用户JSESSIONID的Cookie丢失或者服务器中存储的Session对象被销毁,服务器接收到用户的请求后,如果找不到对应的Session对象,会重新创建,并将新的JSESSIONID以Cookie的形式保存到浏览器中。
- Cookie默认的有效期为一次会话(浏览器不能关闭),浏览器关闭,Cookie即失效。
- Session对象在Tomcat服务器的默认有效期为30分钟。
HttpSession的使用
HttpSession对象的创建是通过request.getSession()方法来创建的。客户端浏览器在请求服务端资源时,如果在请求中没有jsessionid,getSession()方法将会为这个客户端浏览器创建一个新的HttpSession对象,并为这个HttpSession对象生成一个jsessionid,在响应中通过状态Cookie写回给客户端浏览器、如果在请求中包含了jsessionid,getSession()方法则根据这个ID返回与这个客户端浏览器对应的HttpSession对象。
getSession()方法还有一个重载方法getSession(true|false)。当参数为true时与getSession()方法作用相同。当参数为false时则只去根据jsessionid查找是否有与这个客户端浏览器对应的HttpSession,如果有则返回,如果没有jsessionid则不会创建新的HttpSession对象。
HttpSession的创建
HttpSession session = req.getSession();
存在两种情况:
-
如果请求的Cookie中携带了JSESSIONID,则根据JSESSIONID找对应的Session对象
-
找到, 返回该Session。
-
没有找到, 创建新的Session对象, 会将JSESSIONID存储在Cookie中响应回浏览器。
-
-
如果请求中没有携带JSESSIONID,则会创建一个Session对象, 会将JSESSIONID存储在Cookie中响应回浏览器
HttpSession存储数据
session.setAttribute("自定义名", 要存储的数据);
HttpSession获取数据
session.getAttribute("与存储数据的自定义名相同");
HttpSession销毁
HttpSession销毁有两种方式:
1.当HttpSession对象存在达到设置的存活时间后会销毁,默认为30分钟,时间的计算方式是根据最后一次请求时间作为起始时间来计算。
-
Tomcat服务器的conf/web.xml文件中配置HttpSession的超时时间,这个文件是所有项目web.xml的父文件,不建议修改。
-
可以修改项目的web.xml中的HttpSession的超时时间。该时间对整个web项目中的所有HttpSession对象有效。
<session-config>
<!--设置Session的超时时间,单位是分钟-->
<session-timeout>10</session-timeout>
</session-config>
2.调用HttpSession对象中的invalidate()方法销毁Session对象。
注意:
客户端关闭浏览器后,再次打开浏览器发起请求。此时因为存储JSESSIONID的Cookie随会话关闭销毁,服务器会重新创建Session对象。服务器端原有的Session对象不会立刻销毁,存储的数据也存在Session对象中,当超过了最大存活时间后就会销毁。
Session中的相关方法
HttpSession session = req.getSession();
String id = session.getId();//获取JSESSIONID
System.out.println(id);
long creationTime = session.getCreationTime();//获取创建时间
Date date = new Date(creationTime);
System.out.println(date.toLocaleString());
long lastAccessedTime = session.getLastAccessedTime();//获取最后一次访问时间
System.out.println(new Date(lastAccessedTime).toLocaleString());
session.setMaxInactiveInterval(10);//设置最大非活动时间
int maxInactiveInterval = session.getMaxInactiveInterval();//获取最大非活动时间
System.out.println(maxInactiveInterval);
session.invalidate();//销毁session对象
HttpSession和Cookie的区别
1.Cookie将数据存储在客户端,而HttpSession将数据存储在服务器
2.Cookie不安全,而HttpSession相对来说就比较安全
3.单个Cookie能存储的数据有大小限制(大约4kb),而且很多浏览器都会限制一个域名保 存的Cookie的数量。
HttpSession没有存储容量及数量的限制,随着Session中存储的内容增多,会比较占用服务器内存,但是一般Session不存放业务数据。
4.Cookie的数据都是以字符串的形式保存的。Session中可以保存对象。
5.Cookie应用场景 如:要进行记住我的操作,最近浏览的商品,网页皮肤等操作。
Session应用场景 如:保留用户的登录信息,保留错误信息,购物车等操作。
HttpSession和Cookie的关系
Session依赖于Cookie
基于注解式开发Servlet
相对于在web.xml中配置Servlet,使用@WebServlet注解完成Servlet的配置更为方便快捷。
@WebServlet(name = "first", value = "/first", loadOnStartup = 1, initParams = {@WebInitParam(name = "test", value = "aaa")}, description = "测试servlet")