09.会话控制
一、简介
- 由于HTTP协议是一个纯文本、无状态的协议。无状态:服务器不知道多个请求来自于那些用户。但是我们有时候有这样的需求,需要让服务器知道多个请求来自于同一个用户,例如购物,所以就有了会话控制。
- 会话控制中包含两种技术:Cookie和Session
二、Cookie
- Cookie是由服务器创建的用来区分不同用户的对象
- Cookie的运行原理
- 1)第一次向服务器发送请求时在服务器端创建一个Cookie对象
- 2)将Cookie对象发送给浏览器
- 3)以后再发送请求就携带着该Cookie对象
- 4)服务器根据不同的Cookie对象区分不同的用户
- 创建Cookie
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建Cookie对象
/*
注意:在创建Cookie对象时,Cookie对象的名字不能使用汉字,Cookie对象的值可以使用汉字,但是
需要指定字符集进行编码,然后获取的时候还需要指定字符集进行解码,所以建议不使用中文
*/
Cookie cookie = new Cookie("user", "admin");
Cookie cookie2 = new Cookie("user2", "admin2");
//2.将Cookie对象发送给浏览器
response.addCookie(cookie);
response.addCookie(cookie2);
}
- 获取Cookie
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取所有的Cookie对象
Cookie[] cookies = request.getCookies();
if(cookies != null){
//遍历得到每一个Cookie对象
for (Cookie cookie : cookies) {
//获取Cookie对象的名字
String name = cookie.getName();
//获取Cookie对象的值
String value = cookie.getValue();
System.out.println("Cookie的对象的名字是:"+name);
System.out.println("Cookie的对象的值是:"+value);
}
}
}
- 修改Cookie
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取Cookie对象
Cookie[] cookies = request.getCookies();
if(cookies != null){
for (Cookie cookie : cookies) {
//获取Cookie的名字
String name = cookie.getName();
//将名字是user的Cookie对象的值修改为SuperAdmin
if("user".equals(name)){
//修改该Cookie对象的值
cookie.setValue("SuperAdmin");
//将修改之后的Cookie对象发送给浏览器
response.addCookie(cookie);
}
}
}
}
- 设置Cookie对象的有效时间
- Cookie对象默认是会话级别的,关闭浏览器之后Cookie对象就失效,我们可以通过setMaxAge方法设置Cookie对象的有效时间
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建一个Cookie对象
Cookie cookie = new Cookie("user3", "persisCookie");
/*
设置Cookie对象的有效时间
setMaxAge(int age)
age>0:Cookie对象在age秒后失效
age=0:Cookie对象立即失效
age<0:默认,会话级别的Cookie对象
*/
cookie.setMaxAge(-1);
//将Cookie对象发送给浏览器
response.addCookie(cookie);
}
- Cookie的用途
- 1)广告推荐
- 2)免登录
- Cookie的缺陷
- 1)Cookie是明文的,不安全
- 2)不同的浏览器对Cookie大小和数量有限制
- 3)Cookie对象只能保存String类型的值
- 所以就有了Session
三、Session
-
Session即HttpSession,用来保存用户信息
-
Session的运行原理
- 1)第一次向服务器发送请求时在服务器端创建Session对象,该对象有一个全球唯一的ID。在创建Session对象的同时会创建一个特殊的Cookie对象,该Coookie对象的名字是JSESSIONID,该Cookie对象的值就是Session对象的ID值
- 2)将这个特殊的Cookie对象发送给浏览器
- 3)以后再发送请求就会携带着这个特殊的Cookie对象
- 4)服务器获取Cookie对象的value值后寻找与之对应的Session对象,因为Session对象中保存中用户信息,所以以此就可以区分不同的用户
-
创建Session对象和获取Session对象
- 如果项目中都是HTML页面,需要在Servlet中通过request.getSession()创建Session对象
HttpSession session = request.getSession();
- 如果项目中是Jsp页面,那么一访问Jsp页面Session对象就被创建,此时再通过Servlet的request调用getSession()方法获取的就是访问index.jsp页面创建Session对象
- 在一次会话中,只能使用一个Session对象
-
设置名字为JSESSIONID的Cookie对象的有效时间
- 由于Cookie对象默认是会话级别的,关闭浏览器之后Cookie对象将失效,再次打开浏览器将不再携带原来的名字为JSESSIONID的Cookie对象,也就无法无法获取服务器中对应的Session对象,就无法获取Session中保存的用户信息
- 我们可以通过设置名字为JSESSIONID的Cookie对象的有效时间达到获取Session中的用户信息的目的
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取Cookie对象 Cookie[] cookies = request.getCookies(); if(cookies != null){ for (Cookie cookie : cookies) { //获取Cookie的名字 String name = cookie.getName(); //判断是否是JSESIONID的Cookie对象 if("JSESSIONID".equals(name)){ //设置该Cookie对象的有效时间 cookie.setMaxAge(120); //将Cookie对象发送给浏览器 response.addCookie(cookie); } } } }
-
设置Session对象的最大空闲时间
- Session对象的最大空闲时间使30分钟,在Tomcat的web.xml中有对应的配置
<!-- ==================== Default Session Configuration ================= --> <!-- You can set the default session timeout (in minutes) for all newly --> <!-- created sessions by modifying the value below. --> <session-config> <session-timeout>30</session-timeout> </session-config>
- 我们也可以通过调用setMaxInactiveInterval()方法设置Session对象的最大空闲时间
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取Session对象 HttpSession session = request.getSession(); /* 设置Session对象的最大空闲时间 setMaxInactiveInterval(int age) age>0:Session对象空闲age秒后失效 age<=0:Session对象永远不失效 */ // session.setMaxInactiveInterval(30); //通过以下方式使Session对象立即失效 session.invalidate(); }
-
钝化和活化
- 钝化
- Session与session中保存的对象一起从内存序列化到硬盘的过程称为钝化
- 关闭服务器时会发生钝化的现象
- 活化
- Session与session中保存的对象一起从硬盘反序列化到内存的过程称为活化
- 重新启动服务器时会发生活化的现象
- Session中的对象要想正常的钝化和活化,对应的类以及类中的属性类型都需要实现序列化接口
- 钝化