当前位置:首页 > Java技术 > JavaEE 要懂的小事:二、图解 Cookie(小甜饼)

JavaEE 要懂的小事:二、图解 Cookie(小甜饼)

2022年08月06日 04:35:32Java技术4

Writer      :BYSocket(泥沙砖瓦浆木匠)

微         博:BYSocket

豆         瓣:BYSocket

FaceBook:BYSocket

Twitter    :BYSocket

上一篇 图解Http协议 ,这次继续Http家族中的Cookie。泥瓦匠最近看到博客园中一篇好文,如图:

image

这就是因为浏览器Cookie太大,导致请求时,请求头域过大造成发送失败。下面咱们就了解了解Cookie。按着以前的思路图文并茂哈,没图说个XX。

一、概述

首先从HTTP说起,Cookie是Http协议中那部分呢?

Cookie是什么?

自问自答:Cookie是请求头域和响应头域的字段。简单地说,就是伴随请求和响应的一组键值对的文本,小文本。所以称之为”Cookie“饼干。Cookie的生命来源于服务器。首先是客户端请求服务端,此时请求为第一次,无Cookie参数。这时候,服务端setCookie发送给客户端。记住,Cookie来源自服务端

Cookie有什么用呢?

又自问自答:Cookie来源自服务端,当然服务于客户。就像你我的会话,文字是在我们之间传递的。所以Cookie用于服务端和客户端的会话。因为Http协议是无状态的,Cookie就是维持会话,说白了就是传递数据的额外媒介。

下面我们访问百度地址。

① 产生于服务端Response,在响应头域

image

② 请求头域是这样的:(可以在Cookie Tab页发现,和响应有一样的)

image

下面泥瓦匠详细介绍其Cookie在 请求和响应 的传输过程。

二、详细介绍Cookie 传输过程

Cookie Work

直接上图,一一详细解释。顺便写个CookieServlet,模拟一下Cookie的一生。代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package org.bysocket.http;
 
import java.io.IOException;
import java.io.PrintWriter;
 
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;
 
@WebServlet(urlPatterns="/cookie")
public class CookieServletT extends HttpServlet
{
     private static final long serialVersionUID = 1L;
 
     @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());
 
         // 创建Cookie
         Cookie cookie = new Cookie("CookieName", "CookieValue");
         cookie.setMaxAge(10);
         cookie.setHttpOnly(true);
         resp.addCookie(cookie);
         
         // 响应
         PrintWriter pw = resp.getWriter();
         pw.print("< html >< body >< h1 >Hello,Cookie!</ h1 ></ body ></ html >");
     }
     
}

① 客户端访问,无服务端写入的Cookie。

代码 new Cookie(“CookieName”, “CookieValue”); 可以看出服务端产生一个新的键值对Cookie,并且设置,说明第一次请求时,请求的请求头域Cookie是没有的。下面没有CookieName=CookieValue 的Cookie值。如图:

image

② 服务端的Cookie传至浏览器。

代码中 HttpServletResponse.addCookie(cookie); 这样响应就加入了刚刚那个键值对Cookie。怎么传到浏览器(客户端)呢? 同样F12下,

image

从图中可得到,Cookie是通过HTTP的响应头域发送至浏览器。每个Cookie的set,都有一个对应Set-Cookie的头。还有其中的时间代表Cookie的存活时间,HttpOnly可是此Cookie只读模式。

③ 浏览器解析Cookie,保存至浏览器文件。

直接可以打开IE的Internet选项:

image

如图,那个位置文件就是我们Cookie存的地方。既然在哪里,泥瓦匠就去找到它。

image

打开看看,其内容就是:存放着Cookie信息和URL信息及一些关于时间的。

?
1
2
3
4
5
6
7
8
9
CookieName
CookieValue
localhost/servletBYSocket/
9728
  3416923392
  30449698
  3325104969
  30449698
  *

这样就完全搞懂了Cookie如何写入浏览器。

④ 客户端访问,有服务端写入的Cookie。

这样,同样的URL再次访问时,F12下:

image

不多解释,看图。

⑤ 服务器获取

服务端这时呢?只要简单的 getCookies() 就可以获取Cookie列表了。如图,服务端控制台打印如下:

image

泥瓦匠记忆小抄:Cookie传输小结

① 客户端访问,无服务端写入的Cookie

② 服务端的Cookie写入浏览器

③ 浏览器解析Cookie,保存至浏览器文件

④ 客户端访问,有服务端写入的Cookie

⑤ 服务器获取

四、谈Cookie的作用到XSS(跨站点脚本攻击)

Cookie没有病毒那么危险,但包含敏感信息。比如最常见的记住密码,或者一些用户经常浏览的网页数据。如图:

u=3426833575,3625518714&fm=21&gp=0

用户不希望这些泄露,甚至被攻击。但事实上存在这个攻击,究竟怎么攻击呢?我在 跨脚本攻击XSS 一文中也详细介绍并提出解决方案。

全名:Cross Site Script,中文名:跨站脚本攻击。顾名思义,是指“HTML注入”纂改了网页,插入恶意的脚本,从而在用户用浏览网页的时候,控制用户浏览器的一种攻击。一般攻击的套路如图所示:

image_thumb7

五、总结

回顾全文,Cookie是HTTP协议中的一种会话机制。也明白下面两个问题就好了

1、What 什么是Cookie

2、How Cookie怎么用,干嘛用

Writer      :BYSocket(泥沙砖瓦浆木匠)

微         博:BYSocket

豆         瓣:BYSocket

FaceBook:BYSocket

Twitter    :BYSocket

作者:程序员泥瓦匠
来源链接:https://bysocket.blog.csdn.net/article/details/46391335

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/18428.html

分享给朋友:

“JavaEE 要懂的小事:二、图解 Cookie(小甜饼)” 的相关文章

一分钟搞定Java环境变量配置

一分钟搞定Java环境变量配置

对于学Java的人来说,成功配置环境变量是第一步,因为后期不论 你做什么工作,会发现都需要这些,接下来介绍如何安装与配置,我按照jdk1.6来说明,其他一致。 下载官网 首先将jdk安装好后进行配置。 右击“计算机”,右键打开“属性”,...

1024 节日快乐!Linux find 命令介绍

1024 节日快乐!Linux find 命令介绍

前言   作为开发人员的的我们,经常会遇到在服务器中查询搜索需要的某个文件或者某个文件夹,Linux服务器并不像WIndows那样可以在可视化的界面进行搜索查找的操作,这时我们经常会使用到find命令来进行查询。你了解find的命令吗?本文将与大家一起分享find命令的操作...

如何读取服务器中文本文件并转为文字

如何读取服务器中文本文件并转为文字 ​ 开发代码的过程中,当数据内容过长或者过大时,考虑性能,一般会选择将数据上传到文件服务器,而并非存到数据库中,当需要对数据进行解析处理时,需要把文件从服务器中读取下来并解析为想要的数据,这里将解析为字符串的方法进行示例...

SpringBoot之整合Mybatis篇

SpringBoot之整合Mybatis篇

开头语 啪嚓,醒木一拍(咳咳) ,上回书我们说到:SpringBoot的简单搭建,也就是SpringBoot的搭建流程,简单的将项目进行启动,本次,我们简单的把SpringBoot与持久层框架Mybatis进行整合,接下来,我们开始。 Mybatis名词解释   &...

浅谈RPC原理

浅谈RPC原理

一、概念定义 百度百科: RPC(Remote Procedure Call ),即远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨...

SpringBoot整合Dubbo与zookeeper纯注解版

SpringBoot整合Dubbo与zookeeper纯注解版

一、Dubbo和zk的作用 上回讲到,Dubbo作为一款优秀的RPC框架,封装了dubbo-provider(提供者)和dubbo-consumer(消费者),而provider和consumer之间需要通过注册中心来作为可发现的服务目录。而zookeeper(此处简称zk)提供了服务接口注...

linux系统(CentOS7)下安装jdk8

linux系统(CentOS7)下安装jdk8

一、开头语 Java跨系统的特性,使得Java项目可以在各平台之间运行,Linux操作系统是一个开源的系统,目前被全球很多企业用来当做服务器系统,目前开发的许多web工程,几乎都会在linux系统上部署,今天来整理下linux下如何安装Java开发工具包,JDK1.8版本。 二、开始安装...

linux系统(CentOS7)下安装tomcat8及加载缓慢处理

linux系统(CentOS7)下安装tomcat8及加载缓慢处理

一、下载tomcat 地址奉上 二、linux下安装 1.使用SecureCRT终端连接服务器 2.使用sftp Session上传tomcat压缩包到服务器上 3.使用tar -zxvf 命令解压tomcat 4.进入bin目录启动tomcat(./sta...

Mybatis分页插件PageHelper的使用

Mybatis分页插件PageHelper的使用

开头语 上回书说到:将SpringBoot和持久层框架Mybtais进行简单整合,整合时,使用了Mybatis的分页插件PageHelper,但并未介绍如何使用该分页插件,本次讲解PageHelper的常见的使用方法,请大家提意见 什么是PageHelper 在使用Java语言开发项目...

SpringBoot整合hibernate纯注解版

SpringBoot整合hibernate纯注解版

一、hibernate是什么 hibernate是一款优秀的ORM(Object Relational Mapping ,对象关系映射)框架,是一种面向对象编程的框架,它对JDBC进行了封装,是一个全自动的ORM框架,可以自动生成SQL语句,也可以自定义HQL进行执行脚本。 优点:hib...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。