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

一、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

 *

 *   http://www.apache.org/licenses/LICENSE-2.0

 *

 * 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是什么,怎么用,在服务端客户端之间怎么传输即可。

时间: 2024-10-31 20:10:58

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

JavaEE 要懂的小事:一、图解Http协议

一.技术基石及概述 问:什么是HTTP? 答:HTTP是一个客户端和服务器端请求和响应的标准TCP.其实建立在TCP之上的. 当我们打开百度网页时,是这样的: https://www.baidu.com 多了个S,其实S表示TLS.SSL.在这里不做解释,因此HTTP的技术基石如图所示: 那HTTP协议呢?HTTP协议(HyperText Transfer Protocol),即超文本传输协议是用于服务器传输到客户端浏览器的传输协议.Web上,服务器和客户端利用HTTP协议进行通信会话.有OOP

JavaEE 要懂的小事:二、图解 Cookie(小甜饼)

这就是因为浏览器Cookie太大,导致请求时,请求头域过大造成发送失败.下面咱们就了解了解Cookie.按着以前的思路图文并茂哈,没图说个XX.   一.概述 首先从HTTP说起,Cookie是Http协议中那部分呢? Cookie是什么? 自问自答:Cookie是请求头域和响应头域的字段.简单地说,就是伴随请求和响应的一组键值对的文本,小文本.所以称之为"Cookie"饼干.Cookie的生命来源于服务器.首先是客户端请求服务端,此时请求为第一次,无Cookie参数.这时候,服务端s

急!为何WebSphere清除同一IP地址web应有的session会话

问题描述 各位高手,小弟请教一个棘手的问题:在同一台AIX机器上的同一个WebSphere里的不同Appserver下分别部署两个应用系统A和B.在A系统内同过eai服务访问B系统后,再返回A系统,系统的session会话会被清除,系统超时!而把两个系统分别部署到不同的机器,系统之间的访问正常,没有出现以上问题!由于客户的原因,生产环境下又不能增加机器!这个问题是否是WebSphere清除同一IP地址的session会话造成的?请教高手,这个问题如何解决?小弟万分感激! 解决方案 解决方案二:你

php会话控制cookie与Session会话处理

会话简介:HTTP(超文本传输协议)定义了通过万维网(WWW)传输文本.图形.视频和所有 其他数据所有的规则.HTTP 是一种无状态的协议,说明每次请求的处理都与之前或之后的 请求无关.虽然这种简化实现对于HTTP 的普及做出了卓越的贡献,但对于希望创建复杂的 Web 应用程序的开发人员来说,这点有点困扰.为了解决这个问题,出现了一种在客户端 机器上存储少量信息(cookie). 由于cookie 大小限制.数量及其他原因,开发人员又提出了一种解决方案:session 会 话处理. 一.Cook

zf框架的session会话周期及次数限制使用示例

 这篇文章主要介绍了zf框架的session会话周期及次数限制使用示例,需要的朋友可以参考下 代码如下: <?php require_once("Zend/Loader.php"); Zend_Loader::loadClass("Zend_Session_Namespace"); $Session = new Zend_Session_Namespace('Db'); $Session ->host     = '127.0.0.1'; $Sessio

JavaWeb Session 会话管理实例详解_java

Session会话简介 会话是指在一段时间内,用户使用同一个浏览器进程与Web应用之间的交互过程. 会话(Session)通常用来跟踪用户的状态,缓存用户在此浏览器进程中的信息. 当用户关闭浏览器,上一个Session也就无法再次获得了(Cookie的maxAge为-1的情况).再次打开新的浏览器,将开始一个新的会话. 类javax.servlet.http.HttpSession.每一个HttpSession代表用户的一个会话. 每一个Session的过期时间默认为30分钟. 当浏览器第一次访

cookie 自动登录 读取-httpClient 3如何session会话保持?

问题描述 httpClient 3如何session会话保持? 问题场景: 通过httpClient请求同一门户的接口地址,因为登录后和未登录的时候返回的数据不一样.所以当用户在门户上登录的情况下,访问接口返回的数据也应该是要登录口的数据.现在返回的都是未登录的情况.'请问大神们此问题如何解决. 代码如下: String url = "http://192.168.41.56/portal/480/home/wap/xqy/ljjk/dbjqbf/index.jsp"; String

浏览器禁用cookie后php如何保持session会话-use_trans_sid机制

原文:浏览器禁用cookie后php如何保持session会话-use_trans_sid机制 为防止浏览器禁用cookie导致服务器会话无法保持,php开发了一个机制,该机制开启后,浏览器发起请求后,服务器会创建session文件,并对返回给浏览器的页面中所有的url进行处理,若url为相对路径(不带http://ip地址)则认为此url是链接至本服务器,因此在url后补上sessionid.当用户点击带有此url的链接标签时会携带sessionid到服务器,因此实现了会话保持. 我的php版

PHP session 会话处理函数_php实例

PHP Session 变量 当运行一个应用程序时,你会打开它,做些更改,然后关闭它.这很像一次会话.计算机清楚你是谁.它知道你何时启动应用程序,并在何时终止.但是在因特网上,存在一个问题:服务器不知道你是谁以及你做什么,这是由于 HTTP 地址不能维持状态. 通过在服务器上存储用户信息以便随后使用,PHP session 解决了这个问题(比如用户名称.购买商品等).不过,会话信息是临时的,在用户离开网站后将被删除.如果需要永久储存信息,可以把数据存储在数据库中. Session 的工作机制是: