Cookie和Session是为了解决HTTP协议无状态特性而产生的. 换句话讲, Cookie和Session就是为了保存请求和响应过程中的数据的. Cookie是保存在客户端的, Session是保存在服务器端的.
1.Cookie
1.1 概念
Cookie, 饼干. 是保存在客户端的少量信息. Cookie是一个类, 在Servlet中创建, 保存了一些少量的信息, 之后发送到客户端浏览器, 浏览器进行存储, 在后续的访问中, 浏览器会自动携带Cookie信息发送到服务器端.
Cookie信息包含一个名称, 一个值和若干可选的属性. 有些浏览器处理可选属性时可能由bug, 所有要谨慎使用, 常用的可选属性有: 路径, 域限定符和最大存活时间.
1.2 代码实现
public class CookieServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("CookieServlet.service");
// 创建Cookie并保存数据
Cookie c1 = new Cookie("mouse", "Logic");
// 发送到浏览器
resp.addCookie(c1);
// 设置Cookie的存活时间
Cookie c2 = new Cookie("keyboard", "vprd");
// 正整数: 表示最大存活时间
// 负整数: 表示浏览器关闭则删除cookie
// 0: 表示立即删除Cookie
c2.setMaxAge(100);
// 设置访问域, 例如.jd.com
c2.setDomain("localhost");
resp.addCookie(c2);
// 设置访问路径
Cookie c3 = new Cookie("screen", "DELL");
c3.setPath("/bjsxt");
resp.addCookie(c3);
}
}
1.3 Cookie的特点
- 默认情况下, Cookie被保存在浏览器的内存中, 只要浏览器不关闭, Cookie就有效, 一旦浏览器关闭, 内存释放, Cookie就无效了;
- 可以通过调用setMaxAge(expiry)方法设置Cookie的存活时间, 正整数表示最大存活时间, 负整数表示关闭浏览器删除Cookie, 0表示立刻删除Cookie; 一旦设置最大存活时间, Cookie将被存放在客户端硬盘中, 到期后自动删除;
- 可以调用setDomain(domain)方法设置Cookie的访问域, 表示只有在指定的访问域中才可以携带Cookie;
- 可以调用setPath(path)方法设置Cookie的访问路径, 表示只有符合路径要求时, 才会携带该Cookie.
1.4 获取Cookie
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + ": " + cookie.getValue());
}
2.Session
2.1 概念
Session, 会话. 用来在服务器端保存用户信息, 实现跨页面和多次访问时标识客户. 而Session的跟踪需要依赖Cookie, Session建立时, 会自动创建一个Cookie叫JSESSIONID, 用来记录Session的编号, 发送到客户端浏览器进行保存, 后续客户端会携带Cookie继续访问服务器, 通过JSESSIONID可以定位到Session.
2.2 Session的生命周期
- 创建: 第一次请求时创建
- 无效:
- 客户端丢失JSESSIONID, 无法定位session, 例如关闭浏览器;
- session被销毁, 服务器重启;
- session过期, 默认session的有效时间是30分钟, 在tomcat的conf/web.xml
- 可以调用setMaxInactiveInterval(interval)方法设置最大不活动时间, 单位是秒
- 可以调用invalidate()方法立刻销毁session
public class SessionServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 服务器自动创建HttpSession对象,当客户端第一次请求时即创建
// 如何获取到已创建的HttpSession, 需要通过请求对象来获取
HttpSession session = req.getSession();
// 设置最大不活动时间间隔, 单位是秒
// 两次请求间的间隔不能超过10秒, 如果超过10秒, session就无效了
session.setMaxInactiveInterval(10);
// 查看session的编号, 就是Cookie中存放的JSESSIONID
System.out.println(session.getId());
// 立刻销毁session
session.invalidate();
}
}
3.Servlet中的三大作用域
作用域, 指的是一个存储空间, 在不同情况下用来保存一些信息. 一共有三种作用域, 分别是: HttpServletRequest, HttpSession, ServletContext. 使用作用域时, 掌握三个方法即可: setAttribute, getAttribute, removeAttribute.
3.1request作用域
对应的对象是HttpServletRequest, 生命周期: 一次请求, 只有在这次请求中才有效. 当使用request作用域时, 页面跳转方式只能使用请求转发.
// 向作用域存放数据
req.setAttribute("reqId", reqId);
// 从作用域取值
Object attr = req.getAttribute("reqId");
// 从作用域删除值
req.removeAttribute("reqId");
3.2session作用域
对应的对象是HttpSession, 生命周期: 第一次请求到来时创建session, session失效分为三种情况:
- 1是客户端丢失JSESSIONID,
- 2是服务器重启
- 3是session超时.
// 向作用域存放数据
req.getSession().setAttribute("sId", sId);
// 从作用域取值
Object attr = req.getSession().getAttribute("sId");
// 从作用域删除值
req.getSession().removeAttribute("sId");
3.3application作用域
对应的对象是ServletContext, 生命周期: 应用部署时被创建, 应用卸载或服务器关机时被销毁. 被所有用户共享.
// 向作用域存放数据
getServletContext().setAttribute("appId", appId);
// 从作用域取值
Object attr = getServletContext().getAttribute("appId");
// 从作用域删除值
getServletContext().removeAttribute("appId");