Cookie和Session
Cookie和Session是什么
Cookie和Session是两种会话数据的保存方式。其中,Cookie是客户端技术,Session是服务端技术。
两者具体的类封装在(时代变了)javax.servlet.httpjakarta.servlet.http包中,依赖jakarta.servlet-api包即可使用jakarta.servlet.http下的类。
Cookie
存储位置
存储在客户端,一般保存在本地用户目录下的appdata中。生命周期
默认会话结束后消失(存于内存中)。通过
setMaxAge(int time)可以设置cookie的有效期(单位是s,存到硬盘):- 默认值为
-1 - 如果设为
0,立即删除 
- 默认值为
 缺陷
大小和数量限制:一般每个站点大约能保存20个cookie,大小限制在4kb以内。浏览器一般有300个cookie上限。
**数据安全性问题:**http请求中的cookie是明文传递的。以存储网站的上次访问时间为例:
public class CookieDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 解决中文乱码
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");
        PrintWriter out = resp.getWriter();
        // 从客户端获取Cookie
        Cookie[] cookies = req.getCookies();
        // 判断cookies是否存在
        if (cookies != null) {
            out.write("你上次访问的时间是:");
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("lastLoginTime")) {
                    long lastLoginTime = Long.parseLong(cookie.getValue());
                    Date date = new Date(lastLoginTime);
                    SimpleDateFormat dateFormat = (SimpleDateFormat) DateFormat.getDateTimeInstance();
                    out.write(dateFormat.format(date));
                    break;
                }
            }
        } else {
            out.write("这是你第一次访问本站");
        }
        // 服务器给客户端响应一个cookie
        Cookie cookie = new Cookie("lastLoginTime", Long.toString(System.currentTimeMillis()));
        // 设置cookie过期时间,以秒为单位
        cookie.setMaxAge(24 * 60 * 60);
        resp.addCookie(cookie);
    }
}
Session
服务器会自动给每一个用户(浏览器)创建一个Session对象,一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在。
服务器在自动创建Session的时候,会同时生成一个Cookie,存储sessionId:
Cookie cookie = new Cookie("JSESSIONID", sessionId);
resp.addCookie(cookie);
存储位置
保存于服务端。使用场景
- 保存登录用户的信息
 - 保存购物车信息
 - 其他在整个网站中经常会使用的数据
 
生命周期
- 有效期30min,可以通过两种方式设置有效期:
setMaxInactiveTnterval(int time),单位是s- 在
web.xml中配置session有效期,单位是min 
 
<session-config> <session-timeout>time</session-timeout> </session-config>- 还可以通过HttpSession的
invalidate()方法,手动使session失效。 
- 有效期30min,可以通过两种方式设置有效期:
 相关方法
Session也能和
ServletContext一样,实现不同Servlet之间的通信。并且该方式优于利用ServletContext。
String password = request.getParameter("password");
HttpSession session = request.getSession();
String name = (String)session.getAttribute("userName");
session.setMaxInactiveTnterval(30 * 60);
session.setAttribute("password", password);
session.removeAttribute("password");
session.invalidate();