Cookiecookie相当于一个信件服务器发给客户端发一个信件下次客户端访问会携带信件这样服务器就可以识别客户端 显示上次访问的信息历史数据等。特点1.存储在客户端浏览器。2.Cookie 只能存字符串不能存对象。3.一个cookie只能保存一条信息。4.单个 Cookie ≤4KB一个域名最多 20~50 条。会话cookie和持久cookie会话cookie不设置 expires/Max-age关闭浏览器自动消失。持久cookie设置过期时间 关闭浏览器依然保存。Java Servlet 设置 CookieCookie[] cookies req.getCookies(); //获得Cookie cookie.getName(); //获得cookie中的key cookie.getValue(); //获得cookie中的value new Cookie(lastLoginTime, System.currentTimeMillis()); //新建一个cookie cookie.setMaxAge(24*60*60); //设置cookie的有效期 resp.addCookie(cookie); //响应给客户端一个cookie代码示例public class loginServlet extends HttpServlet { Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(utf-8); resp.setContentType(text/html;charsetUTF-8); // 拿到输出流 用来向浏览器输出文字 PrintWriter out resp.getWriter(); //服务器向浏览器获取cookie Cookie[] cookies req.getCookies(); //判断cookie是否存在 if(cookies!null){ out.write(上一次的访问时间); //遍历所有cookie for (int i 0; i cookies.length ; i) { Cookie cookie cookies[i]; if (cookie.getName().equals(lastLoginTime)){ // 取出Cookie里保存的字符串把字符串转成数字long long lastLoginTime Long.parseLong(cookie.getValue()); // 把毫秒数字转成正常日期时间 Date date new Date(lastLoginTime); //把时间打印到网页上 out.write(date.toLocaleString()); } } }else { out.write(第一次访问); } long nowTime System.currentTimeMillis(); Cookie newCookie new Cookie(lastLoginTime, nowTime ); resp.addCookie(newCookie);Sessionsession就是服务器给客户端发一把钥匙 下次携带钥匙就可以自动识别然后才读取服务器内存储的数据特点1.数据存放在服务器内存中客户端只保存 SessionId。2.敏感数据不会暴露在浏览器用户无法直接篡改业务数据只能拿到会话编号。3.不能跨域名共享 Session。4.依靠 Cookie 传递 SessionId浏览器禁用 Cookie 则会话会失效。Java Servlet 设置 SessionHttpSession session req.getSession();//获取session session.setAttribute(username, 张三);//存入数据 String name (String) session.getAttribute(username);//取出数据 session.removeAttribute(username);//移除数据 session.setMaxInactiveInterval(10 * 60);// 设置会话超时时间设置10分钟空闲就过期 session.invalidate();//销毁session String sessionId session.getId();//获取sessionId //web.xml设置超时时间 session-config session-timeout30/session-timeout /session-config代码示例public class SessionDemo extends HttpServlet { Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(utf-8); resp.setContentType(text/html;charsetUTF-8); //创建session HttpSession session req.getSession(); //给session存东西 req.setAttribute(username,张三); //获得session的Id String sessionId session.getId(); //判断session是不是新建的 if(session.isNew()){ resp.getWriter().write(session创建成功!IDsessionId); }else { resp.getWriter().write(session新建成功IDsessionId); } }Session/Cookie的区别cookiesession存储位置保存在客户端浏览器保存在服务器内存存储内容只能存字符串容量最大 4KB可以存放任意对象没有限制安全性数据存在客户端可被查看、篡改不安全数据留在服务器客户端只持有 SessionId更安全依赖关系独立运行不需要 Session默认依赖 Cookie 传递 SessionId生命周期可设置持久化关闭浏览器可保留浏览器关闭会丢失 SessionId服务器默认 30 分钟空闲自动销毁生命周期可以通过 Domain 配置实现子域名共享默认不能跨域名共享Session 能不能跨子域本质就是SessionId 的 Cookie 能不能跨子域传递。同一主域名下的多个子域名www、news配置 Cookie 的 Domain 后Session 可以互通。完全不同的两个域名baidu.com 和 taobao.comCookie 和 Session 都无法互通。// 创建Cookie Cookie cookie new Cookie(userMsg, loginInfo); // 核心配置主域名 .baidu.com cookie.setDomain(.baidu.com); // 路径全局生效 cookie.setPath(/); resp.addCookie(cookie);//全局配置 Context sessionCookieDomain.baidu.com sessionCookiePath/ /Context//手动修改 // 1. 获取Session自动生成JSESSIONID HttpSession session request.getSession(); String sessionId session.getId(); // 2. 遍历所有Cookie找到JSESSIONID修改domain Cookie[] cookies request.getCookies(); if(cookies ! null){ for(Cookie cookie : cookies){ if(JSESSIONID.equals(cookie.getName())){ // 新建Cookie复制原有值设置主域名 Cookie newSessionCookie new Cookie(JSESSIONID, sessionId); newSessionCookie.setDomain(.baidu.com); newSessionCookie.setPath(/); // 把新Cookie发给浏览器 response.addCookie(newSessionCookie); } } }Session 为什么依赖 CookieSessionId 默认存放在 Cookie 中如果浏览器禁用 CookieSession 就无法正常传递需要改用 URL 重写。为什么 Session 不能替代 CookieSession 数据在服务器服务器重启就会丢失Cookie 可以持久化长期保存。