JavaWeb_16_01_cookie

1 会话技术

1.1 什么是会话

  • 1、会话:一次会话中包含多次请求和响应,
  • 2、一次会话:浏览器第一次给服务器资源发出请求,会话建立,直到有一方断开为止

1.2 会话功能

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

1.3 方式

客户端技术cookie,服务器端技术session

2 Cookie—介绍

2.1 概念

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

2.2 视图分析

在这里插入图片描述

2.3 Cookie—方法介绍

  • 1、创建cookie对象,绑定数据

    • new Cookie(String name,String value);
  • 2、发送cookie对象到客户端

    • response.addCookie(Cookie cookie)
  • 3、获取请求携带的cookie,拿到数据

    • String [ ] request.getCookies( )

3 Cookie—快速入门

3.1 创建CookieServletDemo01、CookieServletDemo02

package com.zzy.cookie;

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;

/**
 * cookie的快速入门
 */
@WebServlet("/cookieServletDemo01")
public class CookieServletDemo01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1、创建cookie对象
        Cookie cookie = new Cookie("msg", "hellocookie");
        //2、发送cookie
        response.addCookie(cookie);
    }

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

package com.zzy.cookie;

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 javax.sound.midi.Soundbank;
import java.io.IOException;

/**
 * 获取cookie信息
 */
@WebServlet("/cookieServletDemo02")
public class CookieServletDemo02 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1、获取cookie
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            if (cookies!=null){
                //获取cookie的名称
                String name = cookie.getName();
                //获取cookie的值
                String value = cookie.getValue();
                System.out.println(name+"  :   "+value);
            }
        }
    }

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

3.2 访问路径

http://localhost:8080/day16/cookieServletDemo01 -------存储数据到cookie
http://localhost:8080/day16/cookieServletDemo02 -------获取请求中的cookie数据

3.3 访问结果

在这里插入图片描述

4 Cookie—原理

4.1 原理分析:基于响应头set-Cookie和请求头Cookie实现

原理分析
在这里插入图片描述

第一次请求后的响应信息中携带的cookie信息
在这里插入图片描述

第二次请求投中携带的cookie信息
在这里插入图片描述

5 Cookie—细节(demo03)

5.1、一次可不可以发送多个cookie?

  • 可以
  • 可以创建多个cookie对象,使用response调用多次addcookie()方法即可

5.2、 cookie在浏览器中保存多长时间**

  • 默认情况下,当浏览器关闭之后,Cookie数据被销毁
  • 设置cookie的生命周期,持久化存储cookie中的数据
    • setMaxAge( int second);
    • second :正数:将cookie数据写到硬盘的文件中,持久化存储,cookie存货时间
    • second:负数:默认值,存储在浏览器的内存中,浏览器关闭,cookie数据销毁
    • second: 0:表示删除cookie信息

5.3 cookie能不能存储中文?

  • 1、在Tomcat8之前,cookie中不能直接存储中文数据,需要将中文数据转码
  • 2 、在Tomcat8之后,cookie中支持中文数据

5.4 cookie的获取范围多大?

5.4.1 在同一个项目下,共享cookie信息

在同一个项目中共享cookie数据,需要设置cookie的获取范围,调用setPath(String path);
默认情况下设置成当前项目的虚拟目录(/day16)

5.4.2 在同一个Tomcat服务器下,共享cookie信息

如果要在同一个服务器中的多个web项目。共享cookie信息需要将setPath(String path);的路径设置成为一个斜杠 / ,
/ 表示Tomcat的根路径

5.4.3 不同的Tomcat的服务器下,共享cookie信息

不同服务器共享cookie数据,
需要调用方法 setDomain(String path)
设置path一级域名相同,那么多个幅服务器之间cpokie数据可以共享
案例:setDomain(" .baidu.com"),那么tieba.baidu.com就能和news.baidu.com可以共享cookie数据了

6 Cookie—特点和作用

6.1 特点

1、cookie数据存储在客户端浏览器,不安全
2、浏览器对于单个cookie的大小有限制,以及对同一个域名下的总cookie数量也有限制(20个以内)

6.2 使用

1、cookie一般用于存储少量的不太敏感的数据
2、在不登录的情况下,完成服务器对客户端的身份识别

7 Cookie—案例(记住上衣次访问时间)

7.1 案例需求

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

7.2 需求分析

1、使用cookie来完成
2、在服务器中的servlet判断是否有一个名为lastTime的cookie
2.1 有:不是第一次访问

  • 响应数据:欢迎回来,您的上次访问时间:显示时间字符串
  • 写回cookie:lastTime=yyyy-MM-dd HH:mm:ss

2.2没有是第一次访问

  • 响应数据:您好,欢迎首次访问
  • 写回cookie:lastTime=yyyy-MM-dd HH:mm:ss

7.3 代码 (CookieServletLogin)

package com.zzy.cookie;

import sun.misc.BASE64Encoder;

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 javax.xml.crypto.Data;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

@WebServlet("/cookieServletLogin")
public class CookieServletLogin extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*
        * 如果cookie存在的情况
        * */

        //设置响应消息体的数据格式以及编码
        response.setContentType("text/html;charset=utf-8");
        //1、获取素有的cookie,判断cookie的名称是不是lastTiMe
        Cookie[] cookies = request.getCookies();
        boolean flag = false;//没有cookie名为lastTime
        //2、判断cookie,遍历cookie
        if (cookies != null && cookies.length>0){
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                //4.判断名称是否是lastTime
                if ("lastTime".equals(name)){ //存在该cookie,不是第一次访问,
                    //存在lastTime的cookie,将标识符设置成true
                    flag = true;
                    //获取当前时间字符串,重新设置cookie的属性值,重新发送cookie
                    Date date = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" );
                    String format = sdf.format(date);
                    System.out.println("编码前"+format);
                    //设置URL编码
                    format = URLEncoder.encode(format, "utf-8");
                    System.out.println("编码后"+format);
                    cookie.setValue(format);
                    //设置cookie的存活时间
                    cookie.setMaxAge(30*24*60*60);
                    response.addCookie(cookie);

                    //相应数据:
                    //获取上次访问的时间
                    String time = cookie.getValue();
                    System.out.println("解码前"+time);
                    //URL解码
                    time = URLDecoder.decode(time, "utf-8");
                    System.out.println("编码后"+time);
                    response.getWriter().write("欢迎回来,您上次的访问时间是:"+time);

                    //找到之后就不再循环
                    break;
                }
            }
        }

        /*
        * 如果cookie不存在的情况
        * */

        if(cookies==null || cookies.length==0 || flag == false){
            //1、获取当前时间字符串
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String format = sdf.format(date);
            System.out.println("编码前"+format);
            //设置URL编码
            format = URLEncoder.encode(format, "utf-8");
            System.out.println("编码后"+format);

            //2.创建cookie对象
            Cookie cookie =  new Cookie("lastTime",format);
            //设置cookie的最大存活时间
            cookie.setMaxAge(30*24*60*60);
            response.addCookie(cookie);

            //3、写出响应体数据
            response.getWriter().write("您好,欢迎您首次访问");


        }

    }

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

7.4 访问路径

http://localhost:8080/day16/cookieServletLogin

7.5 访问结果

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值