当前位置: 首页 > news >正文

JavaEE 要懂的小事:二、图解 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怎么用,干嘛用

相关文章:

  • 数据库的元数据及事务
  • WinForm输入网址打开源码
  • vector,map 注意事项
  • Atiti. Php Laravel 5.1 环境搭建以及  error 排除
  • tomcat配置文件server.xml详解
  • Nodejs和JavaWeb协助开发
  • JAVA 位操作学习
  • idea演示
  • F5 实现pool池转发
  • ie7下a/a标签不反应
  • MapReduce编程实例
  • iOS开发数据库篇—SQLite简单介绍
  • iOS开发拓展篇—音效的播放
  • 基于COOKIE的点击流数据仓库构建思路(一)
  • Tomcat热部署和虚拟目录配置
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • classpath对获取配置文件的影响
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • Java IO学习笔记一
  • ReactNative开发常用的三方模块
  • Service Worker
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 分类模型——Logistics Regression
  • 基于组件的设计工作流与界面抽象
  • 跨域
  • 实现菜单下拉伸展折叠效果demo
  • 微信开放平台全网发布【失败】的几点排查方法
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 06-01 点餐小程序前台界面搭建
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • postgresql行列转换函数
  • 正则表达式-基础知识Review
  • # 安徽锐锋科技IDMS系统简介
  • # 飞书APP集成平台-数字化落地
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (ros//EnvironmentVariables)ros环境变量
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (论文阅读40-45)图像描述1
  • (十一)图像的罗伯特梯度锐化
  • (正则)提取页面里的img标签
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转载)(官方)UE4--图像编程----着色器开发
  • **CI中自动类加载的用法总结
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .net mvc 获取url中controller和action
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET开源快速、强大、免费的电子表格组件
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • /usr/bin/env: node: No such file or directory
  • @31省区市高考时间表来了,祝考试成功
  • @vue/cli脚手架