实战开发,使用 Spring Session 与 Spring security 完成网站登录改造!!

本文介绍了如何使用Spring Session和Spring Security进行网站登录改造,将Session存储到Redis中,实现后端Session的集中管理。通过Spring Boot项目实例,详细讲解了Spring Session的配置与使用,以及Spring Security的登录验证和权限控制。借助这两个框架,可以简化登录鉴权流程,提高开发效率。
摘要由CSDN通过智能技术生成

上次小黑在文章中介绍了四种分布式一致性 Session 的实现方式,在这四种中最常用的就是后端集中存储方案,这样即使 web 应用重启或者扩容,Session 都没有丢失的风险。

今天我们就使用这种方式对 Session 存储方式进行改造,将其统一存储到 Redis 中。

实现方案

我们先来想一下,如果我们不依靠任何框架,自己如何实现后端 Session 集中存储。

这里我们假设我们的网站除了某些页面,比如首页可以直接访问以外,其他任何页面都需要登录之后才能访问。

如果需要实现这个需求,这就需要我们对每个请求都进行鉴权,鉴权目的是为了判断用户是否登录,判断用户角色。

如果用户没有登录,我们需要将请求强制跳转到登录页面进行登录。

用户登录之后,我们需要将登录获取到的用户信息存储到 Session 中,这样后面请求鉴权只需要判断 Session 中是否存在即可。

知道整个流程之后,其实实现原理就不是很难了。

我们可以使用类似 AOP 的原理,在每个请求进来之后,都先判断 Session 中是否存在用户信息,如果不存在就跳转到登录页。

整个流程如下所示:

我们可以利用 Servelt Filter 实现上述流程,不过上述整套流程,Spring 已经帮我们实现了,那我们就不用重复造轮子了。

我们可以使用 Spring-SessionSpring-security 实现上述网站的流程。

Spring-Session 是 Spring 提供一套管理用户 Session 的实现方案,使用 Spring-Session 之后,默认 WEB 容器,比如 Tomcat,产生的 Session 将会被 Spring-Session 接管。

除此之外,Spring-Session 还提供几种常见后端存储实现方案,比如 Redis,数据库等。

有了 Spring-Session 之后,它只是帮我们解决了 Session 后端集中存储。但是上述流程中我们还需要登录授权,而这一块我们可以使用 Spring-security 来实现。

Spring-security 可以维护统一的登录授权方式,同时它可以结合 Spring-Session 一起使用。用户登录授权之后,获取的用户信息可以自动存储到 Spring-Session 中。

好了,不说废话了,我们来看下实现代码。

下述使用 Spring Boot 实现, Spring-Boot 版本为:2.3.2.RELEASE

Spring Session

首先我们引入 Spring Session 依赖,这里我们使用 Redis 集中存储 Session 信息,所以我们需要下述依赖即可。

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

如果不是 Spring Boot 项目,那主要需要引入如下依赖:

<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-redis</artifactId>
  <version>2.3.0.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework.session</groupId>
  <artifactId>spring-session-core</artifactId>
  <version>2.3.0.RELEASE</version>
</dependency>

引入依赖之后,我们首先需要在 application.properties增加 Session 相关的配置:

## Session 存储方式
spring.session.store-type=redis

## Session 过期时间,默认单位为 s
server.servlet.session.timeout=600
## Session 存储到 Redis 键的前缀
spring.session.redis.namespace=test:spring:session

## Redis 相关配置
spring.redis.host=127.0.0.1
spring.redis.password=****
spring.redis.port=6379

配置完成之后,Spring Session 就会开始管理 Session 信息,下面我们来测试一下:

@ResponseBody
@GetMapping("/hello")
public String hello() {
   
    return "Hello World";
}

当我们访问上面地址之后,访问 Redis ,可以看到存储的 Session 信息。

推荐大家一个 Redis 客户端「Another Redis DeskTop Manager」,这个客户端 UI 页面非常漂亮,操作也很方便,下载地址:

https://github.com/qishibo/anotherredisdesktopmanager/releases

网速不好的同学,公号内回复:「redis」,获取安装包。

默认情况下,Session 默认使用HttpSession 序列化方式,这种值看起来不够直观。我们可以将其修改成 json 序列化方式,存储到 redis 中。

@Configuration
public class HttpSessionConfig implements Be
  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值