redis实现session共享

session共享

什么是session?

由于 HTTP 协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户。Session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 Session 保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是 Session。客户端浏览器再次访问时只需要从该 Session 中查找该客户的状态就可以了。

为什么需要 Session 共享

redis实现session共享_第1张图片
用户的请求首先会到达前置网关,前置网关根据路由策略将请求分发到后端的服务器,这就会出现第一次的请求会交给服务器 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,下面演示如何使用。

快速集成

引入依赖包


    org.springframework.session
    spring-session-data-redis
  • 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 版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(redis实现session共享)