我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringBoot+SpringSession+Redis怎么实现session共享

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringBoot+SpringSession+Redis怎么实现session共享

这篇文章主要介绍SpringBoot+SpringSession+Redis怎么实现session共享,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

springboot是什么

springboot一种全新的编程规范,其设计目的是用来简化新Spring应用的初始搭建以及开发过程,SpringBoot也是一个服务于框架的框架,服务范围是简化配置文件。

一、pom.xml配置 

<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>

二、application.properties的redis配置

#redisspring.redis.host=127.0.0.1spring.redis.port=6379spring.redis.password=123456spring.redis.pool.max-idle=8spring.redis.pool.min-idle=0spring.redis.pool.max-active=8spring.redis.pool.max-wait=-1#超时一定要大于0spring.redis.timeout=3000spring.session.store-type=redis

在配置redis时需要确保redis安装正确,并且配置notify-keyspace-events Egx,spring.redis.timeout设置为大于0,我当时这里配置为0时springboot时启不起来。

三、编写登录状态拦截器RedisSessionInterceptor

//拦截登录失效的请求public class RedisSessionInterceptor implements HandlerInterceptor{    @Autowired    private StringRedisTemplate redisTemplate;     @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception    {        //无论访问的地址是不是正确的,都进行登录验证,登录成功后的访问再进行分发,404的访问自然会进入到错误控制器中        HttpSession session = request.getSession();        if (session.getAttribute("loginUserId") != null)        {            try            {                //验证当前请求的session是否是已登录的session                String loginSessionId = redisTemplate.opsForValue().get("loginUser:" + (long) session.getAttribute("loginUserId"));                if (loginSessionId != null && loginSessionId.equals(session.getId()))                {                    return true;                }            }            catch (Exception e)            {                e.printStackTrace();            }        }         response401(response);        return false;    }     private void response401(HttpServletResponse response)    {        response.setCharacterEncoding("UTF-8");        response.setContentType("application/json; charset=utf-8");         try        {            response.getWriter().print(JSON.toJSONString(new ReturnData(StatusCode.NEED_LOGIN, "", "用户未登录!")));        }        catch (IOException e)        {            e.printStackTrace();        }    }     @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception    {     }     @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception    {     }}

四、配置拦截器

@Configurationpublic class WebSecurityConfig extends WebMvcConfigurerAdapter{    @Bean    public RedisSessionInterceptor getSessionInterceptor()    {        return new RedisSessionInterceptor();    }     @Override    public void addInterceptors(InterceptorRegistry registry)    {        //所有已api开头的访问都要进入RedisSessionInterceptor拦截器进行登录验证,并排除login接口(全路径)。必须写成链式,分别设置的话会创建多个拦截器。        //必须写成getSessionInterceptor(),否则SessionInterceptor中的@Autowired会无效        registry.addInterceptor(getSessionInterceptor()).addPathPatterns("/api/**").excludePathPatterns("/api/user/login");        super.addInterceptors(registry);    }}

五、登录控制器

@RestController@RequestMapping(value = "/api/user")public class LoginController{    @Autowired    private UserService userService;     @Autowired    private StringRedisTemplate redisTemplate;     @RequestMapping("/login")    public ReturnData login(HttpServletRequest request, String account, String password)    {        User user = userService.findUserByAccountAndPassword(account, password);        if (user != null)        {            HttpSession session = request.getSession();            session.setAttribute("loginUserId", user.getUserId());            redisTemplate.opsForValue().set("loginUser:" + user.getUserId(), session.getId());             return new ReturnData(StatusCode.REQUEST_SUCCESS, user, "登录成功!");        }        else        {            throw new MyException(StatusCode.ACCOUNT_OR_PASSWORD_ERROR, "账户名或密码错误!");        }    }     @RequestMapping(value = "/getUserInfo")    public ReturnData get(long userId)    {        User user = userService.findUserByUserId(userId);        if (user != null)        {            return new ReturnData(StatusCode.REQUEST_SUCCESS, user, "查询成功!");        }        else        {            throw new MyException(StatusCode.USER_NOT_EXIST, "用户不存在!");        }    }}

六、效果

我在浏览器上登录,然后获取用户信息,再在postman上登录相同的账号,浏览器再获取用户信息,就会提示401错误了,浏览器需要重新登录才能获取得到用户信息,同样,postman上登录的账号就失效了。

浏览器:

SpringBoot+SpringSession+Redis怎么实现session共享

SpringBoot+SpringSession+Redis怎么实现session共享

postman:

SpringBoot+SpringSession+Redis怎么实现session共享

七、核心原理详解

分布式session需要解决两个难点:1、正确配置redis让springboot把session托管到redis服务器。2、唯一登录。

1、redis:

redis需要能正确启动到出现如下效果才证明redis正常配置并启动

SpringBoot+SpringSession+Redis怎么实现session共享

同时还要保证配置正确

@EnableCaching@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 30)//session过期时间(秒)@Configurationpublic class RedisSessionConfig{    @Bean    public static ConfigureRedisAction configureRedisAction()    {        //让springSession不再执行config命令        return ConfigureRedisAction.NO_OP;    }}

springboot启动后能在redis上查到缓存的session才能说明整个redis+springboot配置成功!

SpringBoot+SpringSession+Redis怎么实现session共享

2、唯一登录:

用户登录时,在redis中记录该userId对应的sessionId,并将userId保存到session中。

HttpSession session = request.getSession();session.setAttribute("loginUserId", user.getUserId());redisTemplate.opsForValue().set("loginUser:" + user.getUserId(), session.getId());

访问接口时,会在RedisSessionInterceptor拦截器中的preHandle()中捕获,然后根据该请求发起者的session中保存的userId去redis查当前已登录的sessionId,若查到的sessionId与访问者的sessionId相等,那么说明请求合法,放行。否则抛出401异常给全局异常捕获器去返回给客户端401状态。

以上是“SpringBoot+SpringSession+Redis怎么实现session共享”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringBoot+SpringSession+Redis怎么实现session共享

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringBoot+SpringSession+Redis怎么实现session共享

这篇文章主要介绍SpringBoot+SpringSession+Redis怎么实现session共享,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!springboot是什么springboot一种全新的编程规范,其
2023-06-14

Springsession实现Session共享

本文主要介绍了Springsession实现Session共享,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-16

redis实现session共享的方法

目录引言案例介绍具体操作引言大厂很多项目都是部署到多台服务器上,这些服务器在各个地区都存在,当我们访问服务时虽然执行的是同一个服务,但是可能是不同服务器运行的;在我学习项目时遇到这样一个登录情景,假设有如下三台服务器(如图),就使用se
2023-04-14

springcloud怎么实现Session共享

本篇内容介绍了“springcloud怎么实现Session共享”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!通常情况下,Tomcat、Je
2023-06-05

在Spring-Session使用Redis如何实现共享session

这期内容当中小编将会给大家带来有关在Spring-Session使用Redis如何实现共享session,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、添加依赖
2023-05-31

怎么在Spring Boot中利用Redis实现session共享

本篇文章给大家分享的是有关怎么在Spring Boot中利用Redis实现session共享,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。引入spring-boot-start
2023-05-30

redis实现session共享的方法是什么

这篇文章主要介绍“redis实现session共享的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“redis实现session共享的方法是什么”文章能帮助大家解决问题。引言大厂很多项目都是
2023-07-06

tomcat的session共享怎么实现

在Tomcat中,可以通过以下几种方式来实现Session共享:1. 使用Tomcat的集群功能:Tomcat提供了内置的集群功能,可以通过配置多个Tomcat实例,实现Session的共享和负载均衡。可以使用多种方式来配置Tomcat集群
2023-09-21

spring boot与redis 实现session共享教程

如果大家对spring boot不是很了解,大家可以参考下面两篇文章。Spring Boot 快速入门教程Spring Boot 快速入门指南这次带来的是spring boot + redis 实现session共享的教程。在spring
2023-05-31

Redis实现Session共享与单点登录

首先,导包。在pom.XML文件里面加入以下:org.springframework.bootspring-boot-starter-data-Red
2022-07-12

Redis的共享session应用实现短信登录

目录1. 基于 session 实现短信登录1.1 短信登录流程图1.2 实现发送短信验证码1.3 实现短信验证码登录、注册1.4 实现登录校验拦截器2. 集群的 session 共享问题3. 基于 Redis 实现共享 session 登
2022-08-17

SpringCloud开启session共享并存储到Redis的实现

这篇文章主要介绍了SpringCloud开启session共享并存储到Redis的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-14

redis怎么实现分布式session

Redis可以通过以下几步来实现分布式session:1. 创建一个Redis服务器集群:可以使用Redis Sentinel或Redis Cluster来创建一个Redis服务器集群。这样可以确保数据在分布式环境中的高可用性和容错性。2.
2023-09-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录