Cookie的使用细节

Cookie使用细节 (1.cookie存活时间 2.cookie如何存储中文)

1.Cookie存活时间

  • 浏览器发送请求给AServlet,AServlet会响应一个存有usernanme=zs的Cookie对象给浏览器
  • 浏览器接收到响应数据将cookie存入到浏览器内存中
  • 当浏览器再次发送请求给BServlet,BServlet就可以使用Request对象获取到Cookie数据
  • 在发送请求到BServlet之前,如果把浏览器关闭再打开进行访问,BServlet能否获取到Cookie数据?
    == 注意:浏览器关闭再打开不是指打开一个新的选项卡,而是必须先关闭应用程序,再打开,顺序不能变==

==针对上面的问题,通过演示会发现,BServlet中无法再无法获取到Cookie数据,这是为啥?

  • 默认情况下。Cookie存储在浏览器内存中,当浏览器关闭时,内存释放,则Cookie被销毁。
    一定要明白cookie存储在浏览器内存中的,关闭浏览器cookie可能会被销毁。为啥是可能,因为后面我们会将到cookie的存活时间,也就是说我们可以设置cookie的存活时间
    如果我们在登录一个网页时选了记住密码我们如何解决Cookie持久化的存储?
    cookie其实已经为我们提供好了对应的API来完成这件事,这个API就是setMaxAge
  • 设置Cookie存活时间
setMaxAge(int seconds);

参数值为:
1.正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
2.负数:默认值,Cookie在当前浏览器关闭,则浏览器关闭,则Cookie被销毁
3.零:删除对应的Cookie

接下来,就设置AServlet中去设置Cookie的存活时间。

@WebServlet("/aServlet")
public class AServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //发送Cookie
        //1. 创建Cookie对象
        Cookie cookie = new Cookie("username","zs");
        //设置存活时间   ,1周 7天
        cookie.setMaxAge(60*60*24*7); //易阅读,需程序计算
		//cookie.setMaxAge(604800); //不易阅读(可以使用注解弥补),程序少进行一次计算
        //2. 发送Cookie,response
        response.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

Cookie存储中文

首先,先来演示一个效果,将之前username=zhangsan的值改为username=张三,把汉字张三存入到Cookie中,看是什么效果:

@WebServlet("/aServlet")
public class AServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 		//发送Cookie
        String value = "张三";
        Cookie cookie = new Cookie("username",value);
        //设置存活时间   ,1周 7天
        cookie.setMaxAge(60*60*24*7);
        //2. 发送Cookie,response
        response.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

启动访问测试,访问http://localhost:8080/cookie-demo/aServlet会发现浏览器会提示错误信息
在这里插入图片描述
通过上面的案例演示,我们得到一个结论:

  • Cookie不能直接存储中文
    Cookie不能存储中文,但是如果有这方面的需求,这个时候如何解决?
    这里需要用到我们之前学过的知识点URL编码,如果要存储中文,就需要进行转码,具体的实现思路为:
  1. 在AServlet中对中文进行URL编码,采用URLEncode.encode(),将编码后的值存入Cookie中
  2. 在BServlet中获取Cookie中的值,获取的值为URL编码后的值
  3. 将获取的值在进行URL解码,采用URLDecode.decode(),就可以获取到对应的中文值
    (1)在AServlet中对中文进行URL编码
@WebServlet("/aServlet")
public class AServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //发送Cookie
        String value = "张三";
        //对中文进行URL编码
        value = URLEncoder.encode(value, "UTF-8");
        System.out.println("存储数据:"+value);
        //将编码后的值存入Cookie中
        Cookie cookie = new Cookie("username",value);
        //设置存活时间   ,1周 7天
        cookie.setMaxAge(60*60*24*7);
        //2. 发送Cookie,response
        response.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

(2)在BServlet中获取值,并对值进行解码

@WebServlet("/bServlet")
public class BServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取Cookie
        //1. 获取Cookie数组
        Cookie[] cookies = request.getCookies();
        //2. 遍历数组
        for (Cookie cookie : cookies) {
            //3. 获取数据
            String name = cookie.getName();
            if("username".equals(name)){
                String value = cookie.getValue();//获取的是URL编码后的值 %E5%BC%A0%E4%B8%89
                //URL解码
                value = URLDecoder.decode(value,"UTF-8");
                System.out.println(name+":"+value);//value解码后为 张三
                break;
            }
        }

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

这样我们就可以将中文存入Cookie中进行使用。

小结
Cookie的使用细节中,我们要注意cookie的存活时间和存储中文

  • 存活时间,需要掌握setMaxAage() API的使用
  • 存储中文,需要掌握URL编码和解码的使用
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈毓辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值