redis实现session共享

    技术2023-07-28  117

    后台业务逻辑

    package com.toov5.loveCode; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class TestSessionController { @Value("${server.port}") private String serverPort; @RequestMapping("/") public String index() { return serverPort; } // 创建session 会话 @RequestMapping("/createSession") public String createSession(HttpServletRequest request, String nameValue) { // 默认 创建一个session, HttpSession session = request.getSession(); System.out.println( "存入Session sessionid:信息" + session.getId() + ",nameValue:" + nameValue + ",serverPort:" + serverPort); session.setAttribute("name", nameValue); return "success-" + serverPort; } // 获取session 会话 @RequestMapping("/getSession") public Object getSession(HttpServletRequest request) { // 设置为true 情况下的时候,客户端使用对应的sessionid 查询不到对应的sesison 会直接创建一个新的session // 设置为false 情况下的时候,客户端使用对应的sessionid 查询不到对应的sesison 不 会直接创建一个新的session HttpSession session = request.getSession(false); if (session == null) { return serverPort + " 该服务器上没有存放对应的session值"; } System.out.println("获取Session sessionid:信息" + session.getId() + "serverPort:" + serverPort); Object value = session.getAttribute("name"); return serverPort + "-" + value; } }

    配置

    package com.toov5.loveCode; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; //这个类用配置redis服务器的连接 //maxInactiveIntervalInSeconds为SpringSession的过期时间(单位:秒) @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800) public class SessionConfig { // 冒号后的值为没有配置文件时,制动装载的默认值 @Value("${redis.hostname:localhost}") String HostName; @Value("${redis.port:6379}") int Port; @Value("${redis.password}") String password; @Bean public JedisConnectionFactory connectionFactory() { JedisConnectionFactory connection = new JedisConnectionFactory(); connection.setPort(Port); connection.setHostName(HostName); connection.setPassword(password); return connection; } }

    @EnableRedisHttpSession详解

    该注解主要通过RedisHttpSessionConfiguration注册一个SessionRepositoryFilter,当请求进来的时候,SessionRepositoryFilter会先拦截到请求,将request和Response对象转换成SessionRepositoryRequestWrapper和SessionRepositoryResponseWrapper。后续当第一次调用request的getSession方法时,会调用到SessionRepositoryRequestWrapper的getSession方法。这个方法的逻辑是先从request的属性中查找session,如果查找到的话直接返回;如果找不到,再查找一个key值是"SESSION"的cookie,通过这个cookie拿到sessionId去redis中查找,如果查不到,就直接创建一个RedisSession对象,同步到Redis中(同步的时机根据配置来)。

    初始化

    package com.toov5.loveCode; import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer; //初始化Session配置 public class SessionInitializer extends AbstractHttpSessionApplicationInitializer{ public SessionInitializer() { super(SessionConfig.class); } }

    启动类

    package com.toov5.loveCode; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; @EnableAutoConfiguration @SpringBootApplication public class AppSession { public static void main(String[] args) { SpringApplication.run(AppSession.class, args); } }

     

    Processed: 0.014, SQL: 9