十四、Cookie和Session
1、Cookie饼干
1.1、什么是Cookie?
1、内容
1、Cookie翻译是意思是饼干
2、Cookie 是服务器通知客户端保存键值对的一种技术
3、客户端有了Cookie后,每次请求都会发送服务器。
4、每个Cookie的大小不能超过4kb
1.2、如何创建Cookie
1、图解

2、例子
protected void creatCookie(HttpServletRequest req ,HttpServletResponse resp) throws IOException {
// 创建cookie对象
Cookie cookie = new Cookie("key1","value1");
// 通知客户端保存数据
resp.addCookie(cookie);
Cookie cookie2 = new Cookie("key2","value2");
// 通知客户端保存数据
resp.addCookie(cookie2);
resp.getWriter().write("cookie创建成功");
}
1.3、服务器如何获取Cookie值
1、图解

2、代码
1、Cookie工具类代码
public class CookieUtils {
public static Cookie findCookie(String name, Cookie[] cookies){
if(name==null || cookies==null || cookies.length==0){
return null;
}
for (Cookie cookie:cookies){
if(name.equals(cookie.getName())){
return cookie;
}
}
return null;
}
}
2、例子代码
protected void getCookie(HttpServletRequest req ,HttpServletResponse resp) throws IOException {
Cookie [] cookies = req.getCookies();
for (Cookie cookie :cookies){
// 查询指定的cookie
Cookie iwantCookie = CookieUtils.findCookie("key1",cookies);
// getName返回cookie中的key
// getValue返回cookie中的value
resp.getWriter().write("cookie:"+cookie.getName()+"==="+cookie.getValue()+"<br/>");
if(iwantCookie!=null){
resp.getWriter().write("找到了需要的Cookie:"+iwantCookie.getName());
}
}
}
1.4、Cookie值的修改
1、方法一
1、创建一个要修改的同名(key)的cookie对象
2、在构造器中,同时赋予新的Cookie值
3、调用response.addCookie(Cookie);
4、例子
protected void updateCookie(HttpServletRequest req ,HttpServletResponse resp) throws IOException {
// 方法一:
// 创建一个要修改的同名cookie对象
// 在构造器,同时赋予新的cookie值
Cookie cookie = new Cookie("key1","newValue1");
// 调用response.addCookie
resp.addCookie(cookie);
}
2、方法二
1、查找到需要修改的Cookie对象
2、调用setValue()方法赋予新的Cookie值
3、调用response.addCookie()通知客户端保存修改
4、例子
protected void updateCookie(HttpServletRequest req ,HttpServletResponse resp) throws IOException {
// 方法二:
// 查询需要修改的cookie对象
Cookie cookie = CookieUtils.findCookie("key1",req.getCookies());
if(cookie!=null){
// 调用setValue()方法赋予新的Cookie值
cookie.setValue("newValue2");
// 调用response.addCookie()通知客户端保存
resp.addCookie(cookie);
}
}
1.5、浏览器如何查看Cookie
1、谷歌例子

2、火狐例子

1.6、Cookie生命控制
1、什么是生命控制
1、Cookie的生命控制:如何管理Cookie什么时候被销毁(删除)
2、方法:setMaxAge()
1、setMaxAge()方法:设置生命周期
(1)当里面参数为正数:表示指定秒后过期
(2)当参数为负数:表示浏览器关闭,Cookie就会被删除(默认为-1)
(3)当参数为0时:表示马上删除Cookie
3、例子:设置存货运行时的Cookie
protected void life3600(HttpServletRequest req ,HttpServletResponse resp) throws IOException {
Cookie cookie = new Cookie("life3600","life3600");
cookie.setMaxAge(60*60);//设置Cookie一个小时后被删除,无效
resp.addCookie(cookie);
resp.getWriter().write("已结创建了存活一小时的cookie");
}
4、例子:立马删除Cookie
protected void deleteNow(HttpServletRequest req ,HttpServletResponse resp) throws IOException {
// 找到需要删除的cookie对象
Cookie cookie = CookieUtils.findCookie("key2",req.getCookies());
if(cookie!=null){
// 调用setMaxAge(0)
cookie.setMaxAge(0);
// 调用response.addCookie()通知客户端保存
resp.addCookie(cookie);
resp.getWriter().write("key2已结被删除了");
}
}
1.7、Cookie有效路径的path设置
1、内容
1、Cookie的path属性可以有效的过滤哪些Cookie可以发送给服务器。
2、path属性是通过请求的地址进行有效的过滤
3、例子

2、例子
protected void testPath(HttpServletRequest req ,HttpServletResponse resp) throws IOException {
Cookie cookie = new Cookie("path1","path1");
// getContextPath()得到工程路径
cookie.setPath(req.getContextPath()+"/abc");
resp.addCookie(cookie);
resp.getWriter().write("创建了一个带有工程路径的cookie");
}
1.8、Cookie练习:免输入用户名登录
1、图解

2、代码实现
1、login.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="http://localhost:8080/13_cookie_session/loginServlet" method="get">
用户名:<input type="text" name="username" value="${cookie.username.value}"><br/>
密码:<input type="password" name="password"><br/>
<input type="submit" name="sub" value="点击登录">
</form>
</body>
</html>
2、LoginServlet.java
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username =req.getParameter("username");
String password = req.getParameter("password");
if("123456".equals(username) &&"123456".equals(password)) {
// 成功
Cookie cookie = new Cookie("username" ,username);
cookie.setMaxAge(60*60*24);
resp.addCookie(cookie);
System.out.println("登录成功");
}else {
// 失败
System.out.println("登录失败");
}
}
}
2、Session会话
2.1、什么是Session会话
1、内容
1、Session是一个接口(HTTPSession)
2、Session就是一个会话,它是用来维护一个客户端和服务器之间关联的技术
3、每个客户端都有自己的一个Session会话。
4、Session会话中,我们经常用来保存用户登录之后的信息。
2.2、创建Session和获取(id号,是否更新)
1、创建和获取的API都是一样的
1、创建Session和获取
1、request.getSession()
(1)第一次调用:创建Session会话
(2)之后调用都是:获取前面创建好的Session会话对象
2、获取id号
1、通过session.getId()方法,可以获取唯一的id
2、每个会话都有一个id值,这个id是唯一的
3、判断session是获取还是判断
1、isNew():方法判断session是不是新创建的
(1)true:是
(2)false:不是
(3)返回值是:boolean
4、例子
protected void creatOrGetSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 创建session对象
HttpSession session = req.getSession();
// 判断是不是第一次创建
boolean isNew = session.isNew();
// 获取session会话的唯一id
String id = session.getId();
resp.getWriter().write("得到session,她的id为:"+id);
resp.getWriter().write("得到的session是不是第一次创建:"+isNew);
}
2.3、Session域数据的存取
1、取出Session域中的数据
1、通过req.getSession().getAttribute():方法获取
2、设置Session域中的数据
1、通过req.getSession().setAttribute():方法获取
3、例子
/**
* 往session设置数据
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().setAttribute("key1","value1");
resp.getWriter().write("已经在Session保存了数据");
}
/**
* 往session得到数据
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object attribute = req.getSession().getAttribute("key1");
resp.getWriter().write("获取的数据为:"+attribute);
}
2.4、Session生命周期控制
1、内容
1、public void setMaxInactiveInterval(int interval):设置 Session 的超时时间(以秒为单位)
2、超过指定的时长,Session 就会被销毁。
3、设置的值interval为正数:设定的时长到达后超时
4、设置的值interval为负数:永不超时
5、Session的默认超时时长为30分钟
2、超时的概念

3、修改tomcat中Session的默认超时
1、在tomcat服务器配置文件中的web.xml默认有以下配置进行修改
2、
\
\
\
4、修改个人的web工程中Session的默认超时
1、在个人的web工程下的web.xml配置中修改
\
\
\
5、修改个别的Session超时时长
1、使用API中的public void setMaxInactiveInterval(int interval)方法来进行设置
2、例子
protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session =req.getSession();
session.setMaxInactiveInterval(3);
resp.getWriter().write("默认时长为:3秒后超时");
}
2.5、浏览器和Session之间关联的技术内幕
1、内容
1、Session技术,底层其实是基于Cookie技术来实现的
2、图解
