一文读懂之Cookie和Session

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");
发布了219 篇原创文章 · 获赞 352 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/qq_42859864/article/details/103965488