四、Cookie、Session
1、Cookie:客户端会话技术(小饼干)
-
使用步骤:
- 创建Cookie对象,绑定数据 : new Cookie(String,String)
- 发送Cookie对象,通过response传递给浏览器 :response.addCookie(Cookie cookie)
- 获取Cookie拿到数据,通过下一次的请求 :Cookie[] request.getCookies()
-
实现原理:
-
添加一个Cookie进入response响应体时,会有响应头set-Cookie以键值对的形式发送给浏览器 -
当浏览器再发送一次请求的时,会有请求头Cookie以键值对的形式发送给服务器 -
基于响应头Set-Cookie和请求头Cookie实现 -
关于Cookie的一些细节点:
-
一次可不可以发送多个Cookie?
- 可以,可以创建多个Cookie对象,使用response调用多次addCookie发送cookie即可
-
Cookie在浏览器中保存多长时间?
- 默认情况下,当浏览器关闭时,Cookie数据就被清除
- 持久化存储:setMaxAge(int seconds)
- 参数为整数:将Cookie数据写到硬盘中,持久化存储,并指定Cookie的存活时间
- 参数为负数:默认值(即浏览器关闭,Cookie自动清除)
- 参数为零:删除Cookie的信息
-
Cookie能不能存储中文?
- Tomcat 8 之前 :Cookie不能存储中文,需要使用中文数据转码——URL编码
- Tomcat 8 之后 :支持中文数据,但是还是不吃特殊字符,还是要使用URL编码,URL解码
- URL编码 :String URLEncode(String str,String enc)
- URL解码 :String URLDecode(String str,String enc)
-
Cookie的共享问题?
-
一个Tomcat服务器中部署了多个web项目,这些web项目能不能共享?
- 默认情况下,Cookie不能共享
- setPath(String path):设置Cookie的获取范围,默认情况下,设置当前的虚拟目录
-
不同的Tomcat服务器之间Cookie如何共享?
-
Cookie的特点以及作用:
- 特点:
- Cookie存储数据在客户端浏览器
- 浏览器对于单个Cookie的大小由限制(4kb)以及对同一个域名下的总Cookie数量有限制(20个)
- 作用:
- Cookie一般用于存储少量不太敏感的数据
- 在不登录的情况下,完成服务器对客户端的身份认证
2、使用Cookie会话技术完成记住上一次访问时间案例
-
需求:
- 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问
- 如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串
-
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
Cookie[] cookies = req.getCookies();
boolean flag = true;
if (cookies != null && cookies.length > 0){
for (Cookie cookie : cookies) {
String name = cookie.getName();
if ("lastTime".equals(name)){
flag = false;
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
String format = dateFormat.format(date);
format = URLEncoder.encode(format, "UTF-8");
cookie.setValue(format);
resp.addCookie(cookie);
String value = cookie.getValue();
value = URLDecoder.decode(value, "UTF-8");
resp.getWriter().write("<h1>欢迎回来,您上次的访问时间为:" + value + "</h1>");
break;
}
}
}
if (cookies == null || cookies.length < 0 || flag){
LocalDateTime time = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 hh:mm:ss");
String timeValue = formatter.format(time);
timeValue = URLEncoder.encode(timeValue, "UTF-8");
Cookie cookie = new Cookie("lastTime", timeValue);
cookie.setMaxAge(60 * 60 * 24 * 30);
resp.addCookie(cookie);
resp.getWriter().write("<h1>你好欢迎您首次访问</h1>");
}
}
3、Session:服务器会话技术(主菜)
-
概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中HttpSession -
使用HTTPSession对象:
- 获取HttpSession对象:HttpSession session = request.getSession();
- 使用HttpSession对象:
- Object getAttribute(String name)
- void setAttribute(String name,Object value)
- void removeAttribute(String name)
-
Session原理:Session的实现是基于Cookie的 -
关于Session使用的一些细节:
-
当客户端浏览器关闭后,服务器不关闭,两次获取Session是否为同一个?
-
默认情况下,不是同一个 -
如果需要相同,可以创建Cookie,键为JSESSIONID,设置最大存活时间,让Cookie持久化保存 Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60 * 60);
resp.addCookie(cookie);
-
客户端不关闭,服务器关闭后,两次获取Session是否是同一个?
- 不是同一个,但是要确保数据不丢失,Tomcat已完成一下工作
- Session的钝化(序列化):在服务器正常关闭之前,将Session对象序列化到硬盘上
- Session的活化(反序列化):在服务器启动后,将Session文件转换为内存中的Session对象即可
-
Session怎么被销毁?
-
服务器关闭Session会被销毁 -
Session调用invalidate()方法,会将当前Session对象销毁 -
Session默认失效时间为 30分钟,可以进行配置 <session-config>
<session-timeout>30</session-timeout>
</session-config>
-
Session的特点:
- Session用户存储一次会话多次请求的数据,存在服务器端
- Session可以存储任意类型数据,任意大小
4、Session和Cookie的区别:
- Session存储数据在服务器端,Cookie在客户端
- Session存储数据没有大小和类型的限制,Cookie有
- Session数据安全,Cookie相对不安全
5、使用Session实现验证码登录案例
ession可以存储任意类型数据,任意大小
4、Session和Cookie的区别:
- Session存储数据在服务器端,Cookie在客户端
- Session存储数据没有大小和类型的限制,Cookie有
- Session数据安全,Cookie相对不安全
5、使用Session实现验证码登录案例
|