热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

分布式会话解决方案之SpringSession及session的redis缓存序列化和修改cookie域名

分布式环境下的session共享问题分布式环境下的session共享解决方案方案一:session同步(复制)优点tomcat原生支持,只需要修改配置文件缺点session同步需要

  1. 分布式环境下的session共享问题
    在这里插入图片描述
  2. 分布式环境下的session共享解决方案

  • 方案一: session同步(复制)

    • 优点
      tomcat原生支持,只需要修改配置文件
    • 缺点
      session同步需要数据传输,占用大量带宽
      任意一台服务器保存的session数据都是所有服务器的session数据总和,占用内存较大
  • 方案二: 将session数据存储在客户端

    • 优点
      将数据存储在客户端,在需要的时候直接从客户端获取,也就没有了分布式session的问题
      节省服务器端资源
    • 缺点
      数据存放在客户端的COOKIE中,存在泄漏、篡改、窃取等安全隐患
      COOKIE保存的数据限制4K,不能保存大量信息
      每次http请求都要携带COOKIE信息,浪费网络带宽
  • 方案三: hash一致性(可用)

    • 优点
      如果服务器数量不变,每次hash都会映射到相同的服务器
      只需要修改nginx配置,不需要修改应用代码
      负载均衡,只要hash属性的值分布是均匀的,多台web-server的负载是均衡的
      可以支持web-server水平扩展
    • 缺点
      当web-server重启时可能会导致部分session丢失,影响业务,部分用户需要重新登录(其实该缺点问题不大,session也是有生存周期的,再获取一次即可)
      如果web-server水平扩展,rehash后session重新分布,也会有一部分用户路由不到正确的session
    • 改进版: 一致性hash算法/带虚拟节点的一致性hash算法
  • 方案四: 统一存储
    在这里插入图片描述


  1. 统一存储之使用SpringSession实现

  • pom.xml导入依赖

    <dependency><groupId>org.springframework.sessiongroupId><artifactId>spring-session-data-redisartifactId>
    dependency>

  • application.yml配置

    spring:redis:host: 192.168.145.8port: 6379
    # 使用redis存储session解决分布式共享问题session:store-type: redisserver:
    # session过期时间为30分钟servlet:session:timeout: 30m

  • 主启动类配置&#64;EnableRedisHttpSession注解

    package com.kenai.gulimall.auth;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;&#64;EnableRedisHttpSession // 整合redis作为session存储
    &#64;EnableFeignClients
    &#64;EnableDiscoveryClient
    &#64;SpringBootApplication
    public class GulimallAuthServerApplication {public static void main(String[] args) {SpringApplication.run(GulimallAuthServerApplication.class, args);}
    }

  • session存入redis代码编写

    &#64;Controller
    public class test {// session存入redis&#64;ResponseBody&#64;GetMapping("/test")public String test(HttpSession session){session.setAttribute("test_session", "data");return "ok";}// 从redis中获取session&#64;ResponseBody&#64;GetMapping("/getRedisSession")public String testGet(HttpSession session){String data &#61; (String) session.getAttribute("test_session");return data;}
    }

  • 修改域名及session的redis缓存序列化

    package com.kenai.gulimall.auth.config;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
    import org.springframework.data.redis.serializer.RedisSerializer;
    import org.springframework.session.web.http.COOKIESerializer;
    import org.springframework.session.web.http.DefaultCOOKIESerializer;&#64;Configuration
    public class GulimallSessionConfig {// 改变域名等信息。子域名向redis缓存中存放session信息&#xff0c;为了让整个域名都可用&#xff0c;通过修改域名为根域名实现// gulimall.com域名及子域名的COOKIE中有一个名叫GULIMALLSESSION的COOKIE// GULIMALLSESSION当中存放sessionid信息,当向redis请求的时候会带上COOKIE信息,所以便能根据COOKIE中存放的sessionId找到redis中存放的session信息// session信息中有我们存入的属性信息,比如用户id:用户信息.&#64;Beanpublic COOKIESerializer COOKIESerializer(){DefaultCOOKIESerializer COOKIESerializer &#61; new DefaultCOOKIESerializer();COOKIESerializer.setDomainName("gulimall.com");COOKIESerializer.setCOOKIEName("GULIMALLSESSION");return COOKIESerializer;}// session存入redis缓存的json序列化&#64;Beanpublic RedisSerializer<Object> springSessionDefaultRedisSerializer(){return new GenericJackson2JsonRedisSerializer();}
    }


推荐阅读
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • PHP输出缓冲控制Output Control系列函数详解【PHP】
    后端开发|php教程PHP,输出缓冲,Output,Control后端开发-php教程概述全景网页源码,vscode如何打开c,ubuntu强制解锁,sts启动tomcat慢,sq ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • Nginx Buffer 机制引发的下载故障
    Nginx ... [详细]
  • 14亿人的大项目,腾讯云数据库拿下!
    全国人 ... [详细]
author-avatar
亲爱one
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有