Java EE : 三、图解Session(会话)
2015-09-23 16:53
309 查看
目录
Java EE : 一、图解Http协议
Java EE : 二、图解 Cookie(小甜饼)
Java EE : 三、图解Session(会话)
概述
一、Session由来
二、Session机制
三、详细介绍Seesion机制过程
四、补充
五、总结
参考
简答来说:怎么保存同个用户多个请求会话状态呢?自然HTTPS保证连接是安全的,可以使它与一个会话关联。
问题就在于如何跟踪同一个用户,选择自然很多:
1、EJB(有状态会话bean保存会话状态) 环境苛刻需要带EJB的J2EE服务器,而不是Tomcat这种Web容器。
2、数据库(这貌似万能的。针对数据)
3、就是我们要讲的HttpSeesion,保存跨一个特定用户多个请求的会话状态。
4、上面说的HTTPS,条件太苛刻了。
如图:
What is Session?
Session代表着服务器和客户端一次会话的过程。直到session失效(服务端关闭),或者客户端关闭时结束。
How does session works?
Session 是存储在服务端的,并针对每个客户端(客户),通过SessionID来区别不同用户的。Session是以Cookie技术或URL重写实现。默认以Cookie技术实现,服务端会给这次会话创造一个JSESSIONID的Cookie值。
补充:
其实还有一种技术:表单隐藏字段。它也可以实现session机制。这里只是作为补充,服务器响应前,会修改form表单,添加一个sessionID类似的隐藏域,以便传回服务端的时候可以标示出此会话。
这技术,也可以使用在Web安全上,可以有效地控制CRSF跨站请求伪造。
图中这是session第一次请求的详细图。以Cookie技术实现,我也写了个HttpSessionByCookieServletT.java 的Servlet小demo,模拟下Seesion的一生。代码如下:
?
① 客户端向服务端发送第一次请求
此时,客户端想让服务端把自己的名字设置到会话中。
② 服务端的容器产生该用户唯一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是什么,怎么用,在服务端客户端之间怎么传输即可。
参考
1. JavaEE 要懂的小事:三、图解Session(会话)
Java EE : 一、图解Http协议
Java EE : 二、图解 Cookie(小甜饼)
Java EE : 三、图解Session(会话)
概述
一、Session由来
二、Session机制
三、详细介绍Seesion机制过程
四、补充
五、总结
参考
一、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的一生。代码如下:
?
① 客户端向服务端发送第一次请求
此时,客户端想让服务端把自己的名字设置到会话中。
② 服务端的容器产生该用户唯一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是什么,怎么用,在服务端客户端之间怎么传输即可。
参考
1. JavaEE 要懂的小事:三、图解Session(会话)
相关文章推荐
- Struts2的输入校验
- spring hibernate c3p0中遇到问题
- Spring Ws
- Struts2自定义类型转换器
- Thinking in java:多线程详解
- JAVA基础--db08_java继承-单例模式
- 使用springmvc+jackson+hibernate返回JSON数据
- java中注解的使用与实例 (二)
- ubuntu 上 java的安装
- java生成解析二维码功能
- 【ECLIPSE】两步完成eclipse配色
- SpringMVC进阶(四)——注解开发
- 利用java 泛型实现BaseDao
- Java EE : 二、图解 Cookie(小甜饼)
- JAVA问题总结之28--读取某目录下所有文件
- struts2<s:iterator>遍历map小结
- Struts2对于国际化(i18n)的支持
- JAVA问题总结之27--创建100个文件
- Spring单例模式与线程安全
- 原创:Spring整合junit测试框架(简易教程 基于myeclipse,不需要麻烦的导包)