Cookie和HttpSession使用与区别
Session和Cookie的主要区别
**1. Cookie:
- 保存在浏览器的文件中
- 键和值都是字符串类型
- Session
- 保存在服务器的内存中
- 值可以是Object 类型**
如何查看Cookie的数据
如何在不同的浏览器中查看Cookie的信息
Cookie的引入
- 疑问:常见的网站登录,保存密码,下次自动登录如何实现?用户的数据应该保存到哪里?
- 用户名和密码保存在浏览器端的Cookie中
- 下次登录的时候读取Cookie中数据,发送给服务器
- 服务器会验证用户名和密码,如果正确,则完成自动登录。
如何查看Cookie信息
注:不同的浏览器Cookie保存的格式是不同的,而且相互之间不能共享
在Chrome中
Cookie本质上是一个键值对,键和值都是字符串类型。
Cookie的执行原理
- 什么是Cookie
- Cookie的执行原理
什么是Cookie
特点:本质上键值对,一个Cookie对象只能保存一对键和值,键和值都是字符串类型。
大小:所有的Cookie大小不能超过4K
Cookie运行的原理
访问流程
1. 浏览器第1次访问服务器,没有Cookie。由服务器创建Cookie对象
2. 以响应头Set-Cookie发送给浏览器
3. 浏览器接收到Cookie的信息,将Cookie保存到本地硬盘上。
4. 下次访问的时候,再读取本地Cookie信息发送给服务器,服务器就可以接收到Cookie的信息。
小结
Cookie的数据结构是什么样的?
键值对,键和值都是字符串类型
Cookie的创建和写入
- 如何创建Cookie
- 如何将创建的Cookie写入到浏览器端
创建和写入的方法
创建Cookie的案例演示
需求:
在Servlet中创建一个Cookie(“user”,“NewBoy”),并且写到浏览器端去。
运行效果
步骤
- 使用构造方法创建Cookie对象
- 使用响应对象的方法将创建好的Cookie写入到浏览器端
- 使用Chrome浏览器查看发送到浏览器的Cookie数据
- 也可以在响应头中查看有没有Set-Cookie响应头
代码
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
Cookie的创建和写入
*/
@WebServlet(name = "Demo1CookieServlet", urlPatterns = "/demo1")
public class Demo1CookieServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建Cookie对象,提供键和值
Cookie man = new Cookie("user", "NewBoy");
//通过响应对象写入到浏览器端
response.addCookie(man);
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("向浏览器写入了一个Cookie");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
查询响应头
设置Cookie过期的时间
如何设置Cookie的过期时间
设置Cookie过期时间的方法
案例:设置Cookie的过期时间
需求:
在写入Cookie之前先设置Cookie过期的时间,设置为10分钟以后过期
效果
步骤
- 创建Cookie
- 设置Cookie过期的时间,单位是秒
- 写入到浏览器端
代码
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
Cookie的创建和写入
*/
@WebServlet(name = "Demo1CookieServlet", urlPatterns = "/demo1")
public class Demo1CookieServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建Cookie对象,提供键和值
Cookie man = new Cookie("user", "NewBoy");
//在写入之前设置过期的时间,单位是秒
man.setMaxAge(60 * 10); //10分钟
//通过响应对象写入到浏览器端
response.addCookie(man);
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("向浏览器写入了一个Cookie");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
查询响应头和浏览器的信息
读取Cookie的信息
目标
如何从浏览器读取Cookie的信息到服务器
读取Cookie的方法
演示案例
需求
- 修改写入的Servlet,创建两个Cookie
- 创建Servlet读取所有Cookie信息,显示在浏览器上。
步骤
- 调用request.getCookies()返回一个Cookie对象数组
- 如果数组为null,打印没有读取到Cookie
- 如果不为空,则遍历每个Cookie对象:getName() getValue()
代码
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "Demo3ReadServlet", urlPatterns = "/demo3")
public class Demo3ReadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//1. 调用request.getCookies()返回一个Cookie对象数组
Cookie[] cookies = request.getCookies();
//2. 如果数组为null,打印没有读取到Cookie
if (cookies==null) {
out.print("没有读取到Cookie的信息");
}
//3. 如果不为空,则遍历每个Cookie对象:getName() getValue()
else {
for (Cookie cookie : cookies) {
out.print("键:" + cookie.getName() + ",值:" + cookie.getValue() + "<hr/>");
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
执行效果
浏览器查看请求头
小结
HttpServletRequest对象 | 作用 |
---|---|
Cookie[ ] getCookies() | 读取浏览器发送的所有Cookie数组 |
Cookie类的方法 | 作用 |
---|---|
String getName() | 得到键 |
String getValue() | 得到值 |
Cookie中使用特殊字符
目标
Cookie中使用特殊字符的情况
特殊字符
注:在Tomcat8中cookie值中不能使用分号 ; 、逗号(,)、等号(=)以及空格,可以直接使用汉字。
使用特殊字符步骤
- 在创建cookie之前使用URL编码
- 将编码后的数据存入cookie
- 读取时,获取到cookie之后,解码数据,显示正常的数据
URL编码和解码的方法
案例:使用特殊字符
需求
- 向Cookie中写入一个字符串"Hello World"
- 再读取出来显示到浏览器上
步骤
- 创建写入的Servlet
- 写入前URL编码
- 创建Cookie
- 设置过期的时间
- 写入Cookie
- 创建读取的Servlet
- 得到浏览器端所有的Cookie信息
- 如果没有Cookie返回的空
- 如果有则遍历,读取其中的键和值
- 值需要使用URL解码后输出
代码
写入
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
/**
写入特殊字符
*/
@WebServlet(name = "Demo4SpecialServlet", urlPatterns = "/demo4")
public class Demo4SpecialServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//对特殊字符使用URL编码
Cookie cookie = new Cookie("say", URLEncoder.encode("Hello World","utf-8"));
response.addCookie(cookie);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
读取
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
/**
读取特殊字符
*/
@WebServlet(name = "Demo5ReadServlet", urlPatterns = "/demo5")
public class Demo5ReadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//读取Cookie的数组
Cookie[] cookies = request.getCookies();
if (cookies!=null) {
for (Cookie cookie : cookies) {
//值要进行解码操作
out.print(cookie.getName() + "=" + URLDecoder.decode(cookie.getValue(),"utf-8") + "<br/>");
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
## 案例:得到用户上次访问的时间
目标
- 创建CookieUtils工具类读取Cookie中的数据
- 通过此案例学习Cookie的多次读取和写入
- Cookie中特殊字符的处理
需求
- 如果用户是第一次访问,则输出:您好,您是第1次访问!当前的时间是xxx
- 把这次访问服务器的时间写到Cookie中,注意空格的处理。
- 如果之前已经访问过,则从Cookie中得到上次访问的时间,显示:您好,欢迎您再次访问。上次访问的时间是:xxxx,当前的时间是xxxxx。
分析
步骤
-
创建一个CookieUtils,方法:从Cookie中取一个名字为name的值,如果有则返回值,没有则返回空。
public static String getCookieValue(HttpServletRequest request , String name)
-
从Cookie中取一个叫visited的信息,如果为null,则表示第一次访问
-
否则读取Cookie的信息,并且显示上次访问的时间
-
无论上次访问时间是否为空,都把这次访问的时间写入Cookie中
代码
CookieUtils
package com.itheima.utils;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
/**
创建一个CookieUtils工具类
*/
public class CookieUtils {
/**
从Cookie中取一个名字为name的值,如果有则返回值,没有则返回空。
*/
public static String getCookieValue(HttpServletRequest request , String name) {
//1. 得到所有的Cookie,返回数组
Cookie[] cookies = request.getCookies();
//2. 判断是否为空,如果不为空则遍历
if (cookies!=null) {
//3. 如果name与cookie的name相同
for (Cookie cookie : cookies) {
if (cookie.getName().equals(name)) {
//则返回它的值
return cookie.getValue();
}
}
}
//4. 如果没有找到name或cookie的数组为空,返回null
return null;
}
}
Servlet
package com.itheima.servlet;
import com.itheima.utils.CookieUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
得到上次访问的时间 */
@WebServlet(name = "Demo6VisitedServlet", urlPatterns = "/demo6")
public class Demo6VisitedServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//使用工具类读取一个叫visited的键
String value = CookieUtils.getCookieValue(request, "visited");
String now = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss").format(new Date());
//如果为空,则表示是第1次访问
if (value == null) {
out.print("<h2>欢迎您第1次访问,现在的时间是:" + now + "</h2>");
} else {
//不为空,value表示上一次的时间
out.print("<h2>欢迎再次访问,上次的时间是:" + URLDecoder.decode(value, "utf-8") + "</h2>");
out.print("<h3>现在的时间是:" + now + "</h3>");
}
//无论是否为空,这次的时间都要写到浏览器
Cookie cookie = new Cookie("visited", URLEncoder.encode(now,"utf-8"));
//设置过期的时间
cookie.setMaxAge(60 * 60 * 24 * 30); //1个月过期
//写入到浏览器
response.addCookie(cookie);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
效果
小结
1. 得到现在的时间
2. 从Cookie中取一个叫visited的信息,如果为null,则表示第一次访问
3. 否则读取Cookie的信息,并且显示上次访问的时间
4. 无论上次访问时间是否为空,都把这次访问的时间写入Cookie中
5. 设置过期的时间,保存一个月
6. 写入到浏览器
7. 注:要编码和解码
设置Cookie的访问路径
- 设置访问路径的作用是什么?
- 如何设置访问路径
设置路径的方法
设置路径的案例
需求
创建一个Cookie,设置过期时间,设置Cookie的访问路径
效果
步骤
- 创建一个Cookie
- 设置过期的时间
- 设置它的访问路径
- 写入到Cookie中
代码
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
设置Cookie的访问路径
*/
@WebServlet("/demo7")
public class Demo7PathServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建Cookie对象,提供键和值
Cookie man = new Cookie("user", "NewBoy");
//在写入之前设置过期的时间,单位是秒
man.setMaxAge(60 * 10); //10分钟
//设置访问路径
man.setPath("/aaa");
//通过响应对象写入到浏览器端
response.addCookie(man);
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("向浏览器写入了1个Cookie");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
- 如果没有设置访问地址,默认是当前项目的访问地址。如果没有项目的访问地址,使用/
如果访问路径是setPath(“/day-cookie”),以下路径浏览器会发送Cookie给服务器?
访问地址 | 能否访问到Cookie |
---|---|
http://localhost:8080/day-cookie/ | 会 |
http://localhost:8080/day-cookie/aa/bb | 会 |
http://localhost:8080/day/ | 不会 |
http://localhost:8080/ | 不会 |
删除Cookie
目标
学习删除Cookie的方法
方法
案例:删除指定的Cookie
需求
删除指定的Cookie信息,注意Cookie的访问路径要相同
步骤
- 创建一个同名的Cookie
- 最好设置它的访问路径
- 设置它的过期时间为0
- 写入到浏览器,可以实现Cookie的删除
代码
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
删除Cookie
*/
@WebServlet(name = "Demo8DeleteServlet", urlPatterns = "/demo8")
public class Demo8DeleteServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建一个Cookie,键要同名,值设置为空
Cookie cookie = new Cookie("visited",null);
//2. 设置过期时间为0
cookie.setMaxAge(0);
//3. 写入到浏览器端
response.addCookie(cookie);
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("删除了Cookie");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
HttpSession对象的方法(重点)
- 如何得到会话对象
- 学习HttpSession接口中常用的方法
Session存储数据的特点
- 数据是保存在服务器端的内存中,以键和值的方式存在。
- 每个用户都会在服务器上有一个会话,一个会话保存一个用户的数据。
- 会话之间的数据不能共享
- 每个会话在服务器上都有过期的时间
HttpSession接口的方法
得到会话的方法
创建会话的时机:用户第1次访问的时候,创建会话。
会话接口中的方法
例:会话接口中方法的演示
步骤
- 得到会话对象
- 使用会话对象使用上面的各个方法
效果
代码
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Timestamp;
/**
学习与会话有关的方法
*/
@WebServlet(name = "Demo1SessionServlet", urlPatterns = "/demo1")
public class Demo1SessionServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//得到会话
HttpSession session = request.getSession();
out.print("会话对象:" + session + "<hr/>");
//得到会话的ID,格式是:32位的十六进制的数据,在同一个服务器是唯一的。
out.print("会话的ID: " + session.getId() + "<hr/>");
out.print("得到会话创建的时间:" + new Timestamp(session.getCreationTime()) + "<hr/>");
out.print("得到上一次访问的时间:" + new Timestamp(session.getLastAccessedTime()) + "<hr/>");
out.print("现在的时间:" + new Timestamp(System.currentTimeMillis()) + "<hr/>");
out.print("判断是否是新的会话:" + session.isNew() + "<hr/>");
out.print("得到上下文对象:" + session.getServletContext());
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
小结
HttpSession接口方法 | 作用 |
---|---|
String getId() | 得到会话的ID |
long getCreationTime() | 得到会话创建的时间 |
long getLastAccessedTime() | 得到上次访问的时间 |
boolean isNew() | 判断是否是新的会话 |
ServletContext getServletContext() | 得到上下文域 |
会话域的操作方法(重点)
与会话域有关的操作方法
讲解
会话域中的方法
范围:一个用户访问的多次请求都可以使用
示案例
需求
通过1个案例学习上面方法的使用
执行效果
- 先执行向会话域中添加值的Servlet
2.再执行从会话域中取值的Servlet
3.另一个浏览器执行的效果
实现步骤
- 创建SetServlet中,向Session域中添加一件字符串商品:洗衣机
- 创建另一个GetServlet中,从Session中取出商品并输出在网页上。
- 首先使用一个浏览器存和取
- 然后在另一个浏览器中取,看能不能取出来
代码
SetServlet.java
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
/**
向请求域中添加键和值
*/
@WebServlet(name = "Demo2SetServlet", urlPatterns = "/demo2")
public class Demo2SetServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("向会话域中添加了值");
//得到会话域
HttpSession session = request.getSession();
//向会话域中添加值
session.setAttribute("product","洗衣机");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
GetServlet.java
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
从会话域中取出值
*/
@WebServlet(name = "Demo3GetServlet", urlPatterns = "/demo3")
public class Demo3GetServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print(request.getSession().getAttribute("product"));
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
结果分析
查看SetServlet中响应头
以Cookie的方式将会话ID发送给浏览器
会话访问的原理
目标
- 学习Session的会话原理
- 案例:保存会话ID到Cookie中
原理图
访问流程
- 不用浏览器是不同的会话,同一个浏览器的不同标签页是同一个会话。
- 浏览器第1次访问服务器,调用getSession()方法,由服务器创建一个会话,并且分配会话ID
- 通过Cookie的方式将会话ID发送给浏览器
- 浏览器下次访问的时候,通过Cookie把会话ID发送给服务器。
- 服务器通过会话ID来识别不同的用户
疑问
-
如果浏览器关闭,服务器上的会话信息是否还存在?
还在存在的,一直到会话过期。服务器上会话也是有过期的时间的。
-
浏览器关闭以后,还能不能得到之前会话域中的信息?
不能,因为浏览器关闭Cookie就失效,没有会话ID,也就得不到服务器上还存在的会话信息。
-
有没有可能让浏览器关闭还可以再访问服务器上没有过期的信息?
可能,只要手动保存会话的ID到Cookie中,并且设置过期的时间就可以了。
演示案例
步骤
- 创建会话对象
- 得到会话的ID
- 创建一个Cookie,将它的名字设置为JSESSIONID,值为上面的会话ID
- 设置过期时间为30分钟
- 写入到浏览器
代码
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
/**
向请求域中添加键和值
*/
@WebServlet(name = "Demo2SetServlet", urlPatterns = "/demo2")
public class Demo2SetServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("向会话域中添加了值");
//得到会话域
HttpSession session = request.getSession();
//向会话域中添加值
session.setAttribute("product","洗衣机");
//创建Cookie
Cookie cookie = new Cookie("JSESSIONID", session.getId());
//设置过期时间30分钟
cookie.setMaxAge(60 * 30);
response.addCookie(cookie);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
效果
修改会话过期时间的三种方式
方式一:通过代码
示例:设置会话过期的时间为10秒,输出过期的时间,输出会话ID
代码
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
/**
修改会话过期的时间
*/
@WebServlet(name = "Demo4IntervalServlet", urlPatterns = "/demo4")
public class Demo4IntervalServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//得到会话
HttpSession session = request.getSession();
//设置过期的时间是10秒
session.setMaxInactiveInterval(10);
out.print("会话的ID: " + session.getId() + "<hr/>");
out.print("会话过期的时间间隔:" + session.getMaxInactiveInterval() + "秒<br/>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
方式二:可以通过web.xml的配置来实现
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--配置会话过期的时间-->
<session-config>
<!--单位是分钟-->
<session-timeout>5</session-timeout>
</session-config>
</web-app>
疑问:如果同时使用代码和配置的方式以哪个为准?
以代码为准
方式三:立刻失效
修改会话过期的时间有哪三种方式?
- 通过代码:setMaxInactiveInterval(),单位是秒
- 通过配置文件:session-timeout 单位是分
- 立刻失效:session.invalidate()