-
2022-02-20 17:23:14
因为很多接口都需要使用cookie和session来记录登录状态,而很多接口必须要又一个登录状态才可以请求成功,Requests中的Session会话管理的作用就是自动的记录cookie和session的登录状态。
更多相关内容 -
JavaWeb Session 会话管理实例详解
2020-09-01 15:09:32主要介绍了JavaWeb Session 会话管理的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友一起看看吧 -
session会话管理
2014-08-04 20:18:27session会话管理,session的原理,API,应用案例 -
springboot使用redis做session会话管理
2019-03-12 23:05:13在项目中经常用到session做用户登陆后的会话管理,利用redis的特性可以很好的实现这一效果,下面我们看看如何使用springboot整合redis做到管理session,也就是登录用户的信息,这样就可以避免频繁的刷新页面, ...在项目中经常用到session做用户登陆后的会话管理,利用redis的特性可以很好的实现这一效果,下面我们看看如何使用springboot整合redis做到管理session,也就是登录用户的信息,这样就可以避免频繁的刷新页面,
1、pom依赖,这里面依赖的时候有个坑,我用的是2.0.1的版本,如果直接使用spring-session配合springboot-redis一起用,项目跑起来的时候总会报错,后来我干脆把spring-session去掉,换成spring-session-data-redis这个记好了,也有的整合时候说不加这个也可以,但我试了很多次还是会报错,
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> <relativePath /> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <thymeleaf.version>3.0.10.RELEASE</thymeleaf.version> <thymeleaf-layout-dialect.version>2.1.1</
-
Spring Boot Session 会话管理
2022-01-20 18:25:15会话管理是用于安全控制一个用户或者实体对基于网络的应用/服务的多个请求的过程。 HTTP用于网站和浏览器之间的交流,而会话则是同一个用户创建的一系列的HTTP请求和事务。 会话管理的实现规定了用户、网络应用之间...Spring Boot Session
会话管理是用于安全控制一个用户或者实体对基于网络的应用/服务的多个请求的过程。
HTTP用于网站和浏览器之间的交流,而会话则是同一个用户创建的一系列的HTTP请求和事务。
会话管理的实现规定了用户、网络应用之间共享和持续交换会话ID的过程。
由于HTTP协议的无状态,为了跟踪客户的行为,我们需要会话管理。会话管理是一个网络容器框架,用于为特定的用户储存会话数据。
我们可以通过以下方法处理会话:
-
Cookies
网站发送的数据被储存在用户的本地浏览器中
-
隐藏的表达字段
在隐藏的数据中,对用户不可见也不可修改,当用户提交表单时,隐藏数据会被发送。
-
URL重写
修改URL的参数
-
HttpSession(网络会话)
允许数据与单个访问者绑定
在分布式环境中,我们可以通过以下方式管理会话:
-
粘性会话(Sticky Session)
在这种类型的会话中,负载均衡将把通过一个客户的请求路由到同一个节点,如果这个节点发生故障,则会话会丢失。
-
复制会话(Session Replication)
为了克服粘性会话的问题,会话复制将会话数据复制到多个服务器,当任何节点发生故障后,会话数据可以转移到另外的节点。
-
持久数据储存中的会话数据(Session Data in a Persistent DataStore)
还有一种情况下,会话数据并不会储存在服务器中,取而代之的是,它会被储存在数据库里,并且拥有唯一id
SESSION_ID
。
Spring Session
Spring Session包含下述组件:
-
Spring Session Core
Spring Session的核心APIs
-
Spring Session Data Redis
提供Redis数据库会话管理的会话存储库
-
Spring Session JDBC
提供关系数据库会话管理的会话存储库
-
Spring Session Hazelcast
提供Hazelcast会话管理的会话存储库
默认情况下,Apache Tomcat在内存中储存HTTP会话管理的对象。为了管理Spring Boot 会话管理,HTTPSession会被用于通过Spring Session JDBC在持久层中存储会话信息。
maven中导入
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-core</artifactId> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-jdbc</artifactId> </dependency>
创建Controller
为了处理用户的请求,处理用户的数据并将数据存储在会话的
NOTES_SESSION
属性中。import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller public class SpringBootSessionController { @PostMapping("/addNote") public String addNote(@RequestParam("note") String note, HttpServletRequest request) { //get the notes from request session List<String> notes = (List<String>) request.getSession().getAttribute("NOTES_SESSION"); //check if notes is present in session or not if (notes == null) { notes = new ArrayList<>(); // if notes object is not present in session, set notes in the request session request.getSession().setAttribute("NOTES_SESSION", notes); } notes.add(note); request.getSession().setAttribute("NOTES_SESSION", notes); return "redirect:/home"; } @GetMapping("/home") public String home(Model model, HttpSession session) { List<String> notes = (List<String>) session.getAttribute("NOTES_SESSION"); model.addAttribute("notesSession", notes!=null? notes:new ArrayList<>()); return "home"; } @PostMapping("/invalidate/session") public String destroySession(HttpServletRequest request) { //invalidate the session , this will clear the data from configured database (Mysql/redis/hazelcast) request.getSession().invalidate(); return "redirect:/home"; } }
为了验证,我们可以创建一个html:
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Spring Boot Session Management Example</title> </head> <body> <div> <form th:action="@{/addNote}" method="post"> <textarea name="note" cols="40" rows="2"></textarea> <br> <input type="submit" value="Add Note" /> </form> </div> <div> <form th:action="@{/invalidate/session}" method="post"> <input type="submit" value="Destroy Session" /> </form> </div> <div> <h2>Notes</h2> <ul th:each="note : "> <li th:text="">note</li> </ul> </div> </body> </html>
在页面上添加note到session中后,数据库中会创建两个表:
- spring_session
- spring_session_attributes
点击Destroy Session后,数据库中spring_session_attributes的数据将被清除。
-
-
Shiro + Redis自定义session会话管理
2020-01-23 21:02:54Shiro + Redis自定义session会话管理 博客:Shiro + Redis自定义session会话管理 此图非常重要!!!镇楼 0x001 重写SessionManager shiro提供了三种默认实现: DefaultSessionManager: 用于java se 环境 ...Shiro + Redis自定义session会话管理
博客:Shiro + Redis自定义session会话管理
此图非常重要!!!镇楼
0x001 重写SessionManager
shiro提供了三种默认实现:
- DefaultSessionManager: 用于java se 环境
- ServletContainerSessionManager:默认使用的实现,Servlet容器管理
- DefaultWebSessionManager:自己维护
重写
SessionManager
需要继承DefaultWebSessionManager
类目的:自定义从
header
中的Authorization
获取token
public class CustomSessionManager extends DefaultWebSessionManager { @Override protected Serializable getSessionId(ServletRequest request, ServletResponse response) { String id = WebUtils.toHttp(request).getHeader("Authorization"); if (StringUtils.isEmpty(id)) { // 获取sessionId,id可以自定义 return super.getSessionId(request, response); } else { //返回sessionId;固定套路 request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, "header"); request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, id); request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE); return id; } } }
0x002 重写SessionDao
重写
SessionDao
需要实现SessionDAO
接口继承
AbstractSessionDAO
,其实现了基础的实现@Component public class SelfSessionDao extends AbstractSessionDAO { @Autowired private RedisTemplate<Object,Object> redisTemplate; private final String prefix = "shiro:session"; // 创建session,保存到数据库 @Override protected Serializable doCreate(Session session) { Serializable sessionId = generateSessionId(session); String s = JSON.toJSONString(session); System.out.println("doCreate:" + s); // 必须要将生成的id设置到session实力当中 assignSessionId(session,sessionId); redisTemplate.boundValueOps(prefix + sessionId).set(session); return sessionId; } @Override protected Session doReadSession(Serializable sessionId) { return (Session) redisTemplate.boundValueOps(prefix + sessionId).get(); } @Override public void update(Session session) throws UnknownSessionException { if (session == null || session.getId() == null) { throw new UnknownSessionException("session 或者 session为空"); } redisTemplate.boundValueOps(prefix + session.getId()).set(session); } @Override public void delete(Session session) { redisTemplate.delete(prefix + session.getId()); } @Override public Collection<Session> getActiveSessions() { Set<Object> keys = redisTemplate.keys(prefix); if (keys != null) { return keys.stream().map(key -> { Session s = (Session) redisTemplate.boundValueOps(key).get(); return s; }).collect(Collectors.toList()); } else { return null; } } }
0x003自定义id生成器
public class CustomSessionIdGenerator implements SessionIdGenerator { @Override public Serializable generateId(Session session) { //... 生成id逻辑 return id; } }
0x004 配置类
@Bean public SecurityManager getSecurityManager(CustomRealm realm,DefaultWebSessionManager defaultWebSessionManager) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(realm); //将自定义的会话管理器注册到安全管理器中 securityManager.setSessionManager(defaultWebSessionManager); //将自定义的redis缓存管理器注册到安全管理器中 securityManager.setCacheManager(selfCacheManager()); return securityManager; } //会话管理器 @Bean public DefaultWebSessionManager sessionManager(SelfSessionDao selfSessionDao) { CustomSessionManager sessionManager = new CustomSessionManager(); // 自定义sessionDAO sessionManager.setSessionDAO(selfSessionDao); // 自定义id生成器 selfSessionDao.setSessionIdGenerator(new CustomSessionIdGenerator()); return sessionManager; }
-
SpringSession (一) --------- Session 会话管理概述
2022-04-05 17:10:30url 重写二、Session会话管理及带来的问题三、Session 会话共享方案 一、Web 中的 Session 和 Cookie 回顾 1. Session 机制 由于HTTP协议是无状态的协议,一次浏览器和服务器的交互过程就是: 浏览器:你好吗? ... -
Shiro的Session会话管理
2020-12-24 05:56:35Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如web容器tomcat),不管JavaSE还是JavaEE环境都可以使用,提供了会话管理、会话事件监听、会话存储/持久化、容器无关的集群、失效/过期支持、对Web的透明... -
shiro——session会话管理
2019-08-23 18:02:531.2 SessionManager 会话管理 1.3 SessionListener 会话监听 2. 会话持久化 2.1 SessionDAO接口 2.2AbstractSessionDAO类 2.3 CachingSessionDAO 类 2.4 EnterpriseCacheSessionDAO 类 2.5 Memo... -
第六章 会话管理(Session)
2020-05-22 12:24:09文章目录会话管理的概念和基本原理为什么...使用隐藏的表单域会话管理:使用URL重写• Session会话管理的原理和技术实现Session示例:使用Session实现用户登录使用Session对象会话失效Session与URL重写Session的方法 -
webgoat——Session Management Flaws会话管理缺陷
2021-01-20 08:49:11之前认证缺陷的也会涉及到类似的知识点,由于每次请求完成后链接就会断开,当客户端再次发起请求的时候,服务端就识别不了客户端的状态,而会话管理就是解决这一问题的,其中一种会话管理是通过服务器端session的... -
JavaWeb中的Session会话
2022-04-03 15:42:17每个客户端都有自己的一个session会话。【在打开浏览器打开一个网站之后,知道关闭浏览器。这期间就叫做会话】 如何创建Session和获取session: 创建session:使用方法request.getSession(); 获取session:... -
JavaWeb会话管理Cookie&session
2022-04-05 17:52:55会话概述:一次会话中包含多次请求和响应 一次会话:浏览器第一次给服务器资源发送请求,会话建立,知道有一方断开为止。 版本1:当前浏览器与服务器间多次的...(2)服务端会话技术:session 1.Cookie 1.1.概... -
SpringBoot+Shiro学习(五):Session会话管理
2018-12-16 08:09:58这节我们讲一下,Shiro的Session会话管理。 会话 所谓会话,即用户访问应用时保持的连接关系,在多次交互中应用能够识别出当前访问的用户是谁,且可以在多次交互中保存一些数据。如访问一些网站时登录成功后,网站... -
[44]session会话管理
2018-06-11 09:03:26session会话和cookie一起被称为会话跟踪技术,主要通过保存在服务器端的session数据和客户端浏览器的cookie数据共同完成用户访问服务器的足迹记录。 1. 什么是会话 会话session通常情况下,当客户端浏览器打开... -
spring session实现分布式会话管理
2018-04-09 14:49:09spring session分布式session会话管理 分布式系统session的管理 -
angular-session:AngularJS 中会话管理的基本类
2021-06-14 11:51:44角会话 AngularJS 中会话管理的基本类 需要 -
shiro的session中的会话管理
2020-02-06 20:53:41在分布式系统或者微服务架构下,都是通过统一的认证中心进行用户认证。如果使用默认会话管理,用户信息只会 保存到一台服务器上。那么其他服务就需要进行会话的同步。 即session中的会话管理 -
会话管理之session技术
2016-04-27 15:55:49在web开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的... -
分布式集群系统中Session会话的高效共享方法研究
2021-01-12 21:15:51传统共享方法是在应用服务器中进行的,其 Session 会话管理是独立的,意味着在集群系统中,一旦出现机器宕机,那么会话共享时间就会缩短。针对该问题,提出了基于有序模型Session会话的高效共享方案。保持原IP地址,... -
php 会话管理(SESSION管理)
2016-10-12 22:07:25关于会话的个人理解:当你打开一个网站后,在一个有效期内(会话有效期内)进行的一系列操作,这是一个会话的完整过程,如何理解呢。 1.不登录情况下的会话 有的网站当你一打开的时候就会给你分配一个会话ID,以跟踪... -
分布式应用session会话管理-基于redis
2016-10-26 16:26:34session会话在单台服务器下不会出现共享问题,现在应用部署方式都是分布式,或者集群部署,这样必然会面临一个问题,session共享。 session共享的解决方案也有很多, 一、web服务器的粘性请求,比如采用nginx... -
tomcat-cluster-redis-session-manager:Tomcat集群Redis会话管理器Java客户端
2021-05-11 15:02:24Tomcat集群Redis会话管理器 Redis会话管理器是可插入的。 它将会话存储到Redis中,以便在Tomcat服务器群集之间轻松分配HTTP请求。 在这里,会话被实现为非粘性的(意味着,每个请求都可以转到集群中的任何服务器,... -
5G NGC — 会话管理模型 — PDU Session
2021-02-26 12:17:43文章目录目录5G 的会话管理模型PDU SessionPDU Session 的类型DNN 的作用UE IP 地址的分配方式 5G 的会话管理模型 5G 对会话管理模型进行了较多的优化和扩展,包括: 隧道模型从 Bearer(承载)粒度改为了 Session... -
react-session:一个简单的对象,用于在React应用程序中管理客户端会话数据
2021-05-13 00:35:10一个简单的对象,用于在React应用程序中管理客户端会话数据。 这与服务器端会话不同步。 安装 npm install react - client - session -- save 用法 一个简单的例子。 下载并运行该演示以获取更多示例,或在浏览。 ... -
icloud-session:管理 iCloud 会话
2021-06-26 05:48:41管理 iCloud 会话 安装 由于这在 npm 上尚不可用,您可以按照以下步骤安装该模块: 克隆这个仓库 $ git clone https://github.com/alexlincoln/icloud-session.git 克隆icloud-http-client存储库 $ git clone ... -
TensorFlow学习笔记1——Session会话控制
2021-01-06 21:59:25Session拥有和管理物理资源CPU和GPU、网络连接的功能,作为上下文管理器来使用 1.建立Seesion会话 现在定义计算矩阵相乘的一个操作 matrix1 = tf.constant([[3,3]]) matrix2 = tf.constant([[2],[2]]) product = tf.... -
Spring Security中的会话【Session】管理与防御以及会话的并发控制
2021-12-13 11:06:36Session的诞生就是为了解决这一个难题,提供了无状态的HTTP请求实现用户状态维持的方案——服务器和用户之间约定每个HTTP请求携带一个ID信息【代表当前用户信息】 服务器通过与用户约定每 个请求都携带... -
Spring系列学习之Spring Session 用户会话管理
2018-12-26 00:01:48英文原文:...Spring Session提供了用于管理用户会话信息的API和实现。 特性 Spring Session使得支持集群会话变得微不足道,而不依赖于特定于应用程序容器的解决方案。它还提供透明集成: HttpSess... -
PHP-Session-Management:使用会话管理类维护安全会话
2021-06-27 08:18:14会话管理 该类用于维护和管理网站的会话。 通过本课程,您可以: 开始会话。 重新生成会话 ID。 检查会话是否有效。 关闭会话。 在这个类中,可以使用用户的指纹来验证会话。 指纹包括安全词、IP 地址、浏览器...