首先,明确Cookie和Session的区别
对session的访问是通过cookie实现的,只要使用了getsession方法,就相当于开启了Session,自动保存一个sessionid的cookie给前端

1)session存储在服务器端,cookie以文本格式存储在浏览器端;
2)session对数据量具体无限制,cookie只存储4kb数据;
3)考虑到安全性,可以使用session;
4)cookie可设置有效时间使其过期失效,session则需要调用destroy()方法来销毁。
二者应用场景:
cookie用来记住已登录用户的用户名和密码,以便下一次登录。
session用来保存用户的登录,以便后面的权限确认

web中什么是会话:

用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据

image.png

Java提供的操作Cookie的API

image.png
image.png
image.png

image.png
image.png

实例代码

  1. package gac.xdp.cookie;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import java.util.Date;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.Cookie;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. public class CookieDemo01 extends HttpServlet {
  11. public void doGet(HttpServletRequest request, HttpServletResponse response)
  12. throws ServletException, IOException {
  13. //设置服务器端以UTF-8编码进行输出
  14. response.setCharacterEncoding("UTF-8");
  15. //设置浏览器以UTF-8编码进行接收,解决中文乱码问题
  16. response.setContentType("text/html;charset=UTF-8");
  17. PrintWriter out = response.getWriter();
  18. //获取浏览器访问访问服务器时传递过来的cookie数组
  19. Cookie[] cookies = request.getCookies();
  20. //如果用户是第一次访问,那么得到的cookies将是null
  21. if (cookies!=null) {
  22. out.write("您上次访问的时间是:");
  23. for (int i = 0; i < cookies.length; i++) {
  24. Cookie cookie = cookies[i];
  25. if (cookie.getName().equals("lastAccessTime")) {
  26. Long lastAccessTime =Long.parseLong(cookie.getValue());
  27. Date date = new Date(lastAccessTime);
  28. out.write(date.toLocaleString());
  29. }
  30. }
  31. }else {
  32. out.write("这是您第一次访问本站!");
  33. }
  34. //用户访问过之后重新设置用户的访问时间,存储到cookie中,然后发送到客户端浏览器
  35. Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+"");//创建一个cookie,cookie的名字是lastAccessTime
  36. //将cookie对象添加到response对象中,这样服务器在输出response对象中的内容时就会把cookie也输出到客户端浏览器
  37. response.addCookie(cookie);
  38. }
  39. public void doPost(HttpServletRequest request, HttpServletResponse response)
  40. throws ServletException, IOException {
  41. doGet(request, response);
  42. }
  43. }

image.png

在上面的例子中,在程序代码中并没有使用setMaxAge方法设置cookie的有效期,所以当关闭浏览器之后,cookie就失效了,要想在关闭了浏览器之后,cookie依然有效,那么在创建cookie时,就要为cookie设置一个有效期。如下所示:

  1. //用户访问过之后重新设置用户的访问时间,存储到cookie中,然后发送到客户端浏览器
  2. Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+"");//创建一个cookie,cookie的名字是lastAccessTime
  3. //设置Cookie的有效期为1天
  4. cookie.setMaxAge(24*60*60);
  5. //将cookie对象添加到response对象中,这样服务器在输出response对象中的内容时就会把cookie也输出到客户端浏览器
  6. response.addCookie(cookie);

Cookie注意细节
一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的>Cookie。
浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内>存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出>一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。

删除Cookie

  1. package gac.xdp.cookie;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.Cookie;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. /**
  9. * 删除cookie
  10. */
  11. public class CookieDemo02 extends HttpServlet {
  12. public void doGet(HttpServletRequest request, HttpServletResponse response)
  13. throws ServletException, IOException {
  14. //创建一个名字为lastAccessTime的cookie
  15. Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+"");
  16. //将cookie的有效期设置为0,命令浏览器删除该cookie
  17. cookie.setMaxAge(0);
  18. response.addCookie(cookie);
  19. }
  20. public void doPost(HttpServletRequest request, HttpServletResponse response)
  21. throws ServletException, IOException {
  22. doGet(request, response);
  23. }
  24. }

(注意:删除cookie时,path必须一致,否则不会删除)

cookie中存取中文

要想在cookie中存储中文,那么必须使用URLEncoder类里面的encode(String s, String enc)方法进行中文转码,例如:

  1. Cookie cookie = new Cookie("userName", URLEncoder.encode("中文", "UTF-8"));
  2. response.addCookie(cookie);

在获取cookie中的中文数据时,再使用URLDecoder类里面的decode(String s, String enc)进行解码,例如:

  1. URLDecoder.decode(cookies[i].getValue(), "UTF-8")