forked from IT-xzy/NEW-JAVA
-
Notifications
You must be signed in to change notification settings - Fork 0
/
20181214-B-JAVA-5.html
247 lines (218 loc) · 15.7 KB
/
20181214-B-JAVA-5.html
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>葡萄藤PPT</title>
<link rel="stylesheet" href="https://ptteng.github.io/PPT/css/reveal/reveal.css">
<!-- PPT主题,可以在/css/reveal/theme/中选择其他主题,目前暂时只能使用该模板 -->
<link rel="stylesheet" href="https://ptteng.github.io/PPT/css/reveal/theme/ptt.css">
<!-- syntax highlighting 代码高亮主题 -->
<link rel="stylesheet" href="https://ptteng.github.io/PPT/lib/reveal/css/zenburn.css">
<!-- 打印和PDF输出样式 -->
<script>
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? 'https://ptteng.github.io/PPT/css/reveal/print/pdf.css' : '../css/reveal/print/paper.css';
document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
<style>
.left{ text-align: left; }
</style>
</head>
<body>
<img src="https://ptteng.github.io/PPT/img/demo/logo.png" alt="" usemap="#pttmap" class="base-logo">
<map name="pttmap">
<area shape="rect" coords="0,0,276,58" href="http://www.jnshu.com" alt="" target="_blank"/>
</map>
<div class="reveal">
<div class="slides">
<section>
<h2>什么是session?什么是cookie?session和cookie有什么区别?什么场景适用于session?什么场景适用于cookie?</h2>
<p>分享人:张泉良</p>
</section>
<section>
<p>1.背景介绍</p>
<p>2.知识剖析</p>
<p>3.常见问题</p>
<p>4.编码实战</p>
<p>5.扩展思考</p>
<p>6.参考文献</p>
<p>7.更多讨论</p>
</section>
<section class="stack past" style="top: 0px; display: block;" data-previous-indexv="0" hidden="" aria-hidden="true">
<section style="top: 267px; display: block;" class="" aria-hidden="true">
<h3>1.背景介绍</h3>
<p> (1) HTTP 无状态</p>
<p>HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。</p>
<p> (2)Cookie </p>
<p> Cookie,中文名称为“小型文本文件”,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)</P>
</section>
<section style="top: 267px; display: block;" class="" aria-hidden="true">
<p> (3) session</P>
<p>会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制,session在网络协议(例如telnet或FTP)中是非常重要的部分。</P>
<p> (4) token</P>
<p>Token是一个用户自定义的任意字符串。在成功提交了开发者自定义的这个字符串之后,Token的值会保存到服务器后台。只有服务器和客户端前端知道这个字符串,于是Token就成了这两者之间的密钥,它可以让服务器确认请求是来自客户端还是恶意的第三方</P>
</section>
</section>
<section class="stack past" style="top: 0px; display: block;" data-previous-indexv="0" hidden="" aria-hidden="true">
<section style="top: 267px; display: block;" class="" aria-hidden="true">
<h3>2.知识剖析</h3>
</section>
<section class="future" aria-hidden="true" style="top: 198px; display: none;" hidden="">
<p>(1)COOKIE机制</p>
<p>Cookie保存在客户端,只能保存字符串对象,不能保存对象类型,需要客户端浏览器的支持:客户端可以不支持,浏览器用户可能会禁用Cookie</p>
<p>通常是在服务器端创建的(当然也可以通过javascript来创建)</P>
<p>服务器通过在http的响应头加上特殊的指示,那么浏览器在读取这个指示后就会生成相应的cookie了</p>
<p>业务信息("key","value")</p>
<p>域和路径</p>
<p>请求和响应都把cookie信息加载到响应头中;依靠cookie的key传递</p>
</section>
<section class="future" aria-hidden="true" style="top: 198px; display: none;" hidden="">
<p>COOKIE常用API</p>
Servlet API封装了一个类:javax.servlet.http.Cookie,封装了对Cookie的操作
<p>Cookie保存在客户端,只能保存字符串对象,不能保存对象类型,需要客户端浏览器的支持:客户端可以不支持,浏览器用户可能会禁用Cookie</p>
<p>public Cookie(String name, String value) //构造方法,用来创建一个Cookie</p>
<p>HttpServletRequest.getCookies() //从Http请求中可以获取Cookies</P>
<p>HttpServletResponse.addCookie(Cookie) //往Http响应添加Cookie</p>
</section>
<section class="future" aria-hidden="true" style="top: 198px; display: none;" hidden="">
<p>public int getMaxAge() //获取Cookie的过期时间值</p>
<p>业务信息("key","value")</p>
<p>public void setMaxAge(int expiry) //设置Cookie的过期时间值</p>
<p>Cookie visit = new Cookie("visit", "1")</p>
</section>
<section class="future" aria-hidden="true" style="top: 198px; display: none;" hidden="">
<p>(2) SESSION机制</p>
<p>每次客户端发送请求,服务器都检查是否含有sessionId。</P>
<p>如果有,则根据sessionId检索出session并处理;如果没有,则创建一个session,并绑定一个不重复的sessionId</p>
<p>状态信息保存在服务器端,通过类似与Hashtable的数据结构来保存,能支持任何类型的对象(session中可含有多个对象)</p>
<p>
</section>
<section class="future" aria-hidden="true" style="top: 198px; display: none;" hidden="">
<p> Session的工作原理</P>
当用户访问到一个服务器,如果服务器启用Session,服务器就要为该用户创建一个SESSION.
在创建这个SESSION的时候,服务器首先检查这个用户发来的请求里是否包含了一个SESSION ID,
如果包含了一个SESSION ID则说明之前该用户已经登陆过并为此用户创建过SESSION,
那服务器就按照这个SESSION ID把这个SESSION在服务器的内存中查找出来(如果查找不到,就有可能为他新创建一个),
如果客户端请求里不包含有SESSION ID,则为该客户端创建一个SESSION并生成一个与此SESSION相关的SESSION ID。
这个SESSION ID是唯一的、不重复的、不容易找到规律的字符串,这个SESSION ID将被在本次响应中返回到客户端保存,
而保存这个SESSION ID的正是COOKIE,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。
</section>
</section>
<section class="stack past" style="top: 0px; display: block;" data-previous-indexv="0" hidden="" aria-hidden="true">
<section style="top: 267px; display: block;" class="" aria-hidden="true">
<h3>3、常见问题</h3>
</section>
<section class="future" aria-hidden="true" style="top: 198px; display: none;" hidden="">
<p>(1)、cookie 的使用场景</P>
<p>购物车:没有登录之前商品数据是保存在cookie中</P>
<p>记住用户名:利用cookie保存用户名<P>
<p>记住我 :利用cookie来保存用户名和密码(加密后保存的)</p>
</section>
<section class="future" aria-hidden="true" style="top: 198px; display: none;" hidden="">
<p>(2)、sessionid如何产生?保存到哪里</p>
sessionid是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应
存储在服务器的内存中,tomcat的StandardManager类将session存储在内存中,也可以持久化到file,数据库,memcache,redis等。
客户端只保存sessionid到cookie中,而不会保存session,session销毁只能通过invalidate或超时,关掉浏览器并不会关闭session。
</section>
<section>
<p>(3)、什么场景适用于session?什么场景适用于cookie?</p>
</section>
</section>
<section class="stack past" style="top: 0px; display: block;" data-previous-indexv="0" hidden="" aria-hidden="true">
<section class="future" aria-hidden="true" style="top: 198px; display: none;" hidden="">
<h3>4.编码实战</h3>
</section>
</section>
<section class="stack past" style="top: 0px; display: block;" data-previous-indexv="0" hidden="" aria-hidden="true">
<section class="future" aria-hidden="true" style="top: 198px; display: none;" hidden="">
<h3>5.扩展思考</h3>
</section>
<section class="future" aria-hidden="true" style="top: 198px; display: none;" hidden="">
<p>(1):session和cookie有什么区别?</p>
</section>
<section class="future" aria-hidden="true" style="top: 198px; display: none;" hidden="">
<p>1、存取方式的不同</p>
<p>Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比较艰难的.
而Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等 ,可以把Session看做是一个Java容器类!</p>
</section>
<section class="future" aria-hidden="true" style="top: 198px; display: none;" hidden="">
<p>2、安全性的不同</p>
<p>Cookie存储在客户端阅读器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以至修正Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。
假如选用Cookie,可以将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只要本人能读得懂。而假如选择Session就没问题,反正是放在服务器上,</p>
</section>
<section class="future" aria-hidden="true" style="top: 198px; display: none;" hidden="">
<p>3、有效期的不同</p>
<p>使用记住密码的登录信息长期有效。用户不用每次访问都重新登录。网站会持久地记载该用户的登录信息。只需要设置Cookie的过期时间属性为一个很大很大的数字。
由于Session依赖于名为JSESSIONID的Cookie,而CookieJSESSIONID的过期时间默许为–1,只需关闭了浏览器该Session就会失效,运用URL地址重写也不能完成。
假如设置Session的超时时间过长,服务器累计的Session就会越多,越容易招致内存溢出。</p>
</section>
<section class="future" aria-hidden="true" style="top: 198px; display: none;" hidden="">
<p>4、服务器压力的不同</p>
<p>Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。
而Cookie保管在客户端,不占用服务器资源。假如并发使用的用户十分多,Cookie是很好的选择。</p>
</section>
<section class="future" aria-hidden="true" style="top: 198px; display: none;" hidden="">
<p>5、跨域支持上的不同</p>
<p>Cookie支持跨域名访问,例如将domain属性设置为“.biaodianfu.com”,则以“.biaodianfu.com”为后缀的一切域名均能够访问该Cookie。
跨域名Cookie如今被普遍用在网络中,例如Google、Baidu、Sina等。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。
仅运用Cookie或者仅运用Session可能完成不了理想的效果。这时应该尝试一下同时运用Cookie与Session。Cookie与Session的搭配运用在实践项目中会完成很多意想不到的效果。 </p>
</section>
</section>
<section>
<h3>6.参考文献</h3>
<p>https://blog.csdn.net/weixin_37196194/article/details/55806366</p>
<p>https://www.zhihu.com/topic/19616699/top-answers</p>
<p>https://blog.csdn.net/weixin_37196194/article/details/55806366</p>
</section>
<section>
<h3>7.更多讨论</h3>
</section>
<section>
<h4>分享到此结束</h4>
<p>欢迎大家讨论</p>
</section>
<section class="stack past" style="top: 0px; display: block;" data-previous-indexv="0" hidden="" aria-hidden="true">
<section style="top: 267px; display: block;" class="" aria-hidden="true">
</section>
<section class="future" aria-hidden="true" style="top: 198px; display: none;" hidden="">
</section>
</section>
</div>
</div>
<script src="https://ptteng.github.io/PPT/lib/reveal/js/head.min.js"></script>
<script src="https://ptteng.github.io/PPT/lib/reveal/reveal.js"></script>
<script>
// 以下为常见配置属性的默认值
// {
// controls: true, // 是否在右下角展示控制条
// progress: true, // 是否显示演示的进度条
// slideNumber: false, // 是否显示当前幻灯片的页数编号,也可以使用代码slideNumber: 'c / t' ,表示当前页/总页数。
// history: false, // 是否将每个幻灯片改变加入到浏览器的历史记录中去
// keyboard: true, // 是否启用键盘快捷键来导航
// overview: true, // 是否启用幻灯片的概览模式,可使用"Esc"或"o"键来切换概览模式
// center: true, // 是否将幻灯片垂直居中
// touch: true, // 是否在触屏设备上启用触摸滑动切换
// loop: false, // 是否循环演示
// rtl: false, // 是否将演示的方向变成RTL,即从右往左
// fragments: true, // 全局开启和关闭碎片。
// autoSlide: 0, // 两个幻灯片之间自动切换的时间间隔(毫秒),当设置成 0 的时候则禁止自动切换,该值可以被幻灯片上的 ` data-autoslide` 属性覆盖
// transition: 'default', // 切换过渡效果,有none/fade/slide/convex/concave/zoom
// transitionSpeed: 'default', // 过渡速度,default/fast/slow
// mouseWheel: true, //是否启用通过鼠标滚轮来切换幻灯片
// }
// 初始化幻灯片
Reveal.initialize({
history: true,
dependencies: [
{ src: 'https://ptteng.github.io/PPT/plugin/markdown/marked.js' },
{ src: 'https://ptteng.github.io/PPT/plugin/markdown/markdown.js' },
{ src: 'https://ptteng.github.io/PPT/plugin/notes/notes.js', async: true },
{ src: 'https://ptteng.github.io/PPT/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }
]
});
</script>
</body>
</html>