在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

JavaEE 要懂的小事:三、图解Session(会话)

2017-2-9 13:06| 发布者: zhangjf| 查看: 669| 评论: 0

摘要: Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter :BYSocket 相继 图解Http协议 和 图解Cookie 之后,中间迷茫期哈,没写了!可是 ...

Writer :BYSocket(泥沙砖瓦浆木匠)

微 博:BYSocket

豆 瓣:BYSocket

FaceBook:BYSocket

Twitter :BYSocket

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


一、Session由来

HTTP的无状态,也就是说,每次请求都是独立的线程。举个例子吧:购物中,你选择了A商品,加入购物车,这就是A线程。然后在选择B商品就是B线程。可是每次线程独立(对容器而言,A、B成了不同的用户),线程A不知道有B,B也不知道A。如何一起付款呢?

简答来说:怎么保存同个用户多个请求会话状态呢?自然HTTPS保证连接是安全的,可以使它与一个会话关联。

问题就在于如何跟踪同一个用户,选择自然很多:

如图:JavaEE 要懂的小事:三、图解Session(会话)

二、Session机制

机制,什么用词有点高大上。其实就是把它内在的一点东西说出来。主要两个W:What?How?

What is Session?

Session代表着服务器客户端一次会话的过程。直到session失效(服务端关闭),或者客户端关闭时结束。

How does session works?

Session 是存储服务端的,并针对每个客户端(客户),通过SessionID来区别不同用户的。Session是以Cookie技术或URL重写实现。默认以Cookie技术实现,服务端会给这次会话创造一个JSESSIONID的Cookie值。

补充

三、详细介绍Seesion机制过程

JavaEE 要懂的小事:三、图解Session(会话)

图中这是session第一次请求的详细图。以Cookie技术实现,我也写了个HttpSessionByCookieServletT.java 的Servlet小demo,模拟下Seesion的一生。代码如下:


  1. packageorg.servlet.sessionMngmt;
  2. importjava.io.IOException;
  3. importjava.io.PrintWriter;
  4. importjavax.servlet.ServletException;
  5. importjavax.servlet.annotation.WebServlet;
  6. importjavax.servlet.http.HttpServlet;
  7. importjavax.servlet.http.HttpServletRequest;
  8. importjavax.servlet.http.HttpServletResponse;
  9. importjavax.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. * @since 2015-7-12 10:58:28
  28. * HttpSession的默认Cookie实现案例
  29. */
  30. @WebServlet(urlPatterns = "/sessionByCookie")
  31. publicclassHttpSessionByCookieServletT extendsHttpServlet {
  32. privatestaticfinallongserialVersionUID = 1L;
  33. @Override
  34. protectedvoiddoGet(HttpServletRequest req, HttpServletResponse resp)
  35. throwsServletException, IOException {
  36. // 获取session
  37. // 如果是第一次请求的话,会创建一个HttpSeesion,等同于 req.getSession(true);
  38. // 如果已存在session,则会获取session。
  39. HttpSession session = req.getSession();
  40. if(session.isNew()) {
  41. // 设置session属性值
  42. session.setAttribute("name", "Jeff");
  43. }
  44. // 获取SessionId
  45. String sessionId = session.getId();
  46. PrintWriter out = resp.getWriter();
  47. // 如果HttpSeesion是新建的话
  48. if(session.isNew()) {
  49. out.println("Hello,HttpSession! <br>The first response - SeesionId="
  50. + sessionId + " <br>");
  51. } else{
  52. out.println("Hello,HttpSession! <br>The second response - SeesionId="
  53. + sessionId + " <br>");
  54. // 从Session获取属性值
  55. out.println("The second-response - name: "
  56. + session.getAttribute("name"));
  57. }
  58. }
  59. }
复制代码




① 客户端向服务端发送第一次请求

此时,客户端想让服务端把自己的名字设置到会话中。

② 服务端的容器产生该用户唯一sessionID的session对象,并设置值

可以从代码中看出通过从请求中req.getSession(),新生成了一个session对象。并设置了setAttribute(“name”, “Jeff”),key为string,value是对象皆可。

这时候,我们不用再把session通过cookie技术处理,容器帮我们处理了。

③ 容器响应 Set-Cookie:JSESSIONID= …

我们可以F12,查看此次响应。

JavaEE 要懂的小事:三、图解Session(会话)

从图中可得到,每个Cookie的set,都有一个对应Set-Cookie的头。HttpOnly可是此Cookie只读模式。只不过session唯一标识是:JSESSIONID

④ 浏览器解析Cookie,保存至浏览器文件。

JavaEE 要懂的小事:三、图解Session(会话)

如图,找到了对应的session存储的cookie文件。该文件被保护不能打开。图解Cookie 教你怎么找到该文件。


第二次请求会发什么变化呢?

JavaEE 要懂的小事:三、图解Session(会话)

下面,泥瓦匠重新访问了这个地址:

① 再次请求

JavaEE 要懂的小事:三、图解Session(会话)

此时,请求会有Cookie值:JSESSIONID=… 该值传给服务端

② 容器获取SessionId
,关联HttpSession

③ 此时响应无SetCookie

如图:

JavaEE 要懂的小事:三、图解Session(会话)

但是这次请求,我们响应出上一次请求set的值。Jeff 就打印出来了!


关于服务端获取session,也就是从请求中获取session对象,容器会帮你根据Cookie找到唯一的session对象。

泥瓦匠记忆小抄:Seesion机制,记住两次请求图即可。

四、补充

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

JavaEE 要懂的小事:三、图解Session(会话)

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


五、总结

Writer :BYSocket(泥沙砖瓦浆木匠)

微 博:BYSocket

豆 瓣:BYSocket

FaceBook:BYSocket

Twitter :BYSocket

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-10 03:15

Copyright 2015-2025 djqfx

返回顶部