会话技术是什么?
在一次会话的范围内的多次请求和响应之间,共享数据。
一次会话是什么?
客户端浏览器第一次给web服务器资源发送请求,会话建立,直到有一方断开为止。
Cookie:客户端会话技术
介绍: cookie存储数据在客户端浏览器; 浏览器对单个cookie的大小限制为4KB,对同一个域名下最多存放20个Cookie; 每个cookie以键值对(name-value),且name是唯一的。相同名字时,后者会覆盖掉前者; 作用: cookie一般用于存出少量的不太敏感的数据 曾经登录过网站,再次进入,在不登录的情况下,完成服务器对客户端的身份识别进行自动登录; cookie存储分类 : 会话性:默认情况下,cookie存储在浏览器的内存中,当浏览器关闭后,Cookie数据被销毁; 持久性 :可以用setMaxAge(int seconds)设置cookie的生命周期,seconds是以秒为单位的时间: seconds是正数时 :将Cookie数据写到硬盘的文件中,并指定cookie存活时间,时间到后,cookie文件自动失效;seconds是负数时 :默认值;seconds是零时 :删除cookie信息; 原理 浏览器第一次发请求到服务器,服务器在响应头加上set-cookie的响应字段并返回给浏览器,当再次请求服务器时请求头cookie实现在一次会话内; 使用步骤
//0. 设置响应的消息体的数据格式以及编码response.setContentType("text/html;charset=utf-8");//1.创建Cookie对象,绑定数据Cookie cookie = new Cookie("name","王五");//2. 发送Cookie对象//2.1设置cookie的存活时间cookie.setMaxAge(60 * 60 * 24 * 7);//一周//2.2发送response.addCookie(cookie);//3.在另个Servlet获取Cookie,拿到数据Cookie[] cookies = request.getCookies();
Cookie中存储中文问题 在tomcat 8 之前 cookie中不能直接存储中文数据,否则会出现中文乱码,建议用tomcat 8以及之后的版本。 但是tomcat 8以及之后的版本对特殊字符不支持,建议使用URL编码存储,URL解码解析;
//获取当前时间的字符串
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
//解析当前时间转换为自定义的格式
String str_date = sdf.format(date);
//URL编码存储
str_date = URLEncoder.encode(str_date, "UTF-8");//获取Cookie的value,时间
String value = c.getValue();
//URL解码解析:
value = URLDecoder.decode(value,"utf-8");
Session:服务器端会话技术
介绍: 在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中(HttpSession)。 可以存储任意类型,任意大小的数据。 Session与Cookie的区别: session存储数据在服务器端,Cookie在客户端; session没有数据大小限制,Cookie大小限制4kb; session数据安全,Cookie相对于不安全。 原理:Session的实现是依赖于Cookie的 客户端发送一个请求到服务器端时,服务器会先检查请求中Cookie是否含有JSESSIONID? 没有JSESSIONID说明是第一次请求,服务器会创建一个session对象,并将该session对象的sessionid放到响应头的set-cookie中,客户端再请求时cookie中就会有一个name为JSESSIONID的cookie,value是sessionid; 有就会在服务器端查找sessionid与JSESSIONID的value是否相同,相同查找对应的session;所以Session的实现是依赖于Cookie的。 使用
//获取HttpSession对象
HttpSession session = request.getSession();//设置键值为name=lisi并往session中存放
session.setAttribute("name","lisi");//获取键名为name的值,并转换为string
String checkCode_session = String.valueOf(session.getAttribute("name"));//移除键名为name
session.removeAttribute("name");
session什么时候被销毁? 服务器关闭; session对象调用invalidate() ; session默认失效时间 30分钟; 可以配置修改,例如在Tomcat的conf文件中的web.xml,修改
30
当客户端关闭后,服务器不关闭,两次获取session是否为同一个? 默认情况下。不是。 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存 例:
//session.getId():获取sessionid
Cookie c = new Cookie("JSESSIONID",session.getId());
//设置cookie的存活时间
c.setMaxAge(60*60*24);//一天
response.addCookie(c);
客户端不关闭,服务器关闭后,两次获取的session是同一个吗? 不是,但是要确保数据不丢失。服务器自动完成 session的钝化和活化; session的钝化:在服务器正常关闭之前,将session对象系列化到硬盘上。 session的活化:在服务器启动后,将session文件转化为内存中的session对象。