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. day05 程序与用户交互和基本运算符

    程序与用户交互和基本运算符 目录 程序与用户交互和基本运算符 1.程序与用户交互 1.1什么是与用户交互 1.2为什么要与用户交互 1.3如何与用户交互 1.3.1格式化输出 2基本运算符 2.1算数 ...

  2. 安装更强大更美观的zsh,配置oh my zsh及插件

    安装更强大更美观的zsh,配置oh my zsh及插件 #0x0 安装zsh #0x1 安装oh my zsh #0x2 配置zshrc #0x3 配置主题 #0x4 安装插件 #0x5 小结 #0x ...

  3. flask 源码专题(十):flash源码研究

    flash源码 def flash(message, category="message"): flashes = session.get("_flashes" ...

  4. java 数据结构(六):数组与集合

    1. 集合与数组存储数据概述:集合.数组都是对多个数据进行存储操作的结构,简称Java容器.说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt,.jpg,.avi,数据库中) ...

  5. python生成器原理剖析

    python生成器原理剖析 函数的调用满足"后进先出"的原则,也就是说,最后被调用的函数应该第一个返回,函数的递归调用就是一个经典的例子.显然,内存中以"后进先出&quo ...

  6. Django之ORM查询操作详解

    浏览目录 一般操作 ForeignKey操作 ManyToManyField 聚合查询 分组查询 F查询和Q查询 事务 Django终端打印SQL语句 在Python脚本中调用Django环境 其他操 ...

  7. Spring详细基本开发流程

    LOGO 文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star! 搜索关注微信公众号 码出Offer 领取各种学习资料! 一.Spring概述 1.1 Web开发中的一些问 ...

  8. day1 python计算器底层运作,注释及变量

    每日一记 utf-8 国际标准编码(可变长的unicode编码)中文3字节,英文数字特殊字符1字节 gbk 中国标准编码 中文2字节,英文数字特殊字符1字节 1.原码,反码,补码 "&quo ...

  9. 关于Object.defineProperty

    讲解大致会根据下图展开     本文部分参考了书籍<你不知道的javascript>上卷 对象的定义与赋值 经常使用的定义与赋值方法obj.prop =value或者obj['prop'] ...

  10. 阿里P9又有新瓜吃咯,马云震怒!!

    自从蒋凡出轨事件曝光之后,阿里这各种瓜来得就像龙卷风,隔三差五的爆出员工出轨事件,普通员工.中层.高管全覆盖,早已集齐7颗阿里瓜瓜,可以召唤神龙了. 上次的出轨事件过去还没有一个月的时间,今天又爆出来 ...