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

很基础,老手可以跳过
程序汪发现有些新人对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  进粉丝群或围观朋友圈

相关推荐

  • 李飞飞六月对话马克·安德森 | 万字全文 · HAI研究所5周年会议现场 (附视频)
  • 又火一个惊艳的开源项目,诞生了!
  • 泪目!博士论文致谢走红:感谢博一与我结婚的妻子
  • 217亿,字节打响拆分IPO的第一枪
  • Java ORM 双雄:Mybatis 和 Hibernate,你选哪个?
  • 又一个新项目完结,炸裂!
  • 奥特曼和老黄打起来了!Luma干的。。。
  • AlphaFold的伟大,只因做对了这5件事!DeepMind副总裁:团队注定会取得突破
  • 陶哲轩最新采访:AI将颠覆数学界!用Lean规模化,成百上千条定理一次秒杀
  • 英伟达开源3400亿巨兽,98%合成数据训出最强开源通用模型!性能对标GPT-4o
  • 北航等提出超大规模多语言代码评测基准,涵盖40种编程语言
  • ACL 2024 | 多模态大模型能揭示图像背后的深意吗?
  • 惊呆!大模型工程师月薪快10w了!
  • 【第17讲】6月19日,AI智能体实战-第二期
  • 京东员工:年薪百万,到手很“虚”。一年存款只有4万块,日子很“穷”
  • 领域大模型的挑战与机遇:从构建到应用
  • Stanford发布501页全球AI指数报告:中美两国引领世界,但有一项中国不如印度(附报告全文)
  • 突发!Sam Altman与OpenAI股东正式提出公司转型,成为营利性公司!!
  • SIGGRAPH2024|上科大、影眸联合提出DressCode:从文本生成3D服装板片
  • 有望解决一个千禧年大奖难题,这个20多年前的猜想终于得到证明