Cookie

    1、cookie是服务器通知客户端保存键值对的一种技术

    2、客户端有了cookie后,每次请求都发给服务器

    3、每个cookie大小不能超过4kb

    Cookie 主要用于下面三个目的

    • 会话管理

    登陆、购物车、游戏得分或者服务器应该记住的其他内容

    • 个性化

    用户偏好、主题或者其他设置

    • 追踪

    记录和分析用户行为

    创建cookie

    Cookie cookie = new cookie(“key”,“value”)

    cookie通过http协议的响应头中的Set-cookie将键值对传入浏览器。

    1. public class cookie extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. resp.setContentType("text/html;charset=UTF-8");
    5. createCookie(req,resp);
    6. }
    7. /**
    8. * 创建cookie
    9. */
    10. protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    11. //创建cookie对象
    12. Cookie cookie = new Cookie("key1","value1");
    13. //通知浏览器保存cookie
    14. resp.addCookie(cookie);
    15. //提示用户
    16. resp.getWriter().println("浏览器保存cookie成功");
    17. }
    18. }

    Java学习十六——cookie - 图1

    服务器获取客户端的cookie:
    获取cookie方法:request.getCookies()

    获取cookie对象的key:cookie对象.getName();

    获取cookie对象的value:cookie对象.getValue();

    Cookie值的修改:

    方法一:

    1、先创建一个要修改的同名的Cookie对象

    2、在构造器同时赋予新的Cookie值

    3、调用response.addCookie(Cookie)
    新的同名Cookie会覆盖原有Cookie值

    方法二:
    1、先查找到要修改的Cookie对象

    2、调用setValue()方法赋予新的值

    3、调用response.addCookie()通知客户端保存修改

    Cookie生命控制:
    setMaxAge()

    正数,表示在指定秒数后过期

    负数,表示浏览器一关,Cookie就会被删除(默认是-1)

    零,表示马上删除Cookie,可以通过设置生命周期为0来删除cookie。

    1. Cookie key1 = CookieUtil.findCookie(request.getCookies(), "key1");
    2. key1.setMaxAge(0);
    3. response.addCookie(key1);
    4. Cookie key2 = CookieUtil.findCookie(request.getCookies(), "key2");
    5. key1.setMaxAge(0);
    6. response.addCookie(key2);

    若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。

    案例(免用户名登录)

    1. 第一次登录的时候输入用户名和密码,如果第一次登录成功的话,下一次登录的时候就不用输入用户名(有效期为一周)<br />LoginCookie.java
    1. public class LoginCookie extends HttpServlet {
    2. @Override
    3. protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
    4. toLogin(req,resp);
    5. }
    6. public void toLogin(HttpServletRequest req, HttpServletResponse resp) {
    7. //接受用户名和密码
    8. String username = req.getParameter("username");
    9. String password = req.getParameter("password");
    10. //在第一次登录成功后,再次登录时需要对用户名回显
    11. Cookie cookieUsername = CookieUtil.findCookie(req.getCookies(), "username");
    12. if (cookieUsername != null){
    13. ServletContext servletContext = getServletContext();
    14. //保存数据到域中
    15. servletContext.setAttribute("username",cookieUsername.getValue());
    16. }
    17. //在用户名和密码匹配的情况下,将用户名数据保存到cookie
    18. if(username.equals("shizi") && password.equals("123456")){
    19. Cookie cookie = new Cookie("username", username);
    20. //设置有效期
    21. cookie.setMaxAge(60*60*24*7);
    22. resp.addCookie(cookie);
    23. //响应客户端登录成功
    24. try {
    25. resp.getWriter().println("登录成功");
    26. } catch (IOException e) {
    27. e.printStackTrace();
    28. }
    29. }
    30. }
    31. }

    login.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>登录界面</title>
    5. </head>
    6. <body>
    7. <h1 align="center"></h1>
    8. <form action="http://localhost:8080/jsp_test/login" method="post">
    9. <%--value="${username==null ? "" : username}"
    10. 判断是否为空,为空显示空,否则显示username--%>
    11. 用户名:<input type="text" name="username" value="${username==null ? "" : username}"><br>
    12. 密码:<input type="password" name="password">
    13. <input type="submit" value="登录">
    14. </form>
    15. </body>
    16. </html>

    [

    ](https://blog.csdn.net/tanyunlong_nice/article/details/47188659)