SpringSecurity 下 Session 使用

spring security的session管理 1 spring security的session管理 spring security关于认证session的逻辑处理在接口SessionAuthenticationStrategy的onAuthentication方法中,先看看这个接口和其实现类。 1.1 SessionAuthenticationStrategy接口 public interface SessionAuthenticationStrategy { /** * 当一个认证生成之后处理sessio 阅读详情

在之前的几章里面,我们分别做了快速入门、自定义表单登录、自定义手机登录。他们有一个共同点,就是目前我们与客户端之间的交互都依赖于 Session。那么本章我们就带大家来了解一下 SpringSecurity 下 Session 的使用与设置。

Session 是什么?

Session 中文意思为会议,在计算机中,尤其在网络应用中称为会话控制。

Session直接翻译成中文比较困难,一般都译成时域。在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。以及如果需要的话,可能还有一定的操作空间。

百度百科

为什么要使用 Session?

Http 协议本身是无状态的,多次连接之间的状态无法共享,服务端就判断是否是同一个用户操作的就比较麻烦。

而 Session 就是用来保存状态的,允许通过将对象存储在 Web 服务器内存中,在整个用户会话过程中进行共享。

Session 原理

浏览器第一次访问服务器时,服务端会生成 Session,然后同时为该 Session 生成一个唯一的 SessionId,然后将 SessionId 与 Session 以键值对的形式存储到内存中(Java 默认)。将 SessionId 以 Cookie 的方式返回给浏览器。浏览器下一次访问的时候就携带 SessionId 来访问,这样服务端通过查询就可以取出 Session 达到共享了。

在 SpringSecurity 里面的使用

单机 Session
  • Session 超时设置
    • 设置 Session 超时时间,在系统配置文件(application.properties/yml) 中配置

      server:
        session:
          timeout: 600 #单位为 Second,设置的时间低于 1 分钟,按 1 分钟处理
      
    • 设置 Session 超时/失效后继续访问处理,可以设置跳转页面,也可以设置跳转接口。前后端分离一般返回 Json,不分离可以引导页面跳转。两者都要兼容,可以跳转到自定义接口判断实际请求,进行处理。

      // 设置 Session 失效后访问跳转的页面
      http.sessionManagement().invalidSessionUrl("/session/invalid");
      
  • Session 并发控制
    • Session 最大数设置,限制系统中用户数量

      http.sessionManagement().maximumSessions(1)// 设置同时在线的最大 Session 数
      
    • 设置 Session 数量达到最大值时,是否阻止后面用户登录

      // 设置当 Session 数量达到最大数量时,阻止后面的登录
      http.sessionManagement().maxSessionsPreventsLogin(true);
      
    • 自定义设置 Session 数量达到最大时后续登录的处理策略,默认实现会将前面用户的 Session 置为失效

      // 设置 Session 并发登录时处理策略
      http.sessionManagement().expiredSessionStrategy(new DefaultExpiredSessionStrategy());
      
      /**
       * @author: hblolj
       * @Date: 2019/3/16 9:13
       * @Description: Session 并发登录时的处理策略
       * @Version:
       **/
      public class DefaultExpiredSessionStrategy implements SessionInformationExpiredStrategy{
      
          @Override
          public void onExpiredSessionDetected(SessionInformationExpiredEvent event) throws IOException, ServletException {
              event.getResponse().setCharacterEncoding("UTF-8");
              event.getResponse().getWriter().write("并发登录!");
          }
      }
      
集群 Session(单机 Session 下的设置在集群下一样有效)

在单机 Session 下基本上只要处理好上面的问题就可以了,但是随着系统越来越大,单体应用可能满足不了我们的需求。如果我们对应用进行了集群,那么用户在每个应用上都会产生一个 Session,并且这些 Session 还不是共享的,就达不到 Session 使用的初衷了。

为了让 Session 可以共享,一般我们就会改变 Session 的存储方式,Session 默认存储在内存中,多个主机间就不方便共享。主流处理方案有:

  • 保存在数据库
  • 保存在 Redis 中
  • 利用 Servlet 容器来进行 Session 同步
  • 或者使用 Nginx 使用用户 ip 进行哈希处理,在负载均衡时,让用户每次访问同一个主机避免多 Session 问题

我们这里主要还是讨论 SpringSecurity 下集群 Session 的处理方案,其他扩展信息,大家感兴趣可以自行查询,或者留言讨论。

我们这里示例使用 Redis 作为 Session 存储方式,通过下列配置 Session 就会默认存储在 Redis 中了。关于 SpringBoot 下 Redis 的使用,不了解的可以查询资料使用,上手还是比较简单的。

  • 使用 Redis 作为 Session 的存储,通过配置文件指定存储方式。

    spring:
      session:
        store-type: redis #设置将 Session 存储在 Redis 中
      redis:
        host: redis 所在的主机
        port: 默认是 6379
        database: 选择使用的 database
        password: your self password
        pool:
          max-wait: -1
          max-idle: 1
          max-active: 8
          min-idle: 0
    
  • 添加 Redis 依赖

    <!-- SpringBoot 版本 1.5.19.RELEASE-->
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
  • 添加 Spring-Session 依赖

    <!-- SpringBoot 版本 1.5.19.RELEASE-->
    <dependency>
       <groupId>org.springframework.session</groupId>
       <artifactId>spring-session</artifactId>
    </dependency>
    
  • 除了 Redis,SpringBoot 还支持一下存储方式,大家可以自行扩展使用

    public enum StoreType {
        REDIS,
        MONGO,
        JDBC,
        HAZELCAST,
        HASH_MAP,
        NONE;
    
        private StoreType() {
        }
    }
    
退出登录

既然 Session 中共享用户多次请求的状态,那么如果我们要用户登出,就只要清空 Session 即可。那么在 SpringSecurity 下是怎样设置的呢?

  • 如何退出

    • 请求登出地址,默认为 /logout

    • 自定义登出地址

      http.logout().logoutUrl("/quit");// 默认是 logout
      
  • 退出处理原理 (访问退出地址,退出处理逻辑 SpringSecurity 有默认实现)

    • 使当前 Session 失效

      (HttpSession)session.invalidate();
      
    • 清除与当前用户先关的 remember-me 记录

      if (authentication != null) {
          this.tokenRepository.removeUserTokens(authentication.getName());
      }
      
    • 清空当前的 SecurityContext

      if (this.clearAuthentication) {
          SecurityContext context = SecurityContextHolder.getContext();
          context.setAuthentication((Authentication)null);
      }
      
      SecurityContextHolder.clearContext();
      
  • 与退出相关的配置

    • 自定义退出成功跳转页面或处理策略,同时设置只有 logoutSuccessHandler 会生效

      http
      	.logout()
          .logoutSuccessUrl("http://www.baidu.com") // 设置退出成功跳转的页面
          .logoutSuccessHandler(new DefaultLogoutSuccessHandler()) // 设置退出成功的处理策略
      
      /**
       * @author: hblolj
       * @Date: 2019/3/16 10:28
       * @Description:
       * @Version:
       **/
      @Slf4j
      public class DefaultLogoutSuccessHandler implements LogoutSuccessHandler{
      
          @Override
          public void onLogoutSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException {
      
              log.info("Logout Success!");
          }
      }
      
    • 设置退出时删除客户端 Cookie

      http.logout().deleteCookies("JSESSIONID") // 退出时删除客户端指定的 Cookie
      

OK,到了这里,基本上在 SpringSecurity 里面 Session 的常规设置与使用都介绍完了。大家如果有什么问题,欢迎在下面的留言区留言讨论。

实际上,在现在的开发中,单体 Web 应用可能还是以 Session 为主,但是如果要同时支持 App 的话, Session 就不是那么好用了,因为 Session 依赖 Cookie,虽然 App 访问时可以模拟浏览器设置 Cookie,但是契合度还是不如 Web,所以对于 App 或者集群环境下,现在主流使用基于 OAuth2 的 Token 作为验证。是不是以为我们下一章要讲 SpringSecurity 下 OAuth2 协议的集成与 Token 使用呢?哈哈,下一章我们计划带大家集成一下 SpringSecurity 下第三方登录,比如 QQ 快速登录、微信快速登录等(也依赖于 OAuth 协议)。至于集成 Token 认证还要往后几章哦!

To Be Continue!

SpringSecurity中的集群会话Session存在的问题以及解决方案(保持、复制、共享) 在初步了解Session的时候,我们就知道Session通常是保存在服务器的内存当中的。每一次客户访问都会携带SessionId,然后在服务器的内存中寻找。虽然这种方式简单快捷,但是仍存在比较明显的缺点。服务器的内存是有限的,所以留给Session的空间不多,因此一旦用户的访问量比较多时内存就会捉襟见肘。而且因为session是存在内存当中,并不是持久化存储,就算服务器性能特别好,但是也不免存在服务器的异常停止和重启,这个时候就会导致会话状态的丢失。 阅读详情

相关推荐

Spring Security 6 系列之六 - 会话管理(Session)

我们在本章中了解到Spring Security的Session,并使用Redis实现Session共享。在实际业务中,Session是一种有状态登录,也就是服务器其实会存储Session信息。而现在很多项目都是使用Restful风格的微服务,Restful风格其实强调的是服务的无状态性、前后端分离。因此接下来我们开始了解Spring Security 做前后端分离的一些操作,下一章先从异常处理开始。

代码让AI扣 2128

Spring Security中的会话【Session】管理与防御以及会话的并发控制

众所周知,HTTP本身是没有任何关于当前用户状态的内容,也就是两个HTTP请求之间是没有任何的关联可言,用户在和服务器交互的过程中,站点无法确定是哪个用户访问,也因此不能对其提供相应的个性化服务。Session的诞生就是为了解决这一个难题,提供了无状态的HTTP请求实现用户状态维持的方案——服务器和用户之间约定每个HTTP请求携带一个ID信息【代表当前用户信息】 服务器通过与用户约定每 个请求都携带一个id类的信息,从而让不同请求之间有了关联,而id又可以很方...

SunRains 4955

springSession+springSecurity结合使用实现redis管理session

目录1. pom.xml2. 进行springsession的redis配置3. session配置4. 查看redis5. 获取redis中的当前用户总结 springboot中使用security进行登录及权限控制可以查看之前的文章,springboot中使用spring-security进行登陆控制 此篇主要介绍在已经使用springsecuriy的项目中如何集成springsessi...

nb7474的博客 2万+

Spring Security之Session管理

对于UsernamePasswordAuthenticationFilter而言,SessionManagementFilter有点名不副实,因为前者登录成功后就会自己调用SessionAuthenticationStrategy。因此学习session管理,我们的重点是SessionAuthenticationStrategy。

Evan_L的博客 2966

session在SpringSecurity中如何用——源码分析

登录写入session 在执行登录动作时,在successhandler中,当有流开启对响应头做出修改时就会触发一个onResponseCommit方法,里面调用了HttpSessionSecurityContextRepository.saveContent的方法对session写入或更新 @Override protected void saveContext(SecurityContext...

helloworld_ddd的博客 840

11-SpringSecurity:Session共享

spring-boot-starter-test test 配置文件 server: port: 8000 spring: redis: host: 10.16.1.110 port: 6379 pool.max-idle: 8 pool.min-idle: 0 pool.max-active: 8 pool.max-wait: -1 password: timeout: 1000 资源接口 创建资源接口: 登录之后默认跳转 / ,展示当前服务的端口号。 @RestController publ

m0_66789766的博客 1002

用户登录认证和权限授权(SpringSecurity、JWT、session)

登录认证和权限授权是所有项目中必不可少的功能,本篇文章首先将通过最简单的方式(Session和JWT)实现登录认证和权限授权,然后再整合Springsecurity框架实现。

qq_51076441的博客 1万+

保姆级教程:在Davinci Configurator里配置BswM的ECU状态机(附状态切换流程图)

本文提供了一份详细的AUTOSAR BswM模块配置指南,通过Davinci Configurator工具实现ECU状态机的构建与管理。内容涵盖从模式请求端口创建到状态切换规则定义的全流程,特别针对Ecu State Handling进行了深入解析,并附有状态切换流程图,帮助汽车电子工程师高效完成ECU状态管理配置。

weixin_28366475的博客 412

【springboot/springsecurity】session超时时间设置

文章目录1 springboot项目session超时时间设置2 springsecurity下如何通知用户session超时2.1 在配置文件BrowserSecurityConfig里加上session超时跳向的url2.2 在配置文件BrowserSecurityConfig里为指定session超时跳向的url授权2.3 写一个controller方法来处理session超时的提示逻辑2....

nrsc 2万+

GPS定位不准?可能是GDOP在作怪!手把手教你优化卫星几何分布

本文深入解析了GPS定位精度不佳的常见原因——几何精度因子GDOP。通过剖析卫星几何分布对定位误差的放大效应,文章提供了从理解GDOP、PDOP、HDOP等关键指标,到使用专业APP实时诊断卫星天空图,再到利用在线工具提前规划最佳定位时机的完整实战指南。旨在帮助户外爱好者、无人机飞手及专业用户主动优化卫星几何条件,从而显著提升定位可靠性。

weixin_29062823的博客 306

基于Canfestival的对象字典工具objdictedit.py的运行环境配置

本文以菜狗的视角,一步一步地对对象字典的环境进行配置,旨在能给读者一个比较详细的参考,不恰之处,还请指正。

在线求职中... 3711

springSecurity结合使用实现redis管理session

1. pom.xml 添加springsession的依赖: <span style="color:#000000"><code><dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> <version>${spring

liberty12345678的专栏 3223

C#连接数据库报Authentication to host ‘127.0.0.1‘ for user ‘root‘ using method ‘caching_sha2_password‘ fail

所以导致的,除了上边的办法,还可以把这个加密规则修改一下,这个的修改方式有很多,具体原因是因为MySQL8.0以前的加密规则是。

weixin_42209881的博客 4131

SpringSecurity前后端分离的session问题

最近在写一个demo,是前后端分离的,前端通过使用axios来发送异步请求来获取后端的数据,后端使用了SpringSecurity来做系统的鉴权,但发现,SpringSecurity总是拿不到session的问题。 前言: 由于SpringSecurity中,很多东西都是基于session来做的,比如,当用户登录成功后,会创建一个SecurityContextHolder,里面存储了用户认证后的token数据,然后将其存储到session中。 当该用户的后续请求再过...

Mr_FenKuan的博客 3092

Docker容器化部署Ceph集群:从零搭建高可用分布式存储

本文详细介绍了如何使用Docker容器化部署Ceph集群,从零搭建高可用分布式存储系统。通过环境一致性、快速扩容和资源隔离等优势,Docker显著提升了Ceph集群的部署效率和运维便捷性。文章涵盖硬件规划、镜像选择、单节点部署、多节点扩展及性能调优等实战内容,帮助开发者快速掌握分布式存储系统的容器化部署技巧。

weixin_29081101的博客 425

2026年全国青少年信息素养大赛算法应用主题赛C++赛项【决赛】模拟卷1:文末附答案

2026年全国青少年信息素养大赛算法应用主题赛C++赛项【决赛】模拟卷1:文末附答案

王老师青少年编程 1178

SpringSecurity:session管理

文章目录SpringSecurity:session管理1 Session超时2 限制最大登录数3 踢出用户4 退出登录5 Session 共享 SpringSecurity:session管理 1 Session超时 当用户登录后,我们可以设置 session 的超时时间,当达到超时时间后,自动将用户退出登录。 Session 超时的配置是 SpringBoot 原生支持的,我们只需要在 application.properties 配置文件中配置: server: servlet: sess

拒绝熬夜啊的博客 4775

Autosar配置——导入DBC后配置SecOC同步报文和同步请求报文

在Autosar中,安全性是一个重要的考虑因素,而SecOC(Secure On-Board Communication)是一种用于保护通信数据完整性和安全性的安全机制。在上述示例中,我们配置了同步报文和同步请求报文的属性。接下来,我们需要在Autosar中配置同步报文和同步请求报文。同步报文用于在通信双方之间同步SecOC状态,而同步请求报文用于请求SecOC的状态信息。通过以上配置,我们成功地导入了DBC文件,并在Autosar系统中配置了SecOC同步报文和同步请求报文。希望以上信息对您有所帮助!

CyberSphinx的博客 650

SpringSecurity如何管理session

SessionManagementFilter是在用户认证成功后,执行一些session相关的工作,包括防止固定会话攻击,多点登录登自动下线等。用户通过扩展点,能自定义各种策略。下面是SessionManagementFilter的流程图,分为4个子流程:认证通过,执行策略成功,保存SecurityContext,执行下一个Filter认证通过,执行策略失败,执行身份认证失败策略(一般是重定向到登录页面),结束请求。

xsgnzb的专栏 1255

Android Telephony主要模块及功能

Telephony的代码主要由五个模块组成 1.Telephony Frameworks 代码区域: frameworks/opt/telephony/ 其中主要的文件在如下目录 /frameworks/opt/telephony/src/java/com/android/internal/telephony/ 其中比较常见的有以下几类文件 1.BaseCommands、RIL构成R

泊客 7728

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

SpringBoot整合SpringSecurity,SESSION 并发管理,同账号只允许登录一次

SpringBoot整合SpringSecurity,SESSION 并发管理,同账号只允许登录一次   重写了UsernamePasswordAuthenticationFilter,里面继承AbstractAuthenticationProcessingFilter,这个类里面的session认证策略,是一个空方法,貌似RememberMe也是.   publi

codes520的博客 3478

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SpringSecurity2 session超时跳转登陆界面

项目中权限系统使用的是Spring Security2.0,由于对session过期没有过多的支持(Spring Security3.0支持session超时的配置设置),所以只能自己实现。简单的说,也就是通过过滤器拦截请求,判断session是否过期,如果过期跳转登陆界面,否则放行。具体实现如下: 1、web.xml中添加过滤器配置 SessionTimeoutFilter c

Java Dynamic的专栏 5576

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SpringSecurity 配置(登陆验证,session失效等等)

SpringSecurity 配置(登陆验证,session失效等等) 2015年09月28日 15:44:24 iteye_1371 阅读数:9 标签: security 更多 个人分类: spring_security SpringSecurity安全配置—SSH整合 项目中使用了SpringSecurity,将SpringSecurity安全配置整理出来,实现SpringSecurit...

weixin_42858906的博客 5078

《SpringSecurity in Action》一: 基于Session实现登陆认证

SpringSecurity - 基于Session实现登陆认证1 依赖2 代码示例2.1 代码说明 1 依赖 <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>

shangcunshanfu的博客 1693

【SpringSecurity-06】session会话的安全管理

SpringSecurity session会话的安全管理 Spring Security session 创建策略 always: 如果当前请求没有对应的session存在,创建一个session。 ifRequired(默认):在需要使用到session时才创建session。 never:Spring Security将永远不会主动创建session,但是如果session在当前应用中已经存在,它将使用该session。 stateless:Spring Security不会创建或使用任何sessi

weixin_45717355的博客 591

springsecurity扩展session中存放的User对象

springsecurity扩展session中存放的User对象 参考文章 http://www.family168.com/oa/springsecurity/html/ch208-extenduser.html 在原来的mini-web的基础上,参考原来的配置: 这个配置基本上没有改变,只是重新查看了一下UserDetailServiceImpl.java...

快马扬鞭须努力! 612
上一篇: 3. SpringSecurity 自定义手机号登录
下一篇: OAuth2 协议及其四种授权模式
Earth_Programer
博客等级 码龄11年 18粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值