• Cookie学习笔记


    部分资料来源于陶邦仁前辈的《理解Cookie和Session机制》

    什么是Cookie

    Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。

    由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。

    Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

    Cookie Session 002

    Cookie的使用

    今天我先只来写一下servlet中cookie的使用。

    创建cookie

    Cookie cookie = new Cookie("key","value");
    

    注意:无论是名字还是值,都不应该包含中文、空格或以下任何字符:

    [ ] ( ) = , " / ? @ : ;
    

    Unicode编码

    但是有时候我们就要添加哪些不合法的字符怎么办呢?例如我们储存的账号用户名是中文的,再或者我们想用把json储存在cookie的value中。

    这时就用到了Unicode编码

    Unicode编码说白了就是将一种字符串转换成另一种字符串,打个不恰当的比方就像是翻译语言。

    cookie中储存中文只能用Unicode编码,一般使用UTF-8编码即可。不推荐使用GBK等中文编码,因为浏览器不一定支持,而且JavaScript也不支持GBK编码。

    编码过程

    String str = URLEncoder.encode("value","utf-8");
    

    解码过程

    String str = URLEncoder.decode(cookie.getValue(),"utf-8");
    

    设置生存周期

    cookie.setMaxAge(60*60*24); 
    

    该方法设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效。Cookie中通过getMaxAge()方法与setMaxAge(int expiry)方法来读写maxAge属性。 如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动失效。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中。无论客户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录网站时该Cookie仍然有效。

    发送cookie至客户端

    response.addCookie(cookie);
    

    查找cookie

    使用request.getCookies()来得到客户端的cookie链表,下面是我写的一个查找cookie的实例,(如果无法得到cookie就会自动创建一个要查找的cookie)

    public Cookie getCookie(String name,HttpServletResponse response,HttpServletRequest request){
        Cookie result=null;
        boolean flag=false;
        if (request.getCookies()!=null){
            for (Cookie cookie:request.getCookies()){
                if (cookie.getName().equals(name)){
                    result=cookie;
                    flag=true;
                }
            }
        }
        if (!flag){
            try {
                String encodeCookie = URLEncoder.encode("","utf-8");
                Cookie cookie=new Cookie(name,encodeCookie);
                cookie.setMaxAge(1);
                response.addCookie(cookie);
                result=cookie;
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
    

    删除Cookie

    Cookie没有直接的删除和修改方法,如果要删除某个Cookie,只需要新建一个同名的Cookie,并将maxAge设置为0,然后替换即可

    //删除name为“test”的cookie
    Cookie cookie=new Cookie("test",null);
    cookie.setMaxAge(0);
    response.addCookie(cookie);
    

    修改Cookie

    创建一个同名Cookie来来替换即可。

    //将name为“test”的cookie的值设置为“test”
    Cookie cookie=new Cookie("test","test");
    response.addCookie(cookie);
    
  • 相关阅读:
    Jmeter分离登录事务的另一种方式
    数据驱动 vs 关键字驱动:对搭建UI自动化测试框架的探索
    使用jmeter往指定文件中插入一定数量的数据
    JMeter 各组件介绍以及用法
    JVM(2) Java内存溢出异常
    JVM(1) Java内存区域
    OptimalSolution(1)--递归和动态规划(4)其他问题
    MySQL开发篇(5)索引、视图、触发器、SQL中的安全问题、SQL Mode、
    OptimalSolution(1)--递归和动态规划(3)数组和字符串问题
    OptimalSolution(1)--递归和动态规划(2)矩阵的最小路径和与换钱的最少货币数问题
  • 原文地址:https://www.cnblogs.com/xiaoyiStudent/p/12344508.html
Copyright © 2020-2023  润新知