Java web Cookie详解

啥是cookie?

查询有道词典得:


web和饼干有啥关系?


这个谜底等等来为大家揭晓

会话技术

web中的会话技术类似于生活中两个人聊天,不过web中的会话指的是服务器与客户端的交互

一次会话中包含多次的请求与响应,当浏览器给服务器发送请求时会话建立,直到一方断开时会话结束。
功能:在一次会话的范围内的多次请求之间,可以共享数据
这句话是什么意思呢,我用购物车来解释

1.在浏览器中,经常涉及到数据交换,如:你登录一个页面。我们经常会设置自动登录选项。那么它们就是通过cookie来记住我们的信息的, cookie是由HTTP服务器社长子的,保存在浏览器中,但HTTP协议是一种无状态协议,在数据交换完毕后,服务端和客户端的链接就会关闭,每次交换数据都需要建立新的链接。就像我们去超市买东西,没有积分卡的情况下,我们买完东西之后,超市没有我们任何的消费信息,但我们办了积分卡之后,超市就有了我们的消费信息。cookie就像是积分卡,可以保存积分,商品就是我们的信息,超市的系统就像服务器后台,HTTP协议就是交易的过程。

2.现在上许多网站都用新用户注册这一项,有时注册一下,等到下次在访问该站点时,会自动识别到你,并贴向你问好,是不是觉得很亲切?当然这种作用知识表面现象,更重要的是,网站可以利用Cookie跟踪统计用户访问该网站的习惯,比如什么时间访问,访问了哪些页面,在每个网页的停留时间等。利用这些信息,一方面是可以为用户提供个性化服务,另一方面,也可以作为了解所有用户行为的工具,对于网站经营策略的改进有一定参考价值。例如,你在某家航空公司站点查阅航班时刻表,该站点可能就创建了包含你旅行计划的Cookies,也可能它只记录了你在该站点上曾经访问过的Web页,在你下次访问时,网站根据你的情况对显示的内容进行调整,将你所感兴趣的内容放在前列。这是高级的COokie应用。

cookie的概念

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

cookie的利弊
1.将数据保存到客户端,十分方便,同时减轻服务器存储压力
2.对保存数据的个数(20)及大小有限制(4kb)

作用
cookie用来保存少量及不太敏感的数据
可以在不登入的情况下,对客户端完成身份识别(即在客户端设置一个set-cookie的键值对,在访问的时候使用键值对来获取客户端的身份)

如何使用Cookie

我从以下三个步骤来介绍cookie的使用
1.创建cookie对象
2.发送cookie对象
3.获取cookie对象
由Servlet1设置cookie,Servlet2获取cookie

Servlet1

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;
@WebServlet("/demo1")
public class Servlet1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建cookie
Cookie cookie = new Cookie("name", "zhangsan");
resp.addCookie(cookie);
} @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
}

Servlet2

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;
@WebServlet("/demo2")
public class Servlet2 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) {
//获取cookie值与名称
String value = cookie.getValue();
String name = cookie.getName();
System.out.println(name+":"+value);
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}

响应cookie


请求cookie,另外两个cookie我们这里不做介绍

图解

Cookie的相关问题

1.如何实现发送多个Cookie
2.Cookie可以在浏览器中保存多长时间
3.Cookie如何保存中文
4.Cookie共享问题

1.如何实现发送多个Cookie

使用response对象调用addCookie方法发送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;
@WebServlet("/demo1")
public class Servlet1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建cookie
//创建第一个cookie
Cookie cookie = new Cookie("name", "zhangsan");
//发送第一个cookie
resp.addCookie(cookie);
//创建第二个cookie
Cookie id = new Cookie("id", "1");
//发送第二个cookie
resp.addCookie(id);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
}
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;
@WebServlet("/demo2")
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取cookie
Cookie[] cookies = req.getCookies();
//遍历cookie数组
if (cookies!=null){
for (Cookie cookie : cookies) {
//获取cookie值与名称
String value = cookie.getValue();
String name = cookie.getName();
System.out.println(name+":"+value);
}
}
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}

客户端显示
IDEA打印

2.Cookie可以在浏览器中保存多长时间

默认情况下浏览器关闭后,Cookie数据被销毁
我们可以调用setmaxage(int seconds)方法来设置Cookie的存储时间
1.second为正数,将Cookie持久化写入硬盘,并且指定存储的时间,时间到了cookie自动失效
2.second为零,删除cookie
3.second小于零,默认值,即浏览器关闭后删除cookie

3.Cookie如何保存中文

  • 在tomcat 8 之前 cookie中不能直接存储中文数据。
    需要将中文数据转码---一般采用URL编码(%E3)
  • 在tomcat 8 之后,cookie支持中文数据。
    特殊字符还是不支持,建议使用URL编码存储,URL解码解析

比如我使用以下代码往Cookie中加入数据发送cookie浏览器就会报错,因为往cookie中加入了空格

Cookie cookie = new Cookie("name", "张  三");
//发送第一个cookie
resp.addCookie(cookie);

所以我需要使用url编码来控制数据

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; @WebServlet("/demo1")
public class Servlet1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应的消息体的数据格式以及编码
resp.setContentType("text/html;charset=utf-8");
//创建cookie
//创建第一个cookie
String name="张 三";
//URL编码
name= URLEncoder.encode(name,"utf-8");
Cookie cookie = new Cookie("name", name);
resp.addCookie(cookie);
} @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
}
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; @WebServlet("/demo2")
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取cookie
Cookie[] cookies = req.getCookies();
//遍历cookie数组
if (cookies!=null){
for (Cookie cookie : cookies) {
//获取cookie值与名称
String value = cookie.getValue();
String name = cookie.getName();
//解码前
System.out.println(name+":"+value);
//解码后
System.out.println(name+":"+ URLDecoder.decode(value,"utf-8"));
}
}
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}

结果:

不再报错

4.Cookie共享问题

1.假设在一个Tomcat服务器中部署了多个web项目,如何实现cookie在这些项目中的共享
默认情况下是不可以共享的
但是我们可以调用setpath()方法来设置cookie的获取范围默认情况下,设置当前的虚拟目录 * 如果要共享,则可以将path设置为"/"

 //设置响应的消息体的数据格式以及编码
resp.setContentType("text/html;charset=utf-8");
//创建cookie
//创建第一个cookie
String name="张 三";
//URL编码
name= URLEncoder.encode(name,"utf-8");
Cookie cookie = new Cookie("name", name);
//设置path让当前服务器下部署的所有项目共享cookie的信息
//设置为”/“即可共享
cookie.setPath("/");
resp.addCookie(cookie);
  1. 不同的tomcat服务器间cookie共享问题? * setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享 * setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享
   //设置响应的消息体的数据格式以及编码
resp.setContentType("text/html;charset=utf-8");
//创建cookie
//创建第一个cookie
String name="张 三";
//URL编码
name= URLEncoder.encode(name,"utf-8");
Cookie cookie = new Cookie("name", name);
//设置path让不同的服务器之间可以共享cookie的信息
//比如设置域名为".baidu.com"的可以共享cookie
cookie.setDomain(".baidu.com");
resp.addCookie(cookie);

如有错误还请各位批评指正,写文不易,喜欢的还请点个赞,如有疑问评论留言,我会经常更新文章,看了文章觉得有帮助的可以关注我呀

Java web Cookie详解(持久化+原理详解+共享问题+设置中文+发送多个Cookie)的更多相关文章

  1. Java web 入门知识 及HTTP协议详解

     Java  web  入门知识 及HTTP协议详解 WEB入门 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资 ...

  2. JAVA消息服务JMS规范及原理详解

    JAVA消息服务JMS规范及原理详解 一.简介 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应 ...

  3. java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用)

    java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用) 这是我关于会话技术的第二篇文章,对 Cookie有不了解的兄弟可以点击下方的Cookie跳转 Cookie链 ...

  4. Web端即时通讯技术原理详解

    前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...

  5. 新手入门:史上最全Web端即时通讯技术原理详解

    前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...

  6. 【转载】JAVA消息服务JMS规范及原理详解

    转载:https://www.cnblogs.com/molao-doing/articles/6557305.html 作者: moyun- 一.简介 JMS即Java消息服务(Java Messa ...

  7. 新手入门贴:史上最全Web端即时通讯技术原理详解

    关于IM(InstantMessaging)即时通信类软件(如微信,QQ),大多数都是桌面应用程序或者native应用较为流行,而网上关于原生IM或桌面IM软件类的通信原理介绍也较多,此处不再赘述.而 ...

  8. 大厂高级工程师面试必问系列:Java动态代理机制和实现原理详解

    代理模式 Java动态代理运用了设计模式中常用的代理模式 代理模式: 目的就是为其他对象提供一个代理用来控制对某个真实对象的访问 代理类的作用: 为委托类预处理消息 过滤消息并转发消息 进行消息被委托 ...

  9. java的加载与执行原理详解

    java程序从开发到最终运行经历了什么? (31) 编译期: 第一步:在硬盘某个位置(随意),新建一个xxx.java文件 第二步:使用记事本或者其他文本编辑器例如EditPlus打开xxx.java ...

随机推荐

  1. day54 作业

    编写代码,将当前日期按"2017-12-27 11:11 星期三"格式输出(提示:switch结构) var date = new Date() ymd = data.toLoca ...

  2. java 基本语法(十九)Optional类的使用

    java.util.Optional类1.理解:为了解决java中的空指针问题而生!Optional<T> 类(java.util.Optional) 是一个容器类,它可以保存类型T的值, ...

  3. SQLAlchemy(三):外键、连表关系

    SQLAlchemy03 /外键.连表关系 目录 SQLAlchemy03 /外键.连表关系 1.外键 2.ORM关系以及一对多 3.一对一的关系 4.多对多的关系 5.ORM层面的删除数据 6.OR ...

  4. MVC + EFCore 项目实战 - 数仓管理系统4 – 需求分解

    上次课程我们完成了项目基本的UI风格配置. 现在就开始进入我们的需求开发,我们先捋一下需求. 一.总体需求说明 项目背景第一篇文章已有介绍,我们回顾一下. 这是一个数据管理"工具类" ...

  5. (2)简单理解和使用webpack-dev-server

    webpack-dev-server能做什么? 每次打包都得像之前一样使用webapck 入口文件 -o 出口文件,每次修改都得打包一次过于麻烦,可以使用webpack-dev-server实现自动打 ...

  6. MVC + EFCore 项目实战 - 数仓管理系统6 – 数据源管理上--使用view component完成卡片列表

    上次课程我们完成了菜单的配置和开发里程碑的划定. 按照计划,我们先来开发数据仓库管理中的数据源管理(对应菜单为:数据仓库管理 / 数据源),首批支持的数据源是SQL SERVER数据库. 一.数据源管 ...

  7. CSS和JS实现文本溢出显示省略号

    本文记录实现文本溢出显示省略号的几种方式. 单行文本 三行CSS代码实现: overflow: hidden; // 文本溢出隐藏 text-overflow: ellipsis; // 显示省略号 ...

  8. 题解 CF938G 【Shortest Path Queries】

    题目让我们维护一个连通无向图,边有边权,支持加边删边和询问从\(x\)到\(y\)的异或最短路. 考虑到有删边这样的撤销操作,那么用线段树分治来实现,用线段树来维护询问的时间轴. 将每一条边的出现时间 ...

  9. SpringBoot + Spring Cloud Consul 服务注册和发现

    什么是Consul Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其它分布式服务注册与发现的方案,Consul 的方案更"一站式" ...

  10. 源码分析清楚 AbstractQueuedSynchronizer

    本文关注以下几点内容: 深入理解 ReentrantLock 公平锁和非公平锁的区别 深入分析 AbstractQueuedSynchronizer 中的 ConditionObject 深入理解 j ...