本文共 2287 字,大约阅读时间需要 7 分钟。
会话(Session)管理在web开发中是一种不可或缺的功能,Redis集合Spring Session可以轻松便捷的实现分布式集群中的会话管理。
由于HTTP的特征之一就是无状态,所以用户在访问同一个网站的不同页面时进行的某些交互性操作将毫无意义,例如,如果用户同时打开了购物车页和商品的详情页,在详情页将若干心仪的商品加入购物车,然后再刷新购物车页,会发现之前加入购物车的商品都没有保存成功,因此,Web应用需要使用会话管理技术,例如Cookie和Session,将用户会话完整保存下来,甚至在分布式服务中共享。
Cookie是客户端技术,将用户信息保存在本地,信息容量受限于用户使用的浏览器,且有一定的安全风险,Session是服务端技术,将用户信息保存在服务端,信息容量可扩展,同时在一定程度上降低了安全风险,弥补了Cookie技术的不足。
1、使用Spring Initializr创建Spring Boot Web项目。
2、在pom.xml中配置Maven依赖。
org.springframework.boot spring-boot-starter-data-redis org.springframework.session spring-session-data-redis org.springframework.boot spring-boot-starter-web
3、在application.properties中配置Redis信息。
spring.session.store-type=REDISspring.session.redis.flush-mode=on_savespring.session.redis.namespace=spring:sessionspring.redis.host=10.0.0.130spring.redis.port=6379
4、启动类添加注解
@SpringBootApplication@EnableRedisHttpSessionpublic class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); }}
5、测试代码
import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;import java.util.UUID;@Controller@RequestMapping("/")public class SessionController { @RequestMapping(value = "/getSessionId") @ResponseBody public String getSessionId(HttpServletRequest request) { int port = request.getLocalPort(); String sessionId = request.getSession().getId(); String userId = request.getSession().getAttribute("userId").toString(); return "端口:" + port + "sessionId:" + sessionId + "属性userId:" + userId; } @RequestMapping(value = "/setSessionId") @ResponseBody public String setSessionId(HttpServletRequest request) { String userId = UUID.randomUUID().toString().replaceAll("-", ""); request.getSession().setAttribute("userId", userId); return "Session 设置成功.userId:" + userId; }}
6、启动两个相同服务,模拟集群环境
不同用户之间互不影响
转载地址:http://mmlrb.baihongyu.com/