JavaEE 要懂的小事:三、图解Session(会话)
Writer :BYSocket(泥沙砖瓦浆木匠)
微 博:BYSocket
豆 瓣:BYSocket
FaceBook:BYSocket
Twitter :BYSocket
相继 图解Http协议 和 图解Cookie 之后,中间迷茫期哈,没写了!可是又要告诉你自己明明喜欢写为啥不写了!那就写吧,学到老学到老~ 然后写到老!本系列皆以图为主,力求简单易懂,娓娓道来`
一、Session由来
HTTP的无状态,也就是说,每次请求都是独立的线程。举个例子吧:购物中,你选择了A商品,加入购物车,这就是A线程。然后在选择B商品就是B线程。可是每次线程独立(对容器而言,A、B成了不同的用户),线程A不知道有B,B也不知道A。如何一起付款呢?
简答来说:怎么保存同个用户多个请求会话状态呢?自然HTTPS保证连接是安全的,可以使它与一个会话关联。
问题就在于如何跟踪同一个用户,选择自然很多:
1、EJB(有状态会话bean保存会话状态) 环境苛刻需要带EJB的J2EE服务器,而不是Tomcat这种Web容器。
2、数据库(这貌似万能的。针对数据)
3、就是我们要讲的HttpSeesion,保存跨一个特定用户多个请求的会话状态。
4、上面说的HTTPS,条件太苛刻了。
如图:
二、Session机制
机制,什么用词有点高大上。其实就是把它内在的一点东西说出来。主要两个W:What?How?
What is Session?
Session代表着服务器和客户端一次会话的过程。直到session失效(服务端关闭),或者客户端关闭时结束。
How does session works?
Session 是存储在服务端的,并针对每个客户端(客户),通过SessionID来区别不同用户的。Session是以Cookie技术或URL重写实现。默认以Cookie技术实现,服务端会给这次会话创造一个JSESSIONID的Cookie值。
补充:
其实还有一种技术:表单隐藏字段。它也可以实现session机制。这里只是作为补充,服务器响应前,会修改form表单,添加一个sessionID类似的隐藏域,以便传回服务端的时候可以标示出此会话。
这技术,也可以使用在Web安全上,可以有效地控制CRSF跨站请求伪造。
三、详细介绍Seesion机制过程
图中这是session第一次请求的详细图。以Cookie技术实现,我也写了个HttpSessionByCookieServletT.java 的Servlet小demo,模拟下Seesion的一生。代码如下:
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
|
package org.servlet.sessionMngmt; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /* * Copyright [2015] [Jeff Lee] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @author Jeff Lee * @since 2015-7-12 10:58:28 * HttpSession的默认Cookie实现案例 */ @WebServlet (urlPatterns = "/sessionByCookie" ) public class HttpSessionByCookieServletT extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获取session // 如果是第一次请求的话,会创建一个HttpSeesion,等同于 req.getSession(true); // 如果已存在session,则会获取session。 HttpSession session = req.getSession(); if (session.isNew()) { // 设置session属性值 session.setAttribute( "name" , "Jeff" ); } // 获取SessionId String sessionId = session.getId(); PrintWriter out = resp.getWriter(); // 如果HttpSeesion是新建的话 if (session.isNew()) { out.println( "Hello,HttpSession! <br>The first response - SeesionId=" + sessionId + " <br>" ); } else { out.println( "Hello,HttpSession! <br>The second response - SeesionId=" + sessionId + " <br>" ); // 从Session获取属性值 out.println( "The second-response - name: " + session.getAttribute( "name" )); } } } |
隆重打个小广告:
泥瓦匠学习的代码都在github上(同步osc git),欢迎大家点star,提意见,一起进步。地址:https://github.com/JeffLi1993
① 客户端向服务端发送第一次请求
此时,客户端想让服务端把自己的名字设置到会话中。
② 服务端的容器产生该用户唯一sessionID的session对象,并设置值
可以从代码中看出通过从请求中req.getSession(),新生成了一个session对象。并设置了setAttribute(“name”, “Jeff”),key为string,value是对象皆可。
这时候,我们不用再把session通过cookie技术处理,容器帮我们处理了。
③ 容器响应 Set-Cookie:JSESSIONID= …
我们可以F12,查看此次响应。
从图中可得到,每个Cookie的set,都有一个对应Set-Cookie的头。HttpOnly可是此Cookie只读模式。只不过session唯一标识是:JSESSIONID
④ 浏览器解析Cookie,保存至浏览器文件。
如图,找到了对应的session存储的cookie文件。该文件被保护不能打开。图解Cookie 教你怎么找到该文件。
第二次请求会发什么变化呢?
下面,泥瓦匠重新访问了这个地址:
① 再次请求
此时,请求会有Cookie值:JSESSIONID=… 该值传给服务端
② 容器获取SessionId
,关联HttpSession
③ 此时响应无SetCookie
如图:
但是这次请求,我们响应出上一次请求set的值。Jeff 就打印出来了!
关于服务端获取session,也就是从请求中获取session对象,容器会帮你根据Cookie找到唯一的session对象。
泥瓦匠记忆小抄:Seesion机制,记住两次请求图即可。
四、补充
点到为止哈~ 以后详细写。此图来自网络
上图Bad guy,就是攻击者。跨站请求伪造,伪造用户请求来对服务器数据或者是用户等造成威胁。web安全也就是从这些基础中慢慢提升。
五、总结
1、大概地描述了session的工作机制,和一些安全相关。记住Seesion是什么,怎么用,在服务端客户端之间怎么传输即可。
2、泥瓦匠学习的代码都在github上(同步osc git),欢迎大家点star,提意见,一起进步。地址:https://github.com/JeffLi1993
Writer :BYSocket(泥沙砖瓦浆木匠)
微 博:BYSocket
豆 瓣:BYSocket
FaceBook:BYSocket
Twitter :BYSocket
JavaEE 要懂的小事:三、图解Session(会话)的更多相关文章
- JavaEE 要懂的小事:一、图解Http协议
Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter ...
- JavaEE 要懂的小事:二、图解 Cookie(小甜饼)
Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter ...
- Java EE : 三、图解Session(会话)
目录 Java EE : 一.图解Http协议 Java EE : 二.图解 Cookie(小甜饼) Java EE : 三.图解Session(会话) 概述 一.Session由来 二.Sessio ...
- Tomcat负载均衡、调优核心应用进阶学习笔记(三):LNMT nginx+tomcat、LAMT apache+tomcat、session会话保持、不错的站点
文章目录 LNMT nginx+tomcat LAMT apache+tomcat 基于mod_proxy 单节点 配置基于mod_proxy的负载均衡 基于mod_jk(需要编译安装) 单节点 配置 ...
- java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用)
java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用) 这是我关于会话技术的第二篇文章,对 Cookie有不了解的兄弟可以点击下方的Cookie跳转 Cookie链 ...
- Cookie&Seesion会话 共享数据 工作流程 持久化 Servlet三个作用域 会话机制
Day37 Cookie&Seesion会话 1.1.1 什么是cookie 当用户通过浏览器访问Web服务器时,服务器会给客户端发送一些信息,这些信息都保存在Cookie中.这样,当该浏览器 ...
- SpringMVC归纳-2(Session会话、拦截器)
要点: 1.HttpSession:一个session的建立是从一个用户向服务器发第一个请求开始,而以用户显式结束或session超时为结束,借助session能在一定时间内记录用户状态. 2.Mod ...
- 分布式Tomcat session会话Sticky Sessions问题
分布式session会话Sticky Sessions - tomcat_baby的专栏 - CSDN博客https://blog.csdn.net/tomcat_baby/article/detai ...
- session会话对象
一.session会话对象介绍: 会话对象让你能够跨请求保持某些参数,它也会在同一个session实例发出的所有请求之间保持cookie. 二.步骤 1.对session对象进行一次实例化 2.进行登 ...
随机推荐
- (摘录)String是值传递还是引用传递
String应该是一个封装类型,它应该是引用传递,是可以改变值的, 运行的结果应该是”cd”.我们实际运行一下看看, str=ab,这如何解释呢?难道String是基本类型?也说不通呀. 这就要从ja ...
- Mysql双主互备+keeplived高可用架构(部分)
一.Mysql双主互备+keeplived高可用架构介绍 Mysql主从复制架构可以在很大程度保证Mysql的高可用,在一主多从的架构中还可以利用读写分离将读操作分配到从库中,减轻主库压力.但是在这种 ...
- win10 64位 安装scrapy
在学习python时,不可避免下载了Anaconda,当我打算写爬虫时,urllib,requests,selenium,pyspider都已经安装好了,可以直接使用了,但是有一天我想要使用scrap ...
- oracle执行计划走偏处理步骤
-- sql执行时间select a.EXECUTIONS,a.ELAPSED_TIME,a.ELAPSED_TIME/a.EXECUTIONS/1000/1000 as 秒,a.SQL_ID,a.H ...
- 日程管理Demo4中的bug
Demo4的github地址 模拟器有点慢之后贴图 https://git.oschina.net/annie_guo/study.git 在登陆注册界面中java的提示语言(Login.java) ...
- 安装Pangolin
Pangolin是一个用于OpenGL显示/交互以及视频输出的一个轻量级 快速开发库 一:安装必要的库 1.Glew sudo apt-get install libglew-dev 2.Cmake ...
- 基本数据类型的包装类(Interger)
基本数据类型 vs包装类 byte Byte short Short char Character int Integer long Long float Float double Double bo ...
- Unity一键设置导入图片格式
前几天由于项目原因,做了一个自动根据模型自动创建动画状态机,然后紧接着做了根据动画状态机和模型一键制作Prefab. 现在因为图片数量或者其它原因需要写一个一键设置图片格式的插件. 至于制作动画状态机 ...
- Redis-08.命令参数详解
1. redis-cli -r(repeat)选项代表江命令执行多次 # 执行3次ping命令 redis-cli -r 3 ping -i(interval)选项代表每个几秒执行一次命令(必须和-r ...
- 剑指offer面试题24:二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是返回true,否则返回false. 假设输入的数组任意两个数字都不相同 解题思路:二叉搜索树的特点是根节点的左子树的值小于等 ...