请选择 进入手机版 | 继续访问电脑版

技术控

    今日:115| 主题:54120
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] 图解 Session(会话)

[复制链接]
愛到了分開⊙ 发表于 2016-11-27 15:01:26
197 6

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
相继   图解Http协议     和     图解Cookie     之后,中间迷茫期哈,没写了!可是又要告诉你自己明明喜欢写为啥不写了!那就写吧,学到老学到老~ 然后写到老!本系列皆 以图为主 ,力求 简单易懂 ,娓娓道来`  
   一、Session由来

   HTTP的 无状态 ,也就是说,每次请求都是独立的线程。举个例子吧:购物中,你选择了A商品,加入购物车,这就是A线程。然后在选择B商品就是B线程。可是每次线程独立(对容器而言,A、B成了不同的用户),线程A不知道有B,B也不知道A。如何一起付款呢?
   简答来说: 怎么保存同个用户多个请求会话状态呢 ?自然 HTTPS 保证连接是安全的,可以使它与一个会话关联。
  问题就在于如何跟踪同一个用户,选择自然很多:
   1、 EJB (有状态会话bean保存会话状态) 环境苛刻需要带EJB的J2EE服务器,而不是Tomcat这种Web容器。
   2、 数据库 (这貌似万能的。针对数据)
   3、就是我们要讲的 HttpSession保存跨一个特定用户多个请求的会话状态
   4、上面说的 HTTPS ,条件太苛刻了。
   如图:

图解 Session(会话)

图解 Session(会话)

   二、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安全上,可以有效地控制 CSRF跨站请求伪造
   三、详细介绍Session机制过程

   

图解 Session(会话)

图解 Session(会话)

   图中这是session 第一次请求 的详细图。以Cookie技术实现,我也写了个HttpSessionByCookieServletT.java 的Servlet小demo,模拟下Session的一生。代码如下:
  1. package org.servlet.sessionMngmt;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import javax.servlet.http.HttpSession;
  10. /*
  11. * Copyright [2015] [Jeff Lee]
  12. *
  13. * Licensed under the Apache License, Version 2.0 (the "License");
  14. * you may not use this file except in compliance with the License.
  15. * You may obtain a copy of the License at
  16. *
  17. *   http://www.apache.org/licenses/LICENSE-2.0
  18. *
  19. * Unless required by applicable law or agreed to in writing, software
  20. * distributed under the License is distributed on an "AS IS" BASIS,
  21. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  22. * See the License for the specific language governing permissions and
  23. * limitations under the License.
  24. */
  25. /**
  26. * @author Jeff Lee
  27. * <a href='http://www.jobbole.com/members/chchxinxinjun'>@since</a> 2015-7-12 10:58:28
  28. *  HttpSession的默认Cookie实现案例
  29. */
  30. @WebServlet(urlPatterns = "/sessionByCookie")
  31. public class HttpSessionByCookieServletT extends HttpServlet {
  32.     private static final long serialVersionUID = 1L;
  33.     @Override
  34.     protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  35.             throws ServletException, IOException {
  36.         
  37.         // 获取session
  38.         // 如果是第一次请求的话,会创建一个HttpSession,等同于 req.getSession(true);
  39.         // 如果已存在session,则会获取session。
  40.         HttpSession session = req.getSession();
  41.         
  42.         if (session.isNew()) {
  43.             // 设置session属性值
  44.             session.setAttribute("name", "Jeff");
  45.         }
  46.         // 获取SessionId
  47.         String sessionId = session.getId();
  48.         
  49.         PrintWriter out = resp.getWriter();
  50.         // 如果HttpSession是新建的话
  51.         if (session.isNew()) {
  52.             out.println("Hello,HttpSession! <br>The first response - SessionId="
  53.                     + sessionId + " <br>");
  54.         } else {
  55.             out.println("Hello,HttpSession! <br>The second response - SessionId="
  56.                     + sessionId + " <br>");
  57.             // 从Session获取属性值
  58.             out.println("The second-response - name: "
  59.                     + session.getAttribute("name"));
  60.         }
  61.         
  62.     }
  63.    
  64. }
复制代码
① 客户端向服务端发送第一次请求
  此时,客户端想让服务端把自己的名字设置到会话中。
  ② 服务端的容器产生该用户唯一sessionID的session对象,并设置值
  可以从代码中看出通过从请求中req.getSession(),新生成了一个session对象。并设置了setAttribute(“name”, “Jeff”),key为string,value是对象皆可。
   这时候,我们不用再把session通过cookie技术处理, 容器 帮我们 处理 了。
  ③ 容器响应 Set-Cookie:JSESSIONID= …
  我们可以F12,查看此次响应。
   

图解 Session(会话)

图解 Session(会话)

   从图中可得到,每个Cookie的set,都有一个对应Set-Cookie的头。HttpOnly可是此Cookie只读模式。只不过 session唯一标识 是: JSESSIONID
  ④ 浏览器解析Cookie,保存至浏览器文件。
   

图解 Session(会话)

图解 Session(会话)

   如图,找到了对应的session存储的cookie文件。该文件被保护不能打开。  图解Cookie     教你怎么找到该文件。  
  第二次请求会发什么变化呢?
   

图解 Session(会话)

图解 Session(会话)

  下面,泥瓦匠重新访问了这个地址:
  ① 再次请求
   

图解 Session(会话)

图解 Session(会话)

   此时,请求会有Cookie值: JSESSIONID=… 该值传给服务端
   ② 容器获取SessionId
,关联HttpSession
  ③ 此时响应无SetCookie
  如图:
   

图解 Session(会话)

图解 Session(会话)

  但是这次请求,我们响应出上一次请求set的值。Jeff 就打印出来了!
  关于服务端获取session,也就是从请求中获取session对象,容器会帮你根据Cookie找到唯一的session对象。
  泥瓦匠记忆小抄:Session机制,记住两次请求图即可。
   四、补充

  点到为止哈~ 以后详细写。此图来自网络
   

图解 Session(会话)

图解 Session(会话)

  上图Bad guy,就是攻击者。跨站请求伪造,伪造用户请求来对服务器数据或者是用户等造成威胁。web安全也就是从这些基础中慢慢提升。
   五、总结

   1、大概地描述了session的工作 机制 ,和一些 安全 相关。记住Session是什么,怎么用,在服务端客户端之间怎么传输即可。
    2、泥瓦匠学习的 代码 都在 github 上(同步osc git),欢迎大家点star,提意见,一起进步。 地址:      https://github.com/JeffLi1993  



上一篇:Java and Scala&#x27;s Type Systems are Unsound
下一篇:Talk: How Bitcoin Works
芷珍 发表于 2016-11-27 15:44:38
一粒盐,发了脾气就是海。
回复 支持 反对

使用道具 举报

Andrewsaf 发表于 2016-11-28 00:58:55
LZ帖子不给力,勉强给回复下吧
回复 支持 反对

使用道具 举报

單曲■D循環 发表于 2016-11-28 04:28:33
愛到了分開⊙加油,看好你哦!
回复 支持 反对

使用道具 举报

丁云涛 发表于 2016-11-28 22:44:51
白领算个屁,养猪才洋气.
回复 支持 反对

使用道具 举报

刘长艳 发表于 2016-11-30 15:00:05
最伤人的话,总出自最温柔的嘴。
回复 支持 反对

使用道具 举报

绾青丝抚木琴 发表于 2016-12-13 12:18:56
丑,但是丑的特别,也就是特别的丑!  
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读


回页顶回复上一篇下一篇回列表
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )

© 2001-2017 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表