18.客户端会话技术Cookie

目录

一、会话技术(Cookie和Session)

二、客户端会话技术Cookie

1.Cookie的实现原理

2.Cookie使用步骤

3.Cookie的特点

3.1Cookie可以创建几个对象?

3.2Cookie的存活时间?

3.3Cookie存取中文?

3.4Cookie的共享问题

4.Cookie的作用

5.使用Cookie实现记录上一次登录的访问时间


一、会话技术(Cookie和Session)

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

一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止

功能:在一次会话的范围内的多次请求建立连接,共享数据

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

二、客户端会话技术Cookie

客户端会话技术,将数据保存到客户端

1.Cookie的实现原理

客户端请求服务器后,如果服务器需要记录用户状态,服务器会在响应信息中包含一个Set-Cookie的响应头,客户端会根据这个响应头存储Cookie信息。再次请求服务器时,客户端会在请求信息中包含一个Cookie请求头,而服务器会根据这个请求头进行用户身份、状态等较验。

2.Cookie使用步骤

先创建Cookie对象,绑定数据

new Cookie(String name, String value)

发送Cookie对象

resp.addCookie(Cookie cookie)

获取Cookie对象,拿到数据

Cookie[] cookie =  req.getCookie()

@WebServlet("/only-set-cookie")
public class OnlySetCookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 创建Cookie对象
        Cookie cookie1 = new Cookie("first-name", "first-pwd");
        // 发送Cookie对象
        resp.addCookie(cookie1);
        // 创建Cookie对象
        Cookie cookie2 = new Cookie("second-name", "second-pwd");
        // 发送Cookie对象
        resp.addCookie(cookie2);
    }
    }
}
@WebServlet("/only-get-cookie")
public class OnlyGetCookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取Cookie对象
        Cookie[] cookies = req.getCookies();
        if(cookies != null){
            for (Cookie cookie : cookies) {
                System.out.println(cookie.getName() + ":" + cookie.getValue());
            }
        }
    }
}

先在浏览器访问/only-set-cookie,再访问/only-get-cookie

当访问/only-set-cookie时,由于是第一次访问,请求头是不带参数的,但是响应头中有set-Cookie

 

当访问/only-get-cookie时请求头中有Cookie

3.Cookie的特点

(1)Cookie存储数据在客户端浏览器

(2)浏览器对于单个Cookie的大小有一定的限制(4kb),对于同一个域名下的总Cookie数量有限制(20个)

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

3.1Cookie可以创建几个对象?

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

3.2Cookie的存活时间?

默认情况下,当浏览器关闭后,Cookie数据被销毁。但是如果想要持久化存储可以调用setMaxAge(int second)方法设置时间,时间到后,Cookie文件会自动失效。

  • maxAge设置正数:将Cookie数据写入硬盘文件中,设置Cookie的存活时间
  • maxAge设置正数:表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。maxAge为负数的Cookie,为临时性Cookie,不会被持久化,不会被写到Cookie文件中。Cookie信息保存在浏览器内存中,因此关闭浏览器该Cookie就消失了。Cookie默认的maxAge值为-1
  • maxAge设置为0:表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除

3.3Cookie存取中文?

有时候使用Cookie存取中文会出现乱码的问题,这时候在存取Cookie时需要使用URL编码进行一个编码和解码

编码:String value = URLEncoder.encode("张三", "utf-8");

解码:URLDecoder.decode(cookie.getValue(), "UTF-8");

@WebServlet("/demo")
public class Demo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 创建Cookie对象
        String value = URLEncoder.encode("张三", "utf-8");
        Cookie cookie1 = new Cookie("name", value);
        // 发送Cookie对象
        resp.addCookie(cookie1);
    }
}
@WebServlet("/Get")
public class Get extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取Cookie对象
        Cookie[] cookies = req.getCookies();
        for (Cookie cookie : cookies) {
            System.out.println(cookie.getName() + ":" + URLDecoder.decode(cookie.getValue(), "UTF-8"));
        }
    }
}

在请求头和响应头中看到的是编码之后的内容 

在IDEA中打印出来的信息

3.4Cookie的共享问题

当使用同一个tomcat启动两个Web项目时,怎么让两个项目获取到的Cookie进行共享

demo1下的Set和Get,demo1下的Cookie是first-name first-pwd

@WebServlet("/Set")
public class Set extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 创建Cookie对象
        Cookie cookie = new Cookie("first-name", "first-pwd");
        // 发送Cookie对象
        resp.addCookie(cookie);
    }
}
@WebServlet("/Get")
public class Get extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取Cookie对象
        Cookie[] cookies = req.getCookies();
        for (Cookie cookie : cookies) {
            System.out.println(cookie.getName() + " " +cookie.getValue());
        }
    }
}

demo2下的Set和Get ,demo2下的Cookie是Second-name Second-pwd

@WebServlet("/set")
public class Set extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 创建Cookie对象
        Cookie cookie = new Cookie("second-name", "second-pwd");
        // 发送Cookie对象
        resp.addCookie(cookie);
    }
}
@WebServlet("/get")
public class Get extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取Cookie对象
        Cookie[] cookies = req.getCookies();
        for (Cookie cookie : cookies) {
            System.out.println(cookie.getName() + " " + cookie.getValue());
        }
    }
}

先访问/demo1/Set和 /demo1/Get

先访问/demo2/set和 /demo2/get 

说明两个项目中获取到的Cookie是不一样的,如果想从demo2中获取到demo1中的Cookie,可以使用cookie.setPath("/");

cookie.setPath("/");

demo1中的Set类

@WebServlet("/Set")
public class Set extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 创建Cookie对象
        Cookie cookie = new Cookie("first-name", "first-pwd");
        // 发送Cookie对象
        cookie.setPath("/");
        resp.addCookie(cookie);
    }
}

先从demo1中获取到Cookie 

 

再从demo2中获取到Cookie,这样就可以实现Cookie的共享  

 

如果是不同的两个tomcat,怎么让两个项目获取到的Cookie进行共享,使用cookie.setDomain()方法,这个参数必须以“.”开始。  输入url访问的时候,必须输入域名才能解析。如果使用  cookie.setDomain(".new.com");,在另外一个电脑上输入http://home.new.com:8080/就可以获得Cookie,如果输入http://localhost:8080/就不能获得Cookie

  cookie.setDomain(".new.com");

4.Cookie的作用

(1)Cookie一般用于存储少量的不太敏感的数据

(2)可以在不登陆的情况下,完成服务器对客户端的身份识别

5.使用Cookie实现记录上一次登录的访问时间

1.访问一个Servlet,如果是第一次访问,提示:欢迎您首次访问

2.如果不是第一次访问,提示:欢迎回来,上次访问时间是:显示字符串

在服务器中的Servlet判断是否存在一个lastTime的Cookie

第一次访问-----提示:欢迎您首次访问,写回Cookie

不是第一次访问-----提示:欢迎回来,写回Cookie

package cn;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

@WebServlet("/lastTimeCookie")
public class LastTimeCookie extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        // 1.先获取所有的Cookie
        Cookie[] cookies = req.getCookies();
        if(cookies == null || cookies.length == 0){
            // 第一次访问
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String time = sdf.format(date);
            // 因为time中间有个空格,要进行URL编码解码
            time = URLEncoder.encode(time, "utf-8");
            Cookie cookie = new Cookie("lastTime",time);

            // 设置Cookie的存活时间,一个月
            cookie.setMaxAge(60 *60 *24 *30);
            resp.addCookie(cookie);


            resp.getWriter().write("欢迎您首次访问");

        }

        if(cookies != null){
            for(Cookie cookie: cookies){
                String name = cookie.getName();
                if(name.equals("lastTime")){
                    // 获取当前时间,重新设置Cookie值
                    Date date = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    String time = sdf.format(date);
                    // 因为time中间有个空格,要进行URL编码解码
                    time = URLEncoder.encode(time, "utf-8");
                    cookie.setValue(time);

                    // 设置Cookie的存活时间,一个月
                    cookie.setMaxAge(60 *60 *24 *30);
                    resp.addCookie(cookie);


                    String value = URLDecoder.decode(cookie.getValue(), "utf-8");
                    resp.getWriter().write("欢迎回来,上次访问时间是" + value);
                    break;
                }
            }
        }
    }
}

 首次访问

第二次访问 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

学习java的张三

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

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

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

打赏作者

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

抵扣说明:

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

余额充值