Cookie

服务器通知客户端保存键值对的一种技术。客户端有了 Cookie 后,每次请求都发送给服务器。每个 Cookie 的大小不能超过 4kb

  1. //cookie的创建
  2. protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  3. //创建cookie对象
  4. Cookie cookie = new Cookie("k1", "v1");
  5. //通知客户端保存cookie 通过响应头set-cookie
  6. //客户端收到响应后发现set-cookie响应头 就看有没有创建cookie 有就修改 没有就新建
  7. resp.addCookie(cookie);
  8. resp.getWriter().write("cookie创建成功");
  9. }
  10. //服务器获取cookie
  11. Cookie[] cookies=req.getCookies(); //获取全部cookie
  12. for (Cookie cookie : cookies) { //遍历查找某一个cookie
  13. if(name.equals(cookie.getName())){
  14. return cookie;
  15. }
  16. }

cookie值的修改

  1. protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  2. //法一
  3. //1 先创建一个要修改的同名(指的就是 key)的 Cookie 对象
  4. //2 在构造器,同时赋于新的 Cookie 值。
  5. Cookie cookie = new Cookie("k1", "nv1");
  6. //3 调用 response.addCookie( Cookie );
  7. resp.addCookie(cookie);
  8. //法二
  9. //1 先查找到需要修改的 Cookie 对象
  10. Cookie cookie1 = CookieUtils.findCookie("k2", req.getCookies());
  11. if(cookie1!=null){
  12. //2 调用 setValue()方法赋于新的 Cookie 值。
  13. cookie1.setValue("nv2");
  14. //3 调用 response.addCookie()通知客户端保存修改
  15. resp.addCookie(cookie1);
  16. }
  17. }

Cookie的生命控制

Cookie 的生命控制指的是如何管理 Cookie 什么时候被销毁(删除)

  1. protected void cookieAge(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  2. Cookie cookie = new Cookie("d1", "vd1");
  3. cookie.setMaxAge(-1); //默认 -1 表示浏览器以关cookie就会被删除
  4. // 0 表示马上删除 Cookie
  5. // 正数 表示在指定的秒数后过期
  6. resp.addCookie(cookie);
  7. }

Cookie 有效路径 Path 的设置

Cookie 的 path 属性可以有效的过滤哪些 Cookie 可以发送给服务器,哪些不发
path 属性是通过请求的地址来进行有效的过滤

  1. protected void pathCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. Cookie cookie = new Cookie("p1", "p1");
  3. //getContextPath 得到工程路径
  4. //满足如下设置的路径才会显示cookie 达到一个过滤效果
  5. cookie.setPath(request.getContextPath()+"/abc");
  6. response.addCookie(cookie);
  7. response.getWriter().write("cookie path成功");
  8. }

Cookie实现免用户名和密码登录(保存在客户端)

image.png

  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. String username = request.getParameter("username");
  3. Cookie cookie = new Cookie("username", username); //把用户名放入cookie中
  4. cookie.setMaxAge(3600); //设置保存时间
  5. //通知客户端保存cookie
  6. response.addCookie(cookie);
  7. }

Session会话

Session 就一个接口(HttpSession。它是用来维护一个客户端和服务器之间关联的一种技术。每个客户端都有自己的一个 Session 会话,Session 会话中,经常用来保存用户登录之后的信息(保存在服务器端

req.getSession():第一次调用是创建session会话,之后调用都是获取前面创建好的session会话对象

  1. protected void createSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  2. //创建和获取session会话对象
  3. HttpSession session = req.getSession();
  4. //判断当前session会话是否是新创建出来的
  5. boolean aNew = session.isNew();
  6. //获取session会话的唯一标识
  7. String id = session.getId();
  8. resp.getWriter().write(id+"<br/>");
  9. resp.getWriter().write(""+aNew);
  10. }

Session 域数据的存取

  1. //往 Session 中保存数
  2. req.getSession().setAttribute("key1", "value1");
  3. // 获取 Session 域中的数据
  4. Object attribute = req.getSession().getAttribute("key1");

Session 生命周期控制

  1. //可在web.xml 中自定义设置session的超时时长
  2. <session-config>
  3. <session-timeout>20</session-timeout>
  4. </session-config>

setMaxInactiveInterval(int interval) 单独设置个别Session 的超时时间(以秒为单位),超过指定的时长,Session 就会被销毁;interval值为正数的时候,设定 Session 的超时时长,负数表示永不超时(极少使用)
getMaxInactiveInterval()获取 Session 的超时时间
invalidate() 让当前 Session 会话马上超时无效。

注:session超时指的是,客户端两次请求的最大间隔时长

浏览器和session之间的关联

客户端在没有cookie情况下向服务器发起请求,服务器会创建一个session会话对象。服务器每次创建session会话时,都会创建一个cookie对象(JSESSIONID),用来存储新创建出来的session对象的id值
req.getSession()通过cookie中的id值找到自己之前创建好的session对象,并返回

注:Session 技术,底层其实是基于 Cookie 技术来实现的。所以每次关闭浏览器session会话就会没有,是因为底层的cookie对象被删除了