美文网首页
黑猴子的家:JavaWeb 之 Cookie

黑猴子的家:JavaWeb 之 Cookie

作者: 黑猴子的家 | 来源:发表于2019-12-13 13:12 被阅读0次

    1、cookie的出现

    1)当前的问题

    在浏览器发送不同请求时,服务器端基于HTTP协议无法识别多次请求是否来自同一个浏览器


    2)解决方法情境举例

    一个咖啡厅促销活动:每位顾客喝5杯咖啡赠送一杯
    方法一:让服务员把喝过咖啡的顾客都记住——不现实。
    方法二:给每位顾客办一张会员卡,在卡片上记录他消费的次数
    将消费的次数保存在顾客手中——Cookie:在浏览器端缓存数据的一种技术
    0001:3→咖啡厅
    0002:4→咖啡厅
    0003:1→咖啡厅
    方法三:给每位顾客办一张会员卡,卡片上只有一个卡号,咖啡厅根据卡号保存顾客消费的次数
    将消费的次数保存在咖啡厅——Session:在服务器端缓存数据的技术
    0001→咖啡厅[0001:3]
    0002→咖啡厅[0002:5]
    0003→咖啡厅[0003:1]

    2、cookie的运行机制

    1)Cookie运行机制

    ①“办卡”:创建Cookie对象
    Cookie cookie = new Cookie("myCookie", UUID.randomUUID().toString());

    ②“将卡片交到顾客手中”:将Cookie对象中封装的信息回送到浏览器
    API:response.addCookie(cookie);
    以响应消息头的形式发送给浏览器
    Set-Cookie:myCookie=5691a6b4-7441-4916-b319-1a04c31ec504

    ③“顾客带着卡片来咖啡厅”:浏览器请求服务器时携带Cookie数据
    以请求消息头的形式携带Cookie数据
    Cookie:myCookie=5691a6b4-7441-4916-b319-1a04c31ec504

    ④“咖啡厅检查顾客卡片”:服务器从请求对象中获取Cookie数据

     //从request对象中能够获取到Cookie信息,返回的是Cookie的数组
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter writer = response.getWriter();
    Cookie[] cookies = request.getCookies();
     //cookies数组不一定有值,如果浏览器没有提交Cookie数据,则cookies的值就等于null
     if(cookies != null) {
        for(int i = 0; i < cookies.length; i++) {
            String name = cookies[i].getName();
            String value = cookies[i].getValue();
            writer.write("Cookie中的数据是:"+name+"="+value);
            writer.write("<br />");  
        }
    }
    
    2)不同浏览器

    不同的浏览器访问同一个服务器,服务器也会根据浏览器的不同,返回不同的Cookie

    3)Cookie有效性

    (1)分类
    [1]会话级Cookie:保存在浏览器内存中,随着浏览器关闭的关闭而释放,默认情况
    [2]持久化级Cookie:保存在文件系统中,不会随着浏览器关闭而释放,但到达预先指定的时间就会自动释放

    (2)设置
    cookie.setMaxAge(int seconds);
    [1]seconds正整数:表示将Cookie设置为持久化Cookie,保持seconds秒
    [2]seconds=0:表示删除Cookie
    [3]seconds负整数:表示将Cookie设置为会话级Cookie
    注意:设置完成以后,必须使用response的addCookie()添加才可生效

    3、code

    1)CreateCookieServlet
    package com.alex.web.servlet.cookie;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    //创建Cookie
    public class CreateCookieServlet extends HttpServlet {
    
        private static final long serialVersionUID = 1L;
    
        // 写cookie
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            Cookie cookie = new Cookie("username", "alex");
            response.addCookie(cookie);
        }
    }
    
    2)DeleteCookieServlet
    package com.alex.web.servlet.cookie;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class DeleteCookieServlet extends HttpServlet {
    
        private static final long serialVersionUID = 1L;
    
        // 删除cookie, cookie没有delete 或者remove 等方法,
        // 要想删除,只能重新赋值或者设置失效时间
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            Cookie cookie = new Cookie("username", null);
            // 设置cookie的失效时间
            cookie.setMaxAge(0);
            response.addCookie(cookie);
        }
    }
    
    3)GetCookieServlet
    package com.alex.web.servlet.cookie;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class GetCookieServlet extends HttpServlet {
        
        private static final long serialVersionUID = 1L;
    
        // 读取cookie
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            Cookie[] cookies = request.getCookies();
            if (cookies != null) {
                for (Cookie cookie : cookies) {
                    String name = cookie.getName();
                    if ("username".equals(name)) {
                        String value = cookie.getValue();
                        System.out.println(name + " -> " + value);
                    }
                }
            }
        }
    }
    
    4)PersistCookieServlet
    package com.alex.web.servlet.cookie;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    //创建持久性cookie
    public class PersistCookieServlet extends HttpServlet { 
        
        private static final long serialVersionUID = 1L;
        
        //写cookie
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            Cookie cookie = new Cookie("username","alex");
            //设置cookie的失效时间
            cookie.setMaxAge(60*60);
            //如果添加路径,那么只有访问某某路径下的时候,cookie才会跟着走
            //cookie.setPath(request.getContextPath() + "/xxx");
            response.addCookie(cookie);
        }
    }
    
    5)web.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
        id="WebApp_ID" version="3.1">
        <display-name>web_cookie</display-name>
    
        <servlet>
            <servlet-name>CreateCookieServlet</servlet-name>
            <servlet-class>com.alex.web.servlet.cookie.CreateCookieServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>CreateCookieServlet</servlet-name>
            <url-pattern>/CreateCookieServlet</url-pattern>
        </servlet-mapping>
    
        <servlet>
            <servlet-name>GetCookieServlet</servlet-name>
            <servlet-class>com.alex.web.servlet.cookie.GetCookieServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>GetCookieServlet</servlet-name>
            <url-pattern>/GetCookieServlet</url-pattern>
        </servlet-mapping>
    
        <servlet>
            <servlet-name>PersistCookieServlet</servlet-name>
            <servlet-class>com.alex.web.servlet.cookie.PersistCookieServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>PersistCookieServlet</servlet-name>
            <url-pattern>/PersistCookieServlet</url-pattern>
        </servlet-mapping>
    
        <servlet>
            <servlet-name>DeleteCookieServlet</servlet-name>
            <servlet-class>com.alex.web.servlet.cookie.DeleteCookieServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>DeleteCookieServlet</servlet-name>
            <url-pattern>/DeleteCookieServlet</url-pattern>
        </servlet-mapping>
    
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
    </web-app>
    
    6)testcookie.jsp
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <h3>
            <a href="CreateCookieServlet">创建Cookie</a>
        </h3>
        <h3>
            <a href="GetCookieServlet">访问Cookie</a>
        </h3>
        <h3>
            <a href="PersistCookieServlet">设置持久化Cookie</a>
        </h3>
        <h3>
            <a href="DeleteCookieServlet">删除指定的Cookie</a>
        </h3>
    </body>
    </html>
    

    4、cookie本地存放位置

    相关文章

      网友评论

          本文标题:黑猴子的家:JavaWeb 之 Cookie

          本文链接:https://www.haomeiwen.com/subject/mlffnctx.html