会话技术
因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态。会话技术是帮助服务器记住客户端状态(区分不同的客户端)
从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。会话技术就是记录这次会话中客户端的状态与数据的。
会话技术分为Cookie和Session:
- Cookie:数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端 可以清除cookie
- Session:将数据存储到服务器端,安全性相对好,增加服务器的压力
一、Cookie技术
Cookie技术是将用户的数据存储到客户端的技术。
1、设置cookie
Cookie cookie = new Cookie("username","x5456"); // 创建cookie对象 cookie.setMaxAge(10*60); // 设置cookie有效期为10min,默认是到浏览器关闭时,设置为0清除cookie cookie.setPath("/WEB16"); // 设置cookie携带路径,默认会将整个web应用(/WEB16)戴上cookie response.addCookie(cookie); // 将cookie中存储的信息发送到客户端
注意:如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭 cookie信息销毁(会话级别的cookie),如果设置持久化时间,cookie信息会 被持久化到浏览器的磁盘文件里
cookie只能存除中文的字符串
2、获取指定的cookie
cookie信息是以请求头的方式发送到服务器端的
Cookie[] cookies = request.getCookies(); // 获取cookie列表 for(Cookie cookie : cookies){ // 遍历Cookie数组,通过Cookie的名称获得我们想要的Cookie if(cookie.getName().equals("username")){ String cookieValue = cookie.getValue(); System.out.println(cookieValue); } }
3、清除cookie
Cookie c = new Cookie("name",""); // key为要清除的cookie c.setMaxAge(0); c.setPath("/WEB16"); // 路径要和之前一样 response.addCookie(c);
二、Session技术
Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间。所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客户的唯一性标识JSESSIONID
1、向session域中存取数据
session也是一个域对象,所以也可以用get/set/remove方法
/* * request.getSession()方法内部会判断 该客户端是否在服务器端已经存在session * 如果该客户端在此服务器不存在session 那么就会创建一个新的session对象 * 如果该客户端在此服务器已经存在session 获得已经存在的该session返回 */ HttpSession session = request.getSession(); session.setAttribute("name","x5456"); // 设置Session String JSESSIONID = session.getId(); // 获取Session对象的编号id Cookie cookie = new Cookie("JSESSIONID",JSESSIONID); // 手动创建一个存储JSESSIONID的Cookie,为该cookie设置持久化时间 cookie.setPath("/WEB16"); cookie.setMaxAge(60*10); response.addCookie(cookie);
2、获得Session中的值
HttpSession session = request.getSession(); // 获取域对象 Object name = session.getAttribute("name"); System.out.println( (String) name);
Session对象的生命周期
创建:第一次执行request.getSession()时创建
销毁:
1)服务器(非正常)关闭时
2)session过期/失效(默认30分钟)
时间的起算点:从不操作服务器端的资源开始计时
可以在工程的web.xml中进行配置过期时间
<session-config>
<session-timeout>30</session-timeout>
</session-config>
3)手动销毁
session.invalidate();
作用范围:
默认在一次会话中,也就是说在,一次会话中任何资源公用一个session对象