session共享
什么是session?
由于 HTTP 协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户。Session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 Session 保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是 Session。客户端浏览器再次访问时只需要从该 Session 中查找该客户的状态就可以了。
为什么需要 Session 共享
用户的请求首先会到达前置网关,前置网关根据路由策略将请求分发到后端的服务器,这就会出现第一次的请求会交给服务器 1 处理,下次的请求可能会是服务B处理,如果不做 Session 共享的话,就有可能出现用户在服务 2登录了,下次请求的时候到达服务 2 又要求用户重新登录。
Spring Session
Spring Session 提供了一套创建和管理 Servlet HttpSession 的方案。Spring Session 提供了集群 Session(Clustered Sessions)功能,默认采用外置的 Redis 来存储 Session 数据(不用手动存储到redis中),以此来解决 Session 共享的问题。
Spring Session 为企业级 Java 应用的 session 管理带来了革新,使得以下的功能更加容易实现:
- API 和用于管理用户会话的实现。
- HttpSession - 允许以应用程序容器(即 Tomcat)中性的方式替换 HttpSession。
- 将 session 所保存的状态卸载到特定的外部 session 存储中,如 Redis 或 Apache Geode
中,它们能够以独立于应用服务器的方式提供高质量的集群。 - 支持每个浏览器上使用多个 session,从而能够很容易地构建更加丰富的终端用户体验。
- 控制 session id 如何在客户端和服务器之间进行交换,这样的话就能很容易地编写 Restful API,因为它可以从 HTTP头信息中获取 session id,而不必再依赖于 cookie。
- 当用户使用 WebSocket 发送请求的时候,能够保持 HttpSession 处于活跃状态。
Spring 为 Spring Session 和 Redis 的集成提供了组件:spring-session-data-redis,下面演示如何使用。
快速集成
引入依赖包
<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId>
</dependency>
- 1
- 2
- 3
- 4
Session 配置
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30)
public class SessionConfig {
}
maxInactiveIntervalInSeconds: 设置 Session 失效时间,使用 Redis Session 之后,原 Boot 的 server.session.timeout 属性不再生效。
- 1
- 2
- 3
- 4
- 5
实现模拟登陆
添加登陆方法和注册方法:
添加登录方法,登录成功后将用户信息存放到 Session 中。
@RequestMapping(value = "/login")
public String login (HttpServletRequest request,String userName,String password){String msg="登陆失败!";User user= userRepository.findByUserName(userName);if (user!=null && user.getPassword().equals(password)){request.getSession().setAttribute("user",user);msg="登陆成功!";}return msg;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
定义 index 方法,只有用户登录之后才会看到:index content 这条信息否则提示请先登录。
@RequestMapping(value = "/index")
public String index (HttpServletRequest request){String msg="首页内容";Object user= request.getSession().getAttribute("user");if (user==null){msg="请先登录!";}return msg;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
将项目复制,修改项目端口号:8899和8800
测试流程:
访问:http://localhost:8800/index和http://localhost:8899/index都会提示先登录。
用8800窗口登陆:localhost:8800/login?userName=xiaoli&password=123456。
登陆成功后访问首页:显示首页内容,8899端口直接访问首页,我们发现显示首页内容,则实现了session共享。
退出登录:
@RequestMapping(value = "/logout")public String logout (HttpServletRequest request){HttpSession session=request.getSession();session.removeAttribute("user");return "";}
- 1
- 2
- 3
- 4
- 5
--------------------- 作者:不知名的小李 来源:CSDN 原文:https://blog.csdn.net/weixin_41555736/article/details/80945073?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!