Java EE : 三、图解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的一生。代码如下:

?


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



参考

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

时间: 2024-12-28 00:02:36

Java EE : 三、图解Session(会话)的相关文章

Java EE : 一、图解Http协议

目录 Java EE : 一.图解Http协议 Java EE : 二.图解 Cookie(小甜饼) Java EE : 三.图解Session(会话) 概述 一.技术基石及概述 二.深入理解技术基石和工作流程 三.详解工作过程的HTTP报文 四.HTTP协议知识补充 五.关于HTTP协议的Web应用框架或者规范 六.总结 参考 一.技术基石及概述 问:什么是HTTP?答:HTTP是一个客户端和服务器端请求和响应的标准TCP.其实建立在TCP之上的. 当我们打开百度网页时,是这样的: https

Java EE : 二、图解 Cookie(小甜饼)

目录 Java EE : 一.图解Http协议 Java EE : 二.图解 Cookie(小甜饼) Java EE : 三.图解Session(会话) 概述 一.概述 二.详细介绍Cookie 传输过程 三.谈Cookie的作用到XSS(跨站点脚本攻击) 四.总结 参考 一.概述 首先从HTTP说起,Cookie是Http协议中那部分呢? Cookie是什么? 自问自答:Cookie是请求头域和响应头域的字段.简单地说,就是伴随请求和响应的一组键值对的文本,小文本.所以称之为”Cookie“饼

Java Web(三) 会话机制,Cookie和Session详解

一.会话机制 Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择.具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案.同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所

2014-07-09 Java Web的学习(5)-----会话管理(Cookie和Session)

1.什么是会话 会话,牛津词典对其的解释是进行某活动连续的一段时间.从不同的层面看待会话,它有着类似但不全然相同的含义.比如,在web应用的用户看来,他打开浏览器访问一个电子商务网站,登录.并完成购物直到关闭浏览器,这是一个会话.而在web应用的开发者开来,用户登录时我需要创建一个数据结构以存储用户的登录信息,这个结构也叫做会话.因此在谈论会话的时候要注意上下文环境.而本文谈论的是一种基于HTTP协议的用以增强web应用能力的机制或者说一种方案,它不是单指某种特定的动态页面技术,而这种能力就是保

JAVA的三个版本EE,SE,ME

1998年 SUN发布三个不同版本JAVA,分别是: Java J2EE(Java Platform,Enterprise Edition) JAVA企业版,应用为开发和部署可移植.健壮.可伸缩且安全的服务器端Java应用程序. Java J2SE(Java Platform,Standard Edition)Java标准版,应用为开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的Java应用程序. Java J2ME(Java Platform,Micro Edition)Java微型版,

Java EE的13种核心技术

一.内容简介 Java EE的13种核心技术:JDBC.JNDI.EJB.RMI.JSP.Java Servlet.XML.JMS.Java IDL.JTS.JTA.JavaMail和JAF. Java最初在浏览器和客户端机器中粉墨登场,当时很多人质疑它是否适合做服务器端的开发.现在随着对Java EE第三方支持的增多,Java被广泛接纳为开发企业级服务器端解决方案的首选平台之一. Java EE平台由一整套服务(Services).应用程序接口(APIs)和协议构成,它对开发基于Web的多层应

最重要的 Java EE 最佳实践

参考:IBM WebSphere 开发者技术期刊: 最重要的 Java EE 最佳实践 IBM WebSphere 开发者技术期刊: 最重要的 Java EE 最佳实践 2004 年 IBM? WebSphere? 开发者技术期刊中曾发表过一篇名称类似的文章,本文是其更新版本.这个修正版中考虑了一些不断变化的技术趋势,更重要的是推荐了一些作者认为应当广泛遵循.但尚未广泛遵循的实践. 2 评论: Keys Botzum, 高级技术人员 , EMC Kyle Brown, 杰出工程师, EMC Ru

JAVA EE(简述)

一.平台概述 JavaEE的全称是Java Enterprise Edition,它是一个开发分布式企业级应用的规范和标准 Java 平台三个版本: Java ME(Java  Micro  Edition)Java微型版 Java SE(Java Standard Edition)Java 标准版 Java EE(Java Enterprise Edition) Java企业版 二.架构概述 Java EE服务器: Java EE服务器为符合标准的应用程序组件提供部署,管理和运行的支持 根据所

tomcat+http反向代理+memcached session会话保持

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用.)页面的访问请求.实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的. 诀窍是,当配置正确时,A