Java Session会话追踪原理深入分析

 更新时间:2022年11月05日 10:34:43   作者:OlaiolaiO  
web开发阶段我们主要是浏览器和服务器之间来进行交互。浏览器和服务器之间的交互就像人和人之间进行交流一样,但是对于机器来说,在一次请求之间只是会携带着本次请求的数据的,但是可能多次请求之间是会有联系的,所以提供了会话机制

一、会话技术

客户端和服务器通信的过程中,自然而然的会产生一些数据交互。比如,A用户登录了邮箱,那么web服务器该怎么知道C一段时间后的登录状态呢?虽然HttpServletRequest对象和ServletContext对象都可以保存数据,但是不适用于这种情况。

  • 客户端的每次请求,服务器都会产生一个HttpServletRequest对象,该对象只保存请求所传递的数据。
  • 用一个WEB应用共享一个ServletContext对象,所以当多个用户登录时就有可能会造成数据混淆。

当浏览器向ServletB发出请求时,它的登陆操作已经完成了,但是却没有留下任何依据能够证明它已经成功登陆。以至于ServletB对他的登陆状态无法判别,这种情况叫用户状态的丢失。造成这种结果的原因是http协议的无状态;

为了解决这个问题,Servlet提供了会话跟踪技术来追踪用户状态,简单的说就是指将用户操作过的重要业务步骤记录下来,以便在后续的处理中使用。

二、Session

1.原理

客户端浏览器第一次访问,服务器端创建一个会话对象。并且具有id的唯一值。依赖cookie将sessionId的值发送给客户端。第二次请求的时候,客户端浏览器携带sessionId到服务器。服务器端获得sessionId,从而实现了会话跟踪。

2.特点

创建在服务器端,并且保存在服务器端 。

3.获得一个会话对象

import java.io.IOException;
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;
@WebServlet("/testsession.do")
public class testSessionServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("testSessionServlet被请求到了");
		HttpSession session = req.getSession();
        //当调用getSession(true)时,他首先检查用户的会话Cookie是否存在
        //如果不存在:为其创建新的session对象,将session对象的ID保存到新建的会话Cookie中,并            将会话cookie送回浏览器 。
        //如果存在:则按照会话Cookie 的值找到对应的session对象返回。
        System.out.println(session.getId());
	}
}

4.Session常见方法

// 获取Session
HttpSession session = request.getSession();
// 将指定Key-Value键值对,存入当前Session会话中。
void setAttribute(String name, Object value);
// 按照指定的Key从当前Session会话中获取Value,返回值为Object类型的对象,如果不存在,则返回null。
Object getAttribute(String name);
// 按照指定的Key从当前Session会话中删除Key-Value键值对。
void removeAttribute(String name);
// 获取当前Session会话的创建时间。
long time = session.getCreationTime();
// 获取当前Session会话最后一次请求的访问时间。
long lastAccessedTime = session.getLastAccessedTime();
// 获取当前Session会话的SESSION ID
String id = session.getId();
//设置最大有效时间,以秒为单位
session.setMaxInactiveInterval(100);
// session失效
session.invalidate();

三、Cookie和Session的区别

  1. 保存的位置不同:cookie保存在浏览器端,session保存在服务端。
  2. 使用方式不同:cookie如果在浏览器端对cookie进行设置对应的时间,则cookie保存在本地硬盘中,此时如果没有过期,则就可以使用,如果过期则就删除。如果没有对cookie设置时间,则默认关闭浏览器,则cookie就会删除。session:我们在请求中,如果发送的请求中存在sessionId,则就会找到对应的session对象,如果不存在sessionId,则在服务器端就会创建一个session对象,并且将sessionId返回给浏览器,可以将其放到cookie中,进行传输,如果浏览器不支持cookie,则应该将其通过encodeURL(sessionID)进行调用,然后放到url中。
  3. 存储内容不同:cookie只能存储字符串,而session存储结构类似于hashtable的结构,可以存放任何类型。
  4. 存储大小:cookie最多可以存放4k大小的内容,session则没有限制。
  5. session的安全性要高于cooKie
  6. cookie的session的应用场景:cookie可以用来保存用户的登陆信息,如果删除cookie则下一次用户仍需要重新登录;session就类似于我们拿到钥匙去开锁,拿到的就是我们个人的信息,一般我们可以在session中存放个人的信息或者购物车的信息。
  7. session和cookie的弊端:cookie的大小受限制,cookie不安全,如果用户禁用cookie则无法使用cookie。如果过多的依赖session,当很多用户同时登陆的时候,此时服务器压力过大。sessionId存放在cookie中,此时如果对于一些浏览器不支持cookie,此时还需要改写代码,将sessionID放到url中,也是不安全。

到此这篇关于Java Session会话追踪原理深入分析的文章就介绍到这了,更多相关Java Session会话追踪内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Java 对象序列化和反序列化

    详解Java 对象序列化和反序列化

    本篇文章主要介绍了Java 对象序列化和反序列化,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • nacos中的配置使用@Value注解获取不到值的原因及解决方案

    nacos中的配置使用@Value注解获取不到值的原因及解决方案

    这篇文章主要介绍了nacos中的配置使用@Value注解获取不到值的原因分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Java获取当前时间年月日的方法

    Java获取当前时间年月日的方法

    这篇文章主要为大家详细介绍了Java获取当前时间年月日的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • Java工厂模式定义与用法实例分析

    Java工厂模式定义与用法实例分析

    这篇文章主要介绍了Java工厂模式定义与用法,结合具体实例形式分析了java工厂模式定义、使用相关操作技巧,并总结了类图原理,需要的朋友可以参考下
    2019-07-07
  • SpringBoot自定义MessageConvert详细讲解

    SpringBoot自定义MessageConvert详细讲解

    正在学习SpringBoot,在自定义MessageConverter时发现:为同一个返回值类型配置多个MessageConverter时,可能会发生响应数据格式错误,或406异常(客户端无法接收相应数据)。在此记录一下解决问题以及追踪源码的过程
    2023-01-01
  • Spring Cloud构建Eureka应用的方法

    Spring Cloud构建Eureka应用的方法

    这篇文章主要介绍了Spring Cloud构建Eureka应用的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Java使用Deque实现堆栈的方法

    Java使用Deque实现堆栈的方法

    这篇文章主要介绍了Java使用Deque实现堆栈的方法,实例分析了java简单实现堆栈的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Java TCP协议通信超详细讲解

    Java TCP协议通信超详细讲解

    TCP/IP是一种面向连接的、可靠的、基于字节流的传输层通信协议,它会保证数据不丢包、不乱序。TCP全名是Transmission Control Protocol,它是位于网络OSI模型中的第四层
    2022-09-09
  • Java如何实现内存缓存

    Java如何实现内存缓存

    内存缓存(Memory caching)是一种常见的缓存技术,它利用计算机的内存存储临时数据,以提高数据的读取和访问速度,本文就来和大家聊聊Java如何实现内存缓存吧
    2023-08-08
  • 在Spring Boot中集成RabbitMQ详细步骤(最新推荐)

    在Spring Boot中集成RabbitMQ详细步骤(最新推荐)

    本文将介绍如何在Spring Boot项目中集成RabbitMQ,实现生产者和消费者的基本配置,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-12-12

最新评论