【JavaWeb】会话技术Cookie详细

会话技术Cookie详细,主要内容:1. 会话技术;2. 会话技术之Cookie


一.会话技术

1.会话概念

会话:一次会话中包含多次请求和响应。

一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开(客户端浏览器关闭或者服务器关闭)为止。


2.会话功能

在一次会话的范围内的多次请求间,可以共享数据。

3.会话方式

  • 客户端会话技术:Cookie
  • 服务器端会话技术:Session

二.Cookie

1.Cookie概念

Cookie是客户端会话技术,可以将数据保存到客户端。


2.Cookie快速入门

Cookie使用步骤:

  1. 服务器创建Cookie对象,绑定数据
    – 代码new Cookie(String name, String value);创建Cookie对象,参数以键值对形式保存数据。
  2. 向浏览器发送Cookie对象
    – 代码response.addCookie(Cookie cookie) ;发送对象,参数是Cookie对象。
  3. 服务器获取Cookie,拿到数据
    – Request对象的方法Cookie[] getCookies();,返回Cookie对象数组,本次会话中浏览器存储的所有Cookie对象。

代码演示:

  • CookieDemo1创建Cookie对象
  • CookieDemo2获取Cookie对象
@WebServlet(name = "CookieDemo1", urlPatterns = "/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //1.创建Cookie对象
        Cookie cookie = new Cookie("msg", "hello");
        //2.向客户端发送Cookie
        response.addCookie(cookie);
    }
}
@WebServlet(name = "CookieDemo2", urlPatterns = "/CookieDemo2")
public class CookieDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //3.获取Cookie
        Cookie[] cookies = request.getCookies();
        //获取数据,遍历Cookie数组
        if (cookies != null){
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                String value = cookie.getValue();
                System.out.println(name+":"+value);
            }
        }
    }
}

运行服务器,访问CookieDemo1:

在这里插入图片描述
打开浏览器控制台,查看响应头:
在这里插入图片描述

再访问CookieDemo2:

在这里插入图片描述

打开浏览器控制台,查看请求头:
在这里插入图片描述

控制台打印Cookie对象信息:

在这里插入图片描述



3.Cookie实现原理

是基于响应头Set-Cookie和请求头Cookie实现。

  • 创建Cookie是发送给浏览器,是在响应消息中添加了Set-Cookie响应头,值是创建Cookie对象所设置的参数。
  • 使用Cookie是浏览器每次请求,在请求消息中会添加Cookie的请求头,值是会话中的所有Cookie对象。

4.Cookie的细节

4.1 一次可不可以发送多个cookie?

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

代码演示:

![Demo2.2](D:\文档存储\JAVA\技术路线\阶段2 JavaWeb+黑马旅游网\08-Cookie和Session\笔记图\Cookie\Demo2.2.png)@WebServlet(name = "CookieDemo3", urlPatterns = "/CookieDemo3")
public class CookieDemo3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //1.创建Cookie对象
        Cookie cookie1 = new Cookie("msg", "hello");
        Cookie cookie2 = new Cookie("name", "zhangsan");
        //2.发送Cookie
        response.addCookie(cookie1);
        response.addCookie(cookie2);
    }
}

访问CookieDemo3,响应消息头中会有多个Set-Cookie

在这里插入图片描述
打开浏览器控制台,查看响应头:
在这里插入图片描述



4.2 cookie在浏览器中保存多长时间?

默认情况下,当浏览器关闭后,Cookie数据被销毁。我们也可以持久化存储:

  • void setMaxAge(int seconds);设置Cookie存活时间。参数以秒为单位。
    参数seconds:
    • 正数:将Cookie数据写到硬盘的文件中。持久化存储,并指定cookie存活时间,不随浏览器关闭而消亡,时间到后,cookie文件自动失效。
    • 负数:默认情况
    • 零:删除该Cookie对象信息

Cookie持久化存储的位置

谷歌Chrome的Cookie数据位于:%LOCALAPPDATA%\Google\Chrome\User Data\Default\ 目录中,名为Cookies的文件中。
如:C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\Default\Cookies



4.3 cookie能不能存中文

在tomcat 8 之前 Cookie中不能直接存储中文数据。需要将中文数据转码,一般采用URL编码(比如:%E3)。

JDK为我们提供的URL编码的URLEncoder类,有编码的静态方法,直接调用即可:

  • public static String encode(String s, String enc);将字符串URL编码,返回完成编码的字符串。
    参数:String s(需要编码字符串),String enc (字符串的字符集,常用UTF-8)


JDK为我们提供的URL解码的URLDecoder类,有解码的静态方法,直接调用即可:

  • public static String decode(String s, String enc);将字符串URL解码,返回完成解码的字符串。
    参数:String s(需要解码字符串),String enc (字符串的字符集,常用UTF-8)

在tomcat 8 之后,Cookie支持中文数据。特殊字符还是不支持,比如空格。所有Cookie存储特殊数据的时候,建议使用URL编码存储,获取数据后,URL解码解析再使用数据。

String date = "yyyy年MM月dd日 HH:mm:ss";
String En_str = "";
String De_str = "";
//URL编码
En_str = URLEncoder.encode(date,"utf-8");
//URL解码:
De_str = URLDecoder.decode(En_str,"utf-8");



4.4 cookie共享问题?

1.假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?

默认情况下cookie不能共享。需要设置Cookie共享域,Cookie对象可以调用以下方法来设置cookie的获取范围:

  • void setPath(String path):设置cookie的获取范围。默认情况下,当前的虚拟目录才能共享。

如果要共享,则可以将path设置为"/",表示同一个服务器下所有Web项目都可以共享。



2.不同的tomcat服务器间cookie共享问题?

默认情况下cookie不能共享。Cookie对象可以调用以下方法来设置不同服务器间cookie共享:

  • void setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
 setDomain(".baidu.com")//那么tieba.baidu.com和news.baidu.com中cookie可以共享

baidu.com 一级域名
tieba、news二级域名



5.Cookie的特点和作用

特点

  1. cookie存储数据在客户端浏览器
  2. 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个),不同浏览器可能不同。

作用

  1. cookie一般用于存出少量的不太敏感的数据
  2. 在不登录的情况下,完成服务器对客户端的身份识别,将客户端临时的一些信息直接存储再cookie中。



6.案例:记录上一次访问的时间

6.1 需求

  1. 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。
  2. 如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串

6.2 分析

  1. 可以采用Cookie来完成
  2. 在服务器的Servlet中判断是否有一个名为lastTime的cookie
    • 有:不是第一次访问
      • 则响应数据:欢迎回来,您上次访问时间为:2020年08月22日 14:52:43
      • 并且写回Cookie:lastTime=2020年08月22日 14:52:43
    • 没有:是第一次访问
      • 响应数据:您好,欢迎您首次访问
      • 创建Cookie:lastTime=2020年08月22日 14:50:56

6.3 代码实现

CookieTest.java

@WebServlet(name = "CookieTest", urlPatterns = "/CookieTest")
public class CookieTest extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //设置响应的消息体的数据格式以及编码
        response.setContentType("text/html;charset=utf-8");

        //1.获取所有的Cookie
        Cookie[] cookies = request.getCookies();
        boolean flag = false;//标志,false没有名称为lastTime的Cookie
        //2.遍历cookies数组
        if (cookies!=null&&cookies.length>0){
            for (Cookie cookie : cookies) {
                //3.获取cookie的名称
                String name = cookie.getName();
                //4.判断名称是否是:lastTime
                if ("lastTime".equals(name)){
                    //存在该Cookie,说明不是第一次访问
                    flag = true;//有lastTime的cookie

                    //5.更新Cookie的value
                    //获取当前时间的字符串,重新设置Cookie的值,重新发送Cookie
                    Date date = new Date();
                    SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                    String str_date = format.format(date);

                    System.out.println("编码前:"+str_date);
                    //URL编码
                    str_date = URLEncoder.encode(str_date,"utf-8");
                    System.out.println("编码后:"+str_date);

                    cookie.setValue(str_date);
                    //设置Cookie的存活时间
                    cookie.setMaxAge(60*60*24);//一天
                    //6.发送Cookie
                    response.addCookie(cookie);

                    //获取上一次访问的时间
                    //7.获取Cookie的value,时间
                    String value = cookie.getValue();

                    System.out.println("解码前:"+value);
                    //URL解码:
                    value = URLDecoder.decode(value,"utf-8");
                    System.out.println("解码后:"+value);

                    response.getWriter().write("<h1>欢迎回来,您上次访问时间为:"+value+"</h1>");
                    break;
                }
            }
        }
        //第一次访问
        if (cookies==null||cookies.length==0||flag==false){
            //没有名称为lastTime的Cookie
            //获取当前时间的字符串,设置Cookie的值,发送Cookie
            Date date = new Date();
            SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            String str_date = format.format(date);

            System.out.println("编码前:"+str_date);
            //URL编码
            str_date = URLEncoder.encode(str_date,"utf-8");
            System.out.println("编码后:"+str_date);

            //1.创建Cookie对象
            Cookie cookie = new Cookie("lastTime", str_date);
            //2.设置Cookie存活s时间
            cookie.setMaxAge(60*60*24);
            //3.发送Cookie
            response.addCookie(cookie);
            response.getWriter().write("<h1>您好,欢迎您首次访问</h1>");
        }
    }
}

6.4 运行

第一次访问CookieTest

在这里插入图片描述

控制台打印
在这里插入图片描述

响应的Cookie信息
在这里插入图片描述



第二次访问CookieTest

在这里插入图片描述


控制台打印
在这里插入图片描述
到这完成了使用Cookie技术记录上一次访问的时间案例。


推荐阅读:
1.会话技术Cookie详细.
2.Cookie共享问题.
3.会话技术Session详细.
4.Cookie和Session简单应用情景.

欢迎点赞评论,指出不足,笔者由衷感谢哦!~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值