Cookie和Session【会话控制】
会话控制
流程控制:控制程序执行流程
会话控制:控制程序会话机制
会话:浏览器与服务器通信机制【状态】,浏览器不关闭且不更换即为当前会话
Cookie简介
概述
- Cookie是由服务器创建,存储在浏览器端。
- Cookie是存储少量信息的技术。
- Cookie作用:服务器区分不同浏览器。
工作原理
- 浏览器向服务器发送请求
- 服务器创建Cookie对象,Cookie对象中存储用户信息,最终将Cookie发送浏览器。
- 浏览器以后再次请求服务器时,携带Cookie对象。
- 服务器通过Cookie对象中信息,区分不同浏览器。
Cookie的使用
Cookie创建
// 创建Cookie对象
Cookie cookie = new Cookie("level","level-1");
// 将Cookie存储到浏览器
response.addCookie(cookie);
Cookie的获取
// 获取Cookie【方式1】
String cookie1 = request.getHeader("Cookie");
// 获取Cookie【方式2】--推荐使用
Cookie[] cookies = request.getCookies();
Cookie修改
// 方式1【找到指定Cookie,修改value】
for(Cookie cookie2:request.getCookies()){
if("level".equals(cookie2.getName())){
cookie2.setValue("level-2");
response.addCookie(cookie2);
break;
}
}
// 方式2【新建同名Cookie,覆盖原来的Cookie】--推荐使用
Cookie cookie3 = new Cookie("level","level-2");
response.addCookie(cookie3);
Cookie的API
cookie.getName() ; //返回cookie中设置的key
cookie.getValue(); //返回cookie中设置的value
Cookie键值对字符集问题
Cookie的name不支持中文字符集;
Cookie的value支持中文字符集,如果要使用中文字符集,需要设置底层编码字符集【UTF-8】,比较繁琐,这里更简易使用英文;
如果在Cookie中必须使用中文,需要做如下设置
// 设置编码
Cookie cookie = new Cookie("level", URLEncoder.encode("会员1","UTF-8"));
response.addCookie(cookie);
// 设置解码
URLDecoder.decode(cookie.getValue(),"UTF-8");
Cookie的时效性
Cookie持久化
Cookie默认--【会话级别】:浏览器不关闭并且不更换那么Cookie始终有效【重启浏览器或者更换浏览器Cookie失效】。在浏览器端,Cookie数据存在于内存中。
【持久化Cookie】:重启浏览器依然需要Cookie对象有效。在浏览器端,Cookie数据会被保存到硬盘上。Cookie在硬盘上存在的时间根据服务器端限定的时间来管控,不受浏览器关闭的影响。持久化Cookie到达了预设的时间会被释放。
方法:
cookie.setMaxAge(int expiry):ss是正整数,单位:秒。
- ss > 0:设置Cookie持久化事件为ss秒【ss秒之后Cookie对象失效】
- ss = 0:设置Cookie对象立即失效
- ss < 0:设置Cookie对象默认为会话级别
注意事项:
- 一旦设置Cookie持久化,默认会话级别失效
- 持久化Cookie对象后,依然无法跨越浏览器共享Cookie对象
Cookie有效路径
上网时间长了以后,浏览器本地会保存很多Cookie。对于浏览器来说,访问互联网资源时不能每次都把所有Cookie带上。浏览器会使用Cookie的domain和path属性值和当前访问的地址进行比较,从而判断是否携带这个Cookie。
我们可以通过调用cookie的setPath()方法和setDomain()方法来设置cookie的domain和path。
Cookie默认有效路径:当前上下文路径下有效
设置有效路径:setPath()
一般设置有效路径,均会设置在上下文路径下。
Cookie域名
域名的设置——setDomain()方法
Cookie应用
需求
1 使用Cookie实现10天免登录
2 使用Cookie实现10天免输入
示例代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<h2>登录页面</h2>
<form action="UserServlet?method=login" method="post">
用户名:<input type="text" name="username" value="${cookie.username.value}"><br>
密码:<input type="password" name="pwd" value="${cookie.pws.value}"><br>
10天免输入:<input type="checkbox" name="cb" value="cb"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
//1.获取请求参数
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
String cb = request.getParameter("cb");
System.out.println("cb = " + cb);
//2. 调用service【略】
if (cb != null) {
//3. 将用户名&密码存储Cookie中
Cookie unCookie = new Cookie("username",username);
Cookie pwdCookie = new Cookie("pws",pwd);
//持久化Cookie10天
unCookie.setMaxAge(60*60*24*10);
pwdCookie.setMaxAge(60*60*24*10);
//将cookie响应浏览器
response.addCookie(unCookie);
response.addCookie(pwdCookie);
}
//4. 跳转路径
response.sendRedirect(request.getContextPath()+"/login_success.jsp");
Cookie缺陷
- Cookie的value是String类型,存储数据不灵活【Object】
- Cookie是存储浏览器端,相对不安全【服务器】
- Cookie数量过多,会浪费数据流量
- 各个浏览器厂商对Cookie均有限制【大小2-5kb,数量200-500个左右】
Session
Session简介
概述
- Session是四大域对象之一
- Session是会话控制对象之一
使用
1 Servlet获取Session对象的方式:request.getSession()
2 session的常用API:
- setAttribute()
- getAttribute()
- removeAttribute()
Session工作原理【重要】
步骤1:浏览器向服务器发送请求【第一次:request.getSession()】
这里为什么是getSession?
只有请求中涉及到Session的话,服务器才会开始检测是否有Session,是否需要初始化一个Session。否则也没有必要使用Session,浪费空间。
步骤2:服务器创建Session对象,同时也会创建特殊Cookie对象【name:JSESSIONID,value:session的id】,最终将Cookie响应到浏览器端。
步骤3:浏览器优厚再次发送请求时,携带Cookie对象
步骤4:服务器通过Cookie对象,查询Session对象,从而通过Session对象区分不同浏览器。
Session程序中的工作原理【扩展版】
-
浏览器向服务器发送请求【不是第一次:request.getSession()】,原则上服务器不会创建Session对象,会获取已经创建Session对象使用
-
是否可以获取Session对象【由两个条件制约】
-
条件1:判断特殊Cookie是否存在
-
存在
-
条件2:判断Session对象是否存在 【Session对象默认最大空闲时间为:30min】(在服务器的web.xml中设置的,如下)
<session-config> <session-timeout>30</session-timeout> </session-config>如果Session存在,获取Session直接使用就可以了;
如果Session不存在:返回步骤2,执行一遍流程。
-
-
不存在,返回步骤2,执行一遍流程。
-
-
Session的时效性
Session默认--【会话级别】:浏览器不关闭且不更换Cookie始终有效,重启浏览器或者更换浏览器Cookie失效。
Session持久化
-
首先持久化特殊Cookie——cookie.setMaxAge(ss);
-
在持久化Session【时间<=30min,那么这个步骤可以省略】
非活动时间【空闲时间】:在使用Session这一刻开始计时,为空闲时间。
-
全局设置:web.xml配置文件
<!--设置session非活动时间[空闲时间]为30分钟--> <session-config> <session-timeout>30</session-timeout> </session-config> -
局部设置:
-
session.setMaxInactiveInterval(ss);整数【int】,单位:秒
- ss>0:设置session空闲时间为ss秒
- ss<=0:设置session永不失效【永久有效】
示例代码
//先持久化特殊Cookie
for (Cookie cookie : request.getCookies()) {
if("JSESSIONID".equals(cookie.getName())){
//持久化特殊Cookie
// cookie.setMaxAge(20);
cookie.setMaxAge(200);
response.addCookie(cookie);
break;
}
}
//再持久化Session【时间<=30分钟,该步骤可省略】
HttpSession session = request.getSession();
session.setMaxInactiveInterval(20);
注意事项
持久化Session不可跨越浏览器。
Session失效的四种情况
-
Session对象空闲时间达到了目标设置的最大值,自动释放
-
Session对象被强制失效
//强制Session失效 session.invalidate(); -
Web应用卸载
-
服务器进程停止
Session的钝化和活化
1.Session【会话域】与浏览器有关,与服务器“无关”【重启服务器,是不会影响Session对象的】。
2.Session是由服务器创建的。
什么是Session钝化
Session在一段时间内没有被使用或者关闭服务器时,会将当前存在的Session对象以及Session对象中的数据从内存序列化到磁盘的过程,我们称之为钝化。
什么是Session活化
Session被钝化之后,服务器再次调用Session对象或者重启服务器时,将Session对象以及Session对象中的数据从磁盘反序列化到内存的过程,我们称之为活化。
注意
session中的数据,同时需要序列化以及反序列化,如下
public class Student implements Serializable{}
如何开启服务器的钝化活化
如图所示
步骤1:打开服务器设置
步骤2:勾选session复选框【preserve session across restarts and redeploys --在重启和重新部署时保持会话】