SpringBoot中实现分布式的Session共享的详细教程

一. SpringBoot中实现Session共享

1. 创建web项目

我们按照之前的经验,创建一个web程序,并将之改造成Spring Boot项目,具体过程略。

2.添加依赖包

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-redis</artifactId>
 </dependency>
 <dependency>
 <groupId>org.springframework.session</groupId>
 <artifactId>spring-session-data-redis</artifactId>
 </dependency>
 <dependency>
 <groupId>org.springframework.session</groupId>
 <artifactId>spring-session-core</artifactId>
 </dependency>

3.创建application.yml文件

server:
 port: 8080
 #配置redis
 spring:
 redis:
 host: 127.0.0.1
 port: 6379
 #password: 123456
 jedis:
 pool:
  max-idle: 8
  min-idle: 0
  max-active: 8
  #max-wait: 60000
 #timeout: 3000 #超时一定要大于0
 session:
 #设置session存储类型
 store-type: redis

这里可以设置多种session的store-type:

我们这里选择利用redis来对session进行集中存储,实现session共享。

4.创建Session配置类

package com.yyg.boot.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/4/28
 * @Description 开启Redis Http Session
 */
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600)
public class RedisHttpSessionConfiguration {

}

在这里添加@EnableRedisHttpSession注解,可以通过maxInactiveIntervalInSeconds属性设置Session的过期时间。

5.创建一个Controller接口方法

该接口方法当用户不存在时提示“用户不存在”,否则会提示“用户存在”。

package com.yyg.boot.web;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/4/28
 * @Description Description
 */
@Slf4j
@RestController
public class SessionController {

 @RequestMapping("/session")
 public Object springSession(@RequestParam("username") String username, HttpServletRequest request, HttpSession session) {
 Cookie[] cookies = request.getCookies();
 if (cookies != null && cookies.length > 0) {
  for (Cookie cookie : cookies) {
  log.warn(cookie.getName() + "=" + cookie.getValue());
  }
 }

 Object value = session.getAttribute("username");
 if (value == null) {
  log.warn("用户不存在");
  //保存session
  session.setAttribute("username", "{username: '" + username + "', age: 30}");
 } else {
  log.warn("用户存在");
 }

 return "username=" + value;
 }

}

6.创建入口类

package com.yyg.boot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/4/28
 * @Description Description
 */
@SpringBootApplication
public class SpringSessionApplication {

 public static void main(String[] args){
 springapplication.run - 这个网站可出售。 - 最佳的springapplication 来源和相关信息。(SpringSessionApplication.class,args);
 }

}

7.完整项目结构

8.启动项目进行测试

第一次在浏览器中进行访问,会看到浏览器中的username=null,并且控制台中展示的log信息为“用户不存在”,说明此时还没有创建出session。但是当第一次访问之后,session就被创建出来了,并且被存储到了redis中,实现了持久化存储。可以看如下图:

第二次访问,就会看到username已经可以获取到新的信息了。

log控制台中也看到已经提示“用户存在”的信息了。

并且我们可以看到Redis控制台中,提示了TTL过期时间是3660,每隔1秒钟刷新1次,3600秒后过期。

此时我们可以分别启动一个8080和8081进程,在两个进程上分别测试session接口。

#进入到项目的target目录下,执行java -jar命令,部署我们的jar包

F:\onlineWorks\boot-demos\demo43_springsession\target>java -jar demo43_springsession-1.0-SNAPSHOT.jar --server.port=8080

F:\onlineWorks\boot-demos\demo43_springsession\target>java -jar demo43_springsession-1.0-SNAPSHOT.jar --server.port=8081

在浏览器中,我们的8080和8081端口上访问时,可以看到有一个共同的Session信息:

可以看到在两个不同的进程端口上,都分别访问到了同一个session信息,说明我们实现了分布式进程中session共享。可见在有了Spring Session后,实现session共享还是很简单得到。

总结

到此这篇关于SpringBoot中实现分布式的Session共享的详细教程的文章就介绍到这了,更多相关SpringBoot分布式Session共享内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot开发案例 分布式集群共享Session详解

    前言 在分布式系统中,为了提升系统性能,通常会对单体项目进行拆分,分解成多个基于功能的微服务,如果有条件,可能还会对单个微服务进行水平扩展,保证服务高可用. 那么问题来了,如果使用传统管理 Session 的方式,我们会遇到什么样的问题? 案例 这里拿下单举例,用户小明在天猫上相中了一个的娃娃,觉得不错,果断购买,选尺寸,挑身高,然后确认选择,赶紧提交订单,然后就跳转到了登录页面!小明表示很郁闷,大写的问号??? 小明进入娃娃页面,此时请求通过代理服务发送到业务系统一. 小明选尺寸,挑身高,此操

  • 基于SpringBoot+Redis的Session共享与单点登录详解

    前言 使用Redis来实现Session共享,其实网上已经有很多例子了,这是确保在集群部署中最典型的redis使用场景.在SpringBoot项目中,其实可以一行运行代码都不用写,只需要简单添加添加依赖和一行注解就可以实现(当然配置信息还是需要的). 然后简单地把该项目部署到不同的tomcat下,比如不同的端口(A.B),但项目访问路径是相同的.此时在A中使用set方法,然后在B中使用get方法,就可以发现B中可以获取A中设置的内容. 但如果就把这样的一个项目在多个tomcat中的部署说实现了单

  • 详解springboot中redis的使用和分布式session共享问题

    对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载均衡算法,由于Nginx对不同的请求分发到某一个Tomcat,Tomcat在运行的时候分别是不同的容器里,因此会出现session不同步或者丢失的问题. 实际上实现Session共享的方案很多,其中一种常用的就是使用Tomcat.Jetty等服务器提供的Session共享功能,将Session的内容统一存储在一个数据库(如MySQL)或缓存(如Redis)中. 本文旨在

  • Springboot实现多服务器session共享

    本文实例为大家分享了springboot实现多服务器session共享的具体代码,供大家参考,具体内容如下 环境: springboot:2.0.4 redis:3.2.100 jdk:1.8 eclipse:4.9.0 1.原理 正常情况下,HTTPSession是通过servlet容器创建并管理的,创建成功后都保存在内存中,如果开发者需要对项目进行横向拓展搭建集群,那么可以用一些硬件和软件工具来做负载均衡,此时,来自同一用户的HTTP请求有可能会被发送到不同的实例上去,如何保证各个实例之间的

  • SpringBoot2.x 整合Spring-Session实现Session共享功能

    1.前言 发展至今,已经很少还存在单服务的应用架构,不说都使用分布式架构部署, 至少也是多点高可用服务.在多个服务器的情况下,Seession共享就是必须面对的问题了. 解决Session共享问题,大多数人的思路都是比较清晰的, 将需要共享的数据存在某个公共的服务中,如缓存.很多人都采用的Redis,手动将Session存在Redis,需要使用时,再从Redsi中读取数据.毫无疑问,这种方案是可行的,只是在手动操作的工作量确实不少. LZ在这里采用的Spring-Session来实现.它使用代理

  • SpringBoot中实现分布式的Session共享的详细教程

    一. SpringBoot中实现Session共享 1. 创建web项目 我们按照之前的经验,创建一个web程序,并将之改造成Spring Boot项目,具体过程略. 2.添加依赖包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>

  • 搭建 springboot selenium 网页文件转图片环境的详细教程

    1. 环境准备 需要有 chrome 浏览器 + chrome driver + selenium 客户端 离线 chrome 下载地址 # 64位 linux 系统 https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm # 64位 weindow 系统 http://www.google.cn/chrome/browser/desktop/index.html?standalone=1&platfo

  • IDEA中切换不同版本的JDK的详细教程(超管用)

    背景: 领导给我了个eclipse开发的代码,我导入到了IDEA中,一直拿JDK1.8进行的开发,完事之后发现服务器环境是JDK1.7,那就再IDE中直接换JDK重新编译呗,没想到一路坎坷. ** 请看到最后 ** 网上的一般方法: 步骤一: 选择SDK,导入相应的JDK所在文件夹. 步骤二: 选择模块默认使用的jdk语言标准 步骤三: 导入jdk对应版本的原生依赖 步骤四: 设置好SDK的默认值 如果还是不行,又出现了步骤五: 反正我是都搞了,而且还把jdk1.8给卸载了,然并卵,还是提示我无

  • springboot集成mybatis-maven插件自动生成pojo的详细教程

    1.生成springboot项目,选择mybatis.mysql(略过) 2.搭建mysql环境,打开服务,记录用户名及密码,新建业务表. 3.在resources文件夹下新建如图所示文件夹: 4.包路径配置(记住自己存放的路径,后面用): 5.在generator中新建文件generatorConfig.properties(统一存放需要的变量).generatorMapper.xml 6.generatorConfig.properties内容如下,(mysql的jdbc.url一定要加时区

  • Python中使用Beautiful Soup库的超详细教程

    1. Beautiful Soup的简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能.它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序. Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码.你不需要考虑编码方式,除非文档没有指

  • SpringBoot项目集成Flyway进行数据库版本控制的详细教程

    Flyway是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式. 第一步:pom.xml添加maven依赖 <!-- https://mvnrepository.com/artifact/org.flywaydb/flyway-core --> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <versi

  • vue中实现拖拽排序功能的详细教程

    目录 原生拖拽 API 实现拖拽 设置元素 dragable 拖放事件 拖拽排序 拖拽API + 防抖实现 vue awe-dnd 拖拽组件 安装 awe-dnd 组件库 在 main.js 中将 awe 挂载到全局 实现案例 项目中-- 拖拽的效果 不理想 vue-smooth-DnD 安装 smooth-dnd API: container smooth-dnd 生命周期 回调 事件 API: Draggable 效果实现 项目中实现 – 拖拽位置无法确定 vuedraggable 安装 引

  • SpringBoot 如何实现Session共享

    HttpSession,是通过Servlet容器创建并进行管理的,创建成功以后将会保存在内存中,这里将会使用Redis解决session共享的问题. 创建项目 添加pom 添加相关的maven <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3

  • SpringBoot中Shiro缓存使用Redis、Ehcache的方法

    SpringBoot 中配置redis作为session 缓存器. 让shiro引用 本文是建立在你是使用这shiro基础之上的补充内容 第一种:Redis缓存,将数据存储到redis 并且开启session存入redis中. 引入pom <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifac

随机推荐