

SpringSecurity-10-Session会话管理
source link: https://blog.51cto.com/u_12023894/5155791
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

SpringSecurity-10-Session会话管理
理解Session
Http协议是一种无状态协议所以当服务端需要记录用户的状态时,需要某种机制用于识别用户,这个机制就是Session。服务器通过和用户约定每一个请求携带一个id信息,用于统一用户的请求有了管理,并且区分不同用户。基于session方案,为让用户请求都携带同一个id,并且不妨碍用户体验的情况下,选择cookie作为载体是一个不错的选择,用户第一次访问服务器的时候,没有携带id,服务器端会生成sessionid:session键值对,并且发送sessionid给客户端添加到cookie中。然后该用户在之后的访问中,每一次请求都会将sessionid放到cookie中,使得服务端可以很容易识别用户。
但是有时候用户为了保护个人信息或者安全考虑会禁用cookie,这时候cookie就无法使用。因此有时候服务还支持用url重写来实现,比如:
URL重写原本是为了兼容禁用cookie的浏览器而设计的,但也容易被黑客利用。黑客只需访问一 次系统,将系统生成的sessionId提取并拼凑在URL上,然后将该URL发给一些取得信任的用户。只要 用户在session有效期内通过此URL进行登录,该sessionId就会绑定到用户的身份,黑客便可以轻松享 有同样的会话状态,完全不需要用户名和密码,这就是典型的会话固定gongji。
防御会话固定攻击
sessionManagement是一个会话管理的配置器,其中,防御会话固定攻击的策略有四种:
- none:用户登录后session不发生变化
- newSession:用户登录以后创建新的session
- migrateSession:用户登录后创建新的session,但是会将旧的session中数据复制到新的session中。
- changeSessionId:不创建新的会话,而是使用selert容器提供的会话固定保护,每次登录访问之后都更换sessionid,但是没有新建session会话。默认启动此策略
会话过期
除了防御会话固定攻击,还可以通过SpringSecurity配置会话过期策略,比如会话过期跳转到某个URL。在Springboot应用中有两种会话超时设置的方式,当会话超时之后用户需要重写登录才可以访问应用:
server.servlet.session.timeout=1m
spring.session.timeout=1m
方式1是springboot应用自带的session超时设置,方式2是使用Spring Session之后。提供的session超时配置,方式2优先级高。
在Spring Boot中Session超时最短的时间是一分钟,当你的设置小于一分钟的时候,默认为一分钟默认超时时长是30分钟
默认情况下session失效以后会跳转到认证页面,我们可以自定义session失效后,响应结果,有以下两种方式。
invalidSessionUrl
invalidSessionUrl作用是session失效后跳转的url,配置如下,在安全配置中心的 configure(HttpSecurity http)方法中添加代码如下:
- 在src\main\resources\templates路径下添加invalidSession.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>springboot葵花宝典登录页面</title>
<!-- Tell the browser to be responsive to screen width -->
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<h1>springboot葵花宝典登录页面</h1>
<h2>session会话失效</h2>
</body>
</html>
- 在controller中添加
public String invalidSession() {
return "invalidSession"; // classpath: /templates/login.html
}
- 在LearnSrpingSecurity的configure(HttpSecurity http)添加配置
具体配置如图
注意要以上路径需要配置permitAll()权限,即无需授权即可访问
启动项目登录后,再次登录,结果如下
invalidSessionStrategy
session失败后的策略,配置如下:
- 创建com.security.learn.sessionStrategy.CustomInvalidSessionStrategy代码如下
private static ObjectMapper objectMapper = new ObjectMapper();
@Override
public void onInvalidSessionDetected(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
Cookie cookie = new Cookie("JSESSIONID", null);
cookie.setMaxAge(0);
String contextPath = request.getContextPath();
String c= contextPath.length() > 0 ? contextPath : "/";
cookie.setPath(c);
response.addCookie(cookie);
// 当认证失败后,响应 JSON 数据给前端
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write(objectMapper.writeValueAsString("策略失效"));
}
}
- 将CustomInvalidSessionStrategy注入容器
public class Myconfig {
@Bean
@ConditionalOnMissingBean(InvalidSessionStrategy.class)
public CustomInvalidSessionStrategy customInvalidSessionStrategy(){
return new CustomInvalidSessionStrategy();
}
}
- 添加session失效处理
在LearnSrpingSecurity的configure(HttpSecurity http)添加配置,代码如下
启动项目登录后,再次登录,结果如下
如果您觉得本文不错,欢迎关注,点赞,收藏支持,您的关注是我坚持的动力!
公众号 springboot葵花宝典 主要分享JAVA技术,主要包含SpringBoot、SpingCloud、Docker、中间件等技术
原创不易,转载请注明出处,感谢支持!如果本文对您有用,欢迎转发分享!
Recommend
-
71
基础知识 tomcat tomcat是Apache软件基金会的Jakarta项目中的核心项目,最新的Servlet和JSP规范能够在Tomcat中很好的表现。作为一个免费的开放源代码的Web应用服务器,属于轻量级的应用服务器,在中小型系统和并发量不是很大的场景下被广泛使用,是开发和调试J...
-
50
tomcat是Apache软件基金会的Jakarta项目中的核心项目,最新的Servlet和JSP规范能够在Tomcat中很好的表现。作为一个免费的开放源代码的Web应用服务器,属于轻量级的应用服务器,在中小型系统和并发量不是很大的场景下被广泛使用,是开发和调试JSP代码的首...
-
10
类似 GNU Screen,Tmux 是一个帮助我们在单一终端窗口中创建多个会话,同一时间内同时运行多个应用程序或进程的终端复用工具。 来源:
-
11
WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音对话或视频对话的 API。W3C 和 IETF 在2021年1月26日共同宣布 WebRTC 1.0 定稿,促使 WebRTC 从事实上的互联网通信标准成为了官方标准,其在不同场景的应用将得到更为广泛...
-
8
使用 iTerm2 管理 Tmux 会话 发表于 2021-08-02 ...
-
3
管理系统后端(java)请参考:https://blog.csdn.net/grd_java/article/details/121925792 本项目源码,码云:
-
4
SpringSecurity-12-Redis实现基于session共享登录方案如果我们使用单机版本的Session存储身份信息的时候,如果服务器挂掉,那么服务就无法使用了。如果我们将项目部署到CD两台服务器上,Session就无法保持一致。如果用户user第一次访问C服务器,然后再...
-
8
从会话管理到故障异常处理:Session机制在IoT设备中的全方位应用 产品@Devin 2023-03-15 0 评论...
-
10
聊聊Zookeeper的Session会话超时重连 简单地...
-
6
缩短Session会话有效期并不能增加安全性 - 极道 登录到 Web 应用程序时,会话不会永远保持有效。通常,会话在登录后...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK