JavaWeb——会话技术之Cookie快速入门与案例实战(详细讲解了Cookie实现原理、Cookie使用细节、Cookie的特点及作用)

时间:2022-07-25
本文章向大家介绍JavaWeb——会话技术之Cookie快速入门与案例实战(详细讲解了Cookie实现原理、Cookie使用细节、Cookie的特点及作用),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1 会话技术概述

会话与生活中的谈话很类似,有开始,有结束,中间过程一问一答。一次会话中包含多次请求和响应:

  • 一次会话:浏览器第一次给服务器资源发送请求,会话建立,知道有一方断开;
  • 功能:在一次会话的范围内的多次请求间来共享数据(比如:京东点击多个加入购物车,然后去购物车结算就用到了);
  • 方式:1)客户端会话技术Cookie;            2)服务器端会话技术Session;

2 客户端会话技术Cookie

Cookie是将数据保存到客户端的一种客户端会话技术,比如,上节中提到的京东购物,点击一次加入一次购物车,这是一次请求,浏览器就会将获取的数据保存在本地。

2.1 快速入门

使用步骤如下:

  • 1)创建Cookie对象,绑定数据:new Cookie(String name, String value)
  • 2)发送Cookie对象:response.addCookie(Cookie cookie)
  • 3)获取Cookie,来拿到数据:Cookie[] request.getCookies()

【举例】:写两个Servlet,代码如下,测试时,先打开浏览器分别访问Demo1和Demo2,我们可以看到后台打印出Cookie数据,但是关闭浏览器,再次访问Demo2,就不能获取到数据了。

@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1、创建Cookie对象
        Cookie c = new Cookie("msg","hello");
        //2、发送Cookie
        response.addCookie(c);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

@WebServlet("/CookieDemo2")
public class CookieDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //3、获取Cookie
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
            for (Cookie cookie : cookies) {
                System.out.println(cookie.getName()+":"+cookie.getValue());
            }
        }
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

2.2 实现原理分析

Cookie实质上就是基于响应头set-cookie和请求头cookie实现的。

2.3 Cookie使用细节

cookie的使用涉及几个细节问题:

1、一次是否可以发送多个cookie?

 可以,创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即可。

@WebServlet("/CookieDemo3")
public class CookieDemo3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1、创建Cookie对象
        Cookie c1 = new Cookie("msg","hello");
        Cookie c2 = new Cookie("name","world");
        //2、发送Cookie
        response.addCookie(c1);
        response.addCookie(c2);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

2、cookie在浏览器的保存时长?

  • 默认情况下,当浏览器关闭后Cookie数据被销毁;
  • 可以设置cookie,使其持久化存储,setMaxAge(int seconds),参数为: 正数:将Cookie数据写到硬盘文件中,数值大小表示了cookie存活时间; 负数:默认值; 零:删除Cookie数据;
        //1、创建Cookie对象
        Cookie c = new Cookie("msg","setMaxAge");
        c.setMaxAge(30); //cookie持久化存储30s后自动删除
        //2、发送Cookie
        response.addCookie(c);

3、cookie能不能存储中文?

  • Tomcat8之前,cookie中不能存储中文数据,会报错,在Tomcat8之后,cookie支持中文数据,但对于特殊还是不支持,建议使用URL编码存储,使用URL解码解析;
  • 若是Tomcat8之前的,需要将中文数据转码,一般采用URL编码(%E3这种格式)

4、cookie的共享问题?

1)假设在同一个Tomcat服务器中部署 了多个web项目,那么这些web项目的cookie能否共享?

  • 默认情况下是不能共享的;
  • 通过setPah(String path)可以设置cookie的获取范围,默认情况下是当前的虚拟目录,若要共享,可设置为“/”;

2)不同的Tomcat服务器间的共享问题

setDomain(String path):设置一级域名相同,那么多个服务器之间的cookie就可以共享了,比如:setDomain(".baidu.com"),则tieba.baidu.com中的cookie就可以共享了。

2.3 Cookie的特点及作用

【特点】:

  • cookie存储数据在客户端浏览器
  • 浏览器对于单个cookie的大小有限制,且对同一域名下的总cookie数量也有限制(20个)

【作用】:

  • cookie一般用于存储少量的不太敏感的数据;
  • 在不登录的情况下来完成服务器对客户端的身份识别(如不登录百度账号,设置百度,下次再次打开百度首页后设置仍有效);

3 Cookie案例实战

【案例】:记住上一次的访问时间

【需求】:访问一个servlet,若是第一次访问,则提示:您好,欢迎您首次访问;若不是,则提示:欢迎回来,您上次访问时间为:显示时间字符串。

【分析】:

【代码实现】:如下,注意Cookie有特殊字符时需要进行URL编解码,否则会报错

@WebServlet("/CookieTest")
public class CookieTest extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        //1、判断Cookie
        Cookie[] cookies = request.getCookies();
        boolean flag =  false;
        if(cookies!= null && cookies.length>0){
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                if("lastTime".equals(name)){
                    flag = true;
                    //设置Cookie,时间
                    Date date = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    String time = sdf.format(date);
                    time = URLEncoder.encode(time,"utf-8"); //URL编码,否则会报错
                    cookie.setValue(time);
                    //设置存活时间
                    cookie.setMaxAge(60*60*24*30);//一个月
                    response.addCookie(cookie);

                    //响应数据
                    String value = cookie.getValue();
                    value = URLDecoder.decode(value,"utf-8");
                    response.getWriter().write("<h1>欢迎回来,您上次访问时间为:"+value+"</h1>");
                    break;
                }
            }
        }

        if(cookies ==null || cookies.length==0 || flag==false){
            //设置Cookie,时间
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String time = sdf.format(date);
            time = URLEncoder.encode(time,"utf-8");
            Cookie cookie = new Cookie("lastTime",time);
            //设置存活时间
            cookie.setMaxAge(60*60*24*30);//一个月
            response.addCookie(cookie);

            response.getWriter().write("<h1>您好,欢迎您首次访问</h1>");

        }
    }

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

———————————————————————————————————————

本文为博主原创文章,转载请注明出处!