Spring session实现共享单点登录案例过程解析

  一、项目构建

  1、案例说明

  本文主要演示单点登录功能,会贴出主要配置和代码以及必要解释,全部代码请参考git地址。session共享一个基本原则是将session存储在某个地方,所有的应用都可以访问,这里使用redis存储session。当应用需要认证时,先从redis读取用户信息。

  2、基本配置

  1)pom.xml

<dependency>
  <groupId>org.springframework.session</groupId>
  <artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.session</groupId>
  <artifactId>spring-session</artifactId>
  <version>1.3.1.RELEASE</version>
</dependency>

  2)application.properties

server.port=8080
spring.session.store-type = redis
spring.redis.host=192.168.7.151
spring.redis.port=6379

  本案例的两个应用完全一样,一个端口是8080,一个端口是80

  3、代码变动

  1)新增SimpleImageCode.java

public class SimpleImageCode implements Serializable{

  private static final long serialVersionUID = 1L;
  private String code;
  private LocalDateTime expireTime;

  public SimpleImageCode(String code,LocalDateTime expireTime) {
    this.code = code;
    this.expireTime = expireTime;
  }
  public String getCode() {
    return code;
  }
  public void setCode(String code) {
    this.code = code;
  }
  public LocalDateTime getExpireTime() {
    return expireTime;
  }
  public void setExpireTime(LocalDateTime expireTime) {
    this.expireTime = expireTime;
  }
  public boolean isExpried() {
    return LocalDateTime.now().isAfter(expireTime);
  }
}

  该类与ImageCode.java基本一样,区别1:实现了Serializable接口;区别2:没有BufferedImage属性。原因是图形验证码要放入session中,而session需要存放到redis中,所以必须实现序列化接口。一个类实现序列化接口,它里面的类属性也要实现序列化接口,但是BufferedImage是jdk的类,无法实现序列化接口,这样就不把它放入到redis中,在校验时,我么只会校验验证码和过期时间,所以不会影响。

  2)修改ValidateCodeController.java

@GetMapping("/code/image")
public void createCode(HttpServletRequest request,HttpServletResponse response) throws Exception {
    ImageCode imageCode = createImageCode(request);
    SimpleImageCode simpleImageCode = new SimpleImageCode(imageCode.getCode(),imageCode.getExpireTime());
    //request.getSession().setAttribute("imageCodeSession", imageCode);
    request.getSession().setAttribute("imageCodeSession", simpleImageCode);//序列化到redis中
    ImageIO.write(imageCode.getImage(), "JPEG", response.getOutputStream());
 }

  将SimpleImageCode放入到session中

  3)修改ValidateCodeFilter.java

private void validate(HttpServletRequest request){
  //ImageCode codeInSession = (ImageCode)request.getSession().getAttribute("imageCodeSession");
   SimpleImageCode codeInSession = (SimpleImageCode)request.getSession().getAttribute("imageCodeSession");
   String codeInRequest = request.getParameter("imageCode");
   ... ...//校验逻辑
   request.getSession().removeAttribute("imageCodeSession");
  }

  校验验证码前从session中取出SimpleImageCode

  二、测试验证

  1)启动redis、80端口应用、8080端口应用,查看redis信息为空,如下:

  

  2)浏览器输入:localhost:8080/index.html,跳转登录页面,查看redis,如下:

  3)登录后,查看redis,如下:

  4)同一个浏览器输入:localhost/index.html,直接跳到index页面,查看redis,如下:

  5)点击index.html中的退出连接,查看redis,如下:

  6)再次访问localhost:8080/index.html,跳转登录页面,查看redis,如下:

  7)再次登录8080的应用,查看redis,如下:

  通过测试发现实现了单点登录。贴出截图只是说明session存在了redis中,并且会随着操作变化。实际无需关心redis。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • spring boot整合redis实现shiro的分布式session共享的方法

    我们知道,shiro是通过SessionManager来管理Session的,而对于Session的操作则是通过SessionDao来实现的,默认的情况下,shiro实现了两种SessionDao,分别为CachingSessionDAO和MemorySessionDAO,当我们使用EhCache缓存时,则是使用的CachingSessionDAO,不适用缓存的情况下,就会选择基于内存的SessionDao.所以,如果我们想实现基于Redis的分布式Session共享,重点在于重写Session

  • Springboot实现多服务器session共享

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

  • SpringCloud实现Redis在各个微服务的Session共享问题

    在微服务中,需要我们在各个微服务中共享Session,使用Redis来共享Session是一个很好的解决方法,Redis是运行在内存中,查取速度很快. 1.pom文件中添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency> <depe

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

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

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

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

  • Spring boot集成spring session实现session共享的方法

    最近使用spring boot开发一个系统,nginx做负载均衡分发请求到多个tomcat,此时访问页面会把请求分发到不同的服务器,session是存在服务器端,如果首次访问被分发到A服务器,那么session就会被存到A服务器,再次访问时负载均衡会分发到B服务器那么第一次访问的session信息就会获取不到之前的session信息,所以需要实现session共享,还好有spring session,使用简单的配置即可实现session共享,下面介绍下: 1. pom.xml中引入jar包 <!

  • 学习Spring-Session+Redis实现session共享的方法

    1.添加依赖 <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> <version>1.2.1.RELEASE</version> </dependency> <dependency> <groupId>redis.cl

  • Spring session实现共享单点登录案例过程解析

    一.项目构建 1.案例说明 本文主要演示单点登录功能,会贴出主要配置和代码以及必要解释,全部代码请参考git地址.session共享一个基本原则是将session存储在某个地方,所有的应用都可以访问,这里使用redis存储session.当应用需要认证时,先从redis读取用户信息. 2.基本配置 1)pom.xml <dependency> <groupId>org.springframework.session</groupId> <artifactId>

  • spring security实现下次自动登录功能过程解析

    这篇文章主要介绍了spring security实现记住我下次自动登录功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.原理分析 第一次登陆时,如果用户勾选了readme选项,登陆成功后springsecurity会生成一个cookie返回给浏览器端,浏览器下次访问时如果携带了这个cookie,springsecurity就会放行这次访问. 二.实现方式 2.1 简单实现方式 (1) 在springsecurity的配置文件中,http节

  • SpringBoot单点登录实现过程详细分析

    目录 1.具体实现步骤 2.代码展示 后台代码 前台代码 效果展示 1.具体实现步骤 添加拦截器,设置UUID作为唯一标识,存入数据库中 通过当前登陆者的账户进行查询 如果当前登陆者session中存入的UUID与我们数据库中的UUID值相同则通过 否则返回false,表示已在其他设备或浏览器登录登录 2.代码展示 首先我们新建一个Spring项目 添加以下几个依赖 yml配置文件 server:  port: 8080spring:  datasource:    driver-class-n

  • SpringBoot集成redis与session实现分布式单点登录

    目录 单点登录 SSO(Single Sign On) 什么是单点登录? 实现方式 开发技术 单点登录实现流程 实现案例 看效果 前言: 由于考虑到cookie的安全性问题,就有了下面这个版本的sso 单点登录 SSO(Single Sign On) 什么是单点登录? 单点登录的英文名叫做:Single Sign On(简称SSO),指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的系统.简而言之,多个系统,统一登陆. 我们可以这样理解,在一个服务模块登录后,其他模块无

  • 使用Spring Security OAuth2实现单点登录

    1.概述 在本教程中,我们将讨论如何使用Spring Security OAuth和Spring Boot实现SSO - 单点登录. 我们将使用三个单独的应用程序: •授权服务器 - 这是中央身份验证机制 •两个客户端应用程序:使用SSO的应用程序 非常简单地说,当用户试图访问客户端应用程序中的安全页面时,他们将被重定向到首先通过身份验证服务器进行身份验证. 我们将使用OAuth2中的授权代码授权类型来驱动身份验证委派. 2.客户端应用程序 让我们从客户端应用程序开始;当然,我们将使用Sprin

  • Spring gateway + Oauth2实现单点登录及详细配置

    场景: 按职能,鉴权系统需要划分 网关(spring gateway) + 鉴权(auth-server).本文通过实践搭建鉴权系统. spring gateway 首先引入pom依赖 1.resilience 熔断器 2.gateway 网关 3.eureka client 服务注册中心 4.lombok插件 5.actuator状态监控 <dependencies> <!-- 熔断器--> <dependency> <groupId>io.github.

  • SpringBoot整合mybatis简单案例过程解析

    这篇文章主要介绍了SpringBoot整合mybatis简单案例过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.在springboot项目中的pom.xml中添加mybatis的依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifac

  • spring boot基于DRUID实现数据源监控过程解析

    这篇文章主要介绍了spring boot基于DRUID实现数据源监控过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 随着需求和技术的日益革新,spring boot框架是越来越流行,她也越来越多地出现在我们的项目中,当然最主要的原因还是因为spring boot构建项目实在是太爽了,构建方便,开发简单,而且效率高.今天我们并不是来专门学习spring boot项目的,我们要讲的是数据源的加密和监控,监控到好说,就是不监控也没什么问题,但

  • Spring Boot 2和Redis例子实现过程解析

    这篇文章主要介绍了Spring Boot2发布与调用REST服务过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Redis是一个key-value数据库,支持存储的value类型包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).在Java中,使用较为广泛的客户端有Redisson.Jedis.Spring Data Redis模块默认使用Jedis. 开发

  • Spring MVC4.1服务器端推送实现过程解析

    这篇文章主要介绍了Spring MVC4.1服务器端推送实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 服务器端推送 SSE(server send event)是一种服务器端向浏览器推送消息的技术,而不是我们常规的浏览器像server请求然后响应; 当我们需要使用server向浏览器主动推送数据的时候,请考虑使用该项技术,而不是考虑具有双向通讯功能的websocket; 以前我们用ajax轮询server也能实现,服务器负担大;

随机推荐