1、Cookie饼干
1.1、什么是Cookie?
1.2、Cookie的使用
1.2.1、Cookie的创建
1.2.2、Cookie的获取
1.2.3、Cookie值的修改
1.2.4、Cookie生命控制
1.2.5、cookie路径Path设置
1.4、Cookie用户名免输入
2、Session会话
2.1、什么是Session?
2.2、Session的使用
2.2.1、Session创建和获取
2.2.2、Session数据的存取
2.2.3、Session 生命周期控制
2.2.6、浏览器和Session关联的技术内幕
1、Cookie饼干
1.1、什么是Cookie?
Cookie,翻译是小饼的意思。它是一种服务器告诉浏览器以键值对形式存储小量信息的技术。
1.2、Cookie的使用
1.2.1、Cookie的创建
1.先创建一个Servlet编写创建Cookie的代码,
2.然后打开浏览器访问Servlet程序。
3.按下F12.查看Cookie内容。

1)图解Cookie的创建过程:

2)Cookie的创建代码:
/**
* Cookie的代码
*/
public class CookieServlet extends BaseServlet {
private static final long serialVersionUID = 1L;
protected void createCookie(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Cookie的创建
Cookie cookie = new Cookie("cookie-name", "cookie-Value");
Cookie cookie2 = new Cookie("cookie-name2", "cookie-Value2");
// 告诉浏览器保存
response.addCookie(cookie);
response.addCookie(cookie2);
response.getWriter().write("已创建Cookie……");
}
}
记住,访问的时候,一定不是把html的页面托到浏览器中访问,而是在浏览器里输出地址,通过访问Tomcat服务器访问页面。
3)浏览器工具--查看结果:
谷歌浏览器,直接按下F12功能键,会弹出调试工具,选择Resource-----Cookies----localhost查看localhost域名下的cookie
1.2.2、Cookie的获取
1)图解Cookie的获取过程

2)获取Cookie的代码:
protected void getCookie(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取所有cookie对象
Cookie[] cookies = request.getCookies();
// 如果没有cookie,则返回null。
if (cookies != null) {
// 有cookie则遍历
for (Cookie cookie : cookies) {
response.getWriter().write("Cookie名:" + cookie.getName()
+ "<br/>Cookie值:" + cookie.getValue() + "<br/><br/>");
}
} else {
response.getWriter().write("没有Cookie");
}
}
1.2.3、Cookie值的修改
1)图解修改Cookie值的过程:

2)修改Cookie值的代码:
protected void updateCookie(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 创建一个已存在key的Cookie对象
Cookie cookie = new Cookie("cookie-name", null);
// 修改Cookie的值
cookie.setValue("this is new value");
// 通知浏览器保存修改
response.addCookie(cookie);
response.getWriter().write("Cookie…已修改值");
}
1.2.4、Cookie生命控制
Cookie对象的.setMaxAge( ) 方法控制Cookie的存活。
Cookie的默认存活时间(会话)setMaxAge为负数,表示会话级。也就是说浏览器一旦关闭,Cookie就会被删除。
Cookie的删除 setMaxAge 零表示马上删除。表示浏览器一收到响应,马上就会删除Cookie。
Cookie的保存 setMaxAge 正数表示多少秒之后删除
当我们创建一个新Cookie的时候。Cookie的默认存活时间为会话时间。也就是只要一关浏览器。cookie就会过期,被删除。
当我们调用setMaxAge( 0 ) 为零的时候。表示浏览器一收到响应后,就马上删除Cookie
当我们调用setMaxAge( 正页 ) 的时候,表示Cookie将在多少秒后过期。
1)图解Cookie过期时间被修改的过程:

2)修改Cookie过期时间的代码:
protected void deleteCookie(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取Cookie
Cookie[] cookies = request.getCookies();
Cookie cookie = null;
if (cookies != null) {
// 查找出我们需要修改的Cookie对象
for (Cookie c : cookies) {
// 获取键为cookie-name的cookie对象
if ("cookie-name".equals(c.getName())) {
cookie = c;
break;
}
}
}
if (cookie != null) {
// 负数表示浏览器关闭后删除,正数表示多少秒后删除
// 设置为零,表示立即删除Cookie
cookie.setMaxAge(0);
response.addCookie(cookie);
response.getWriter().write("删除Cookie……");
}
}
1.2.5、cookie路径Path设置
设置Cookie的Path路径,只需要调用Cookie对象的setPath方法即可
当我们调用setPath方法设置有效路径为/hello/abc路径
那么下面几个路径能访问到Cookie的是
/hello/abc 能获取Cookie
/hello/xxxx.xxx 不能获取Cookie
/hello/abc/xxx.xxx 能获取Cookie
/hello/abc/a/b/c 能获取Cookie
1)设置Cookie对象Path属性的代码
protected void setPath(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 创建一个Cookie对象
Cookie cookie = new Cookie("cookie-path", "test");
// 设置Cookie的有效访问路径为/day14/abc/下所有资源
cookie.setPath(request.getContextPath() + "/abc");
// 通知浏览器保存修改
response.addCookie(cookie);
response.getWriter().write("设置Cookie…的path路径");
}
1.4、Cookie用户名免输入
需求:第一次登录之后,一个星期内免输入用户名登录。
1)服务器Servlet的代码
protected void login(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取请求参数
String username = request.getParameter("username");
String password = request.getParameter("password");
if ("admin".equals(username) && "admin".equals(password)) {
// 创建Cookie
Cookie cookie = new Cookie("username", username);
// 设置过期时间为一个星期
cookie.setMaxAge(60 * 60 * 24 * 7);
// 通知浏览器保存
response.addCookie(cookie);
response.getWriter().write("登录成功!");
} else {
response.sendRedirect(request.getContextPath() + "/login.jsp");
}
}
2)WebContent/login.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="cookieServlet?action=login" method="post">
用户名:<input name="username" type="text" value="${ cookie.username.value }" /><br />
密码:<input name="password" type="text" value="" /><br />
<input type="submit" value="提 交" />
</form>
</body>
</html>
1.3、Cookie的总结:
创建Cookie
Cookie cookie = new Cookie(key,value); 默认浏览器关闭就会过期
response.addCookie( cookie ); 通知浏览器。一定要调用浏览器才收到
获取Cookie request.getCookies(); 获取所有Cookie
修改Cookie的值
Cookie cookie = new Cookie(key,null); 只要创建一个已经存在的Cookie
cookie.setValue( 新Value ); 设置新的值
response.addCookie( cookie ); 通知浏览器修改
修改Cookie的有效时间。
setMaxAge( 负数 ) 表示浏览器关闭就会过期
setMaxAge( 0 ) 表示收到响应就会过期
setMaxAge( 正数 ) 表示多少秒后过期
修改Cookie的Path路径
setPath( “/xxxx/xxxx” ) 设置 Cookie的有效访问路径
比如设置为/hello/abc,则下面几个路径访问的结果是
/hello/abc 能获取Cookie
/hello/xxxx.xxx 不能获取Cookie
/hello/abc/xxx.xxx 能获取Cookie
/hello/abc/a/b/c 能获取Cookie
2、Session会话
2.1、什么是Session?
首先Session是jsp中九大内置对象之一。
其次Session是一个域对象。
然后Session是在服务器端用来保存用户数据的一种技术。并且Session会话技术是基于Cookie实现的。(浏览器关闭,session也将失联)
2.2、Session的使用
2.2.1、Session创建和获取(id号,是否为新)
request.getSession() 创建或获取Session对象 ( 第一次访问是创建Session对象。之后调用都是获取Session )

1)下面是获取Session和创建Session。以及获取Session的 ID编号,获取Session是否是新创建的示例代码:
public class SessionServlet extends BaseServlet {
private static final long serialVersionUID = 1L;
public SessionServlet() {
}
protected void getSession(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(request.getHeader("Cookie"));
// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
HttpSession session = request.getSession();
// 输出会话id号,和是否是新创建
// session.getId()返回Session的唯一编号
// session.isNew()返回当前Session是否是刚创建的
response.getWriter().write(
"session ID:" + session.getId() + "<br/>是否是新的:" + session.isNew());
}
}
第一次访问的结果:

之后每次访问的结果:

2.2.2、Session数据的存取
Session域对象数据的存取和其他三个域对象PageContext、Request、ServletContext是一样的。只需要调用下面两个方法。
setAttribute 设置属性
getAttribute 获取属性
编写下面的java代码去访问,就可以在Session域中设置属性,和获取属性。
protected void setAttribute(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
HttpSession session = request.getSession();
// 设置数据
session.setAttribute("abc", "abc value");
response.getWriter().write("设置属性值成功!");
}
protected void getAttribute(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
HttpSession session = request.getSession();
// 设置数据
String value = (String) session.getAttribute("abc");
response.getWriter().write("获取abc的属性值:" + value);
}
2.2.3、Session 生命周期控制
int getMaxInactiveInterval() 获取超时时间。以秒为单位。
setMaxInactiveInterval ( 时间 ) 设置用户多长时间没有操作之后就会Session过期。以秒为单位。
如果是正数。表示用户在给定的时间内没有任意操作,Session会话就会过期。
如果是负数。表示Session永不过期。
Session默认存活时间
Session默认的过期时间为30分钟。默认是在tomcat的conf目录下web.xml配置文件中(对部署在本服务器下的所有项目而言)。

我们也可以在自己工程的web.xml文件中配置Session会话的超时时间为10分钟。
记住一点,我们在web.xml文件中配置的Session会话超时时间是对(本项目下)所有Session都生效的。
<!-- 设置Session默认的过期时间 -->
<session-config>
<!-- 以分钟为单位。10分钟超时 -->
<session-timeout>10</session-timeout>
</session-config>
Session在3秒之后超时
// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
HttpSession session = request.getSession();
// 设置过期时间为3秒
session.setMaxInactiveInterval(3);
Session在1分钟之后超时
// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
HttpSession session = request.getSession();
// 设置过期时间为1分钟
session.setMaxInactiveInterval(60);
Session在1小时之后超时
// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
HttpSession session = request.getSession();
// 设置过期时间为1小时
session.setMaxInactiveInterval(60 * 60);
Session在1天之后超时
// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
HttpSession session = request.getSession();
// 设置过期时间为1天
session.setMaxInactiveInterval(60 * 60 * 24);
Session在1周之后超时
// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
HttpSession session = request.getSession();
// 设置过期时间为1周
session.setMaxInactiveInterval(60 * 60 * 24 * 7);
Session永远不超时
// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
HttpSession session = request.getSession();
// 设置永远不超时
session.setMaxInactiveInterval(-1);
Session马上超时(失效)
// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
HttpSession session = request.getSession();
// 让Session对象立即过期
session.invalidate();
2.2.6、浏览器和Session关联的技术内幕
在前面的演示中我们发现。一旦浏览器关闭之后。我们再去获取Session对象。就会创建了一个新的Session对象。这是怎么回事呢。现在让我们来看一下。这一系列操作过程中的内幕细节

通过上图的分析,我们不难发现。当浏览器关闭之后。只是因为浏览器无法再通知服务器,之前创建的Session的会话id是多少了。所以服务器没办法找到对应的Session对象之后,就以为这是第一次访问服务器。就创建了新的Session对象返回。