Session的作用,分布式环境下Session怎么实现?

我是程序汪

共 5895字,需浏览 12分钟

 ·

2024-06-15 17:02

很基础,老手可以跳过
程序汪发现有些新人对Session的作用很懵逼,原因也很简单,大部分项目Session的实现都已经搞好了,新人只需要用就可以,这样Session的作用部分新人就无法感知他的重要性,特别需要对Session进行二次功能开发时候就没任何思路,下面简单的补下相关知识

Java中的Session主要用于实现Web应用程序中的会话跟踪技术,它的主要作用和原理如下:

作用:

  1. 用户状态维护:Session允许服务器存储特定于每个用户的会话数据,如登录状态、购物车信息、用户偏好等,从而在用户与Web应用的多个交互过程中维持状态。
  2. 跨页面数据共享:在用户浏览不同页面时,Session能确保数据的一致性和连续性,使得用户在网站上的行为和数据得以保留。
  3. 安全性增强:与Cookie相比,由于Session数据存储在服务器端,这减少了数据泄露的风险,提高了安全性。

作用还没感知的朋友,可以自己登陆一些系统,比如火车12306 、本市的12345平台 等等,一般登陆后多个页面切换都是会把当前登陆信息带着的,有的超过30分钟没操作 就超时了 需要重新登陆,这背后就有Session的作用。

原理:

  1. 创建与关联:当用户首次访问Web应用时,服务器会为其创建一个唯一的Session对象,并分配一个Session ID(通常是一个随机生成的字符串)。这个Session ID是会话的唯一标识符。

  2. Session ID传递:服务器通过响应头(通常是Set-Cookie header)将Session ID发送给客户端浏览器。客户端浏览器(在后续请求中)会自动将此Session ID附加在每个HTTP请求的Cookie中或URL参数里(如果使用URL重写机制)发送回服务器。

  3. 识别与数据访问:服务器接收到带有Session ID的请求后,会使用这个ID在内存或其他存储媒介中查找对应的Session对象。一旦找到,服务器就可以根据该Session中的数据为用户提供个性化服务。

  4. 生命周期管理:Session有生命周期管理机制,可以通过配置设置其过期时间。当Session过期或被显式地调用session.invalidate()方法时,服务器会销毁该Session及其关联的数据。

  5. 数据存储:Session数据可以存储在服务器的内存中,也可以通过分布式缓存(如Redis)、数据库等方式持久化存储,以便于集群环境中各个服务器节点能够共享Session数据。

综上所述,Java中的Session机制通过服务器端维护会话状态,实现了用户交互的连贯性和安全性,是Web应用开发中不可或缺的一部分。

程序汪发现特别面试的时候有的面试官也会问 分布式的Session方案,至少要说清楚一个方案吧。

在分布式环境下,处理Session有多种方案,下面我将分别用Java代码片段简要说明三种常见的解决方案:使用Redis作为分布式缓存、使用Spring Session以及基于Token的认证方式。

1. 使用Redis作为分布式缓存存储Session (最常见的方案)

程序汪公司也都使用这套方案,面试聊这个方案也就可以了,登陆鉴权后将用户的信息对象 一般JSON格式存入Redis中

首先,确保你的项目已经集成Jedis(Redis Java客户端)或者使用Spring Data Redis。

import redis.clients.jedis.Jedis;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class RedisSessionListener implements HttpSessionListener {

    private Jedis jedis = new Jedis("localhost"); // 连接到本地Redis服务器

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        String sessionId = se.getSession().getId();
        jedis.set(sessionId, serialize(se.getSession())); // 序列化Session并存储到Redis
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        String sessionId = se.getSession().getId();
        jedis.del(sessionId); // 从Redis中删除Session
    }

    // 假设有一个序列化和反序列化Session的方法
    private byte[] serialize(HttpSession session) {
        // 实现序列化逻辑
    }
    
    // 反序列化方法同样需要实现
}

2. 使用Spring Session

Spring Session提供了与应用服务器无关的Session管理,可以很容易地与Redis、JDBC等多种存储集成。

首先,需要在Spring配置中启用Spring Session和配置Redis连接。

<!-- Spring配置文件或Spring Boot的application.properties -->
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>

或在Spring Boot中使用:

spring:
  session:
    store-type: redis

然后,无需编写特定的监听器或存储逻辑,Spring Session会自动处理Session的存储和检索。

3. 基于Token的认证方式

这种方式不直接使用传统的HTTP Session,而是使用JWT(JSON Web Token)或其他形式的Token进行认证。

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

public class TokenService {

    private static final String SECRET_KEY = "yourSecretKey";

    public String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
                .compact();
    }

    public boolean validateToken(String token) {
        try {
            Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public String getUsernameFromToken(String token) {
        return Jwts.parser().setSigningKey(SECRET_KEY)
                .parseClaimsJws(token).getBody().getSubject();
    }
}

在实际应用中,上述代码需要根据具体的应用框架(如Spring MVC、Spring Boot)和环境进行适当的调整和配置。例如,对于基于Token的认证,你需要在用户登录成功后生成Token,并在后续请求中通过HTTP Header(如Authorization)传递Token,然后在服务端进行解析和验证。


程序汪接私活项目目录,2023年总结

Java项目分享  最新整理全集,找项目不累啦 07版

程序汪10万接的无线共享充电宝项目,开发周期3个月

程序汪1万接的企业官网项目,开发周期15天

程序汪8万接的共享口罩项目,开发周期1个月

程序汪8万块的饮水机物联网私活项目经验分享

程序汪接的4万智慧餐饮项目

程序汪接的酒店在线开房项目,另外一个好听的名字叫智慧酒店


欢迎添加程序汪个人微信 itwang008  进粉丝群或围观朋友圈

浏览 162
1点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
1点赞
评论
收藏
分享

手机扫一扫分享

分享
举报