1.session是什么

当用户在前端发起请求时,服务器会为当前用户建立一个session,服务器将sessionId回写给客户端,只要用户浏览器不关闭,再次请求服务器时,将sessionId传给服务器,

服务器会根据sessionId找到与之对应的session为其服务。

如果是分布式部署时,session存储在服务器端,下次用户请求过来,通过负载均衡,可能会分发到其他服务器节点;所以,需要解决session一致性的问题,

使用redis来实现分布式session,个人理解是将session存放到redis中,每次请求过来时,会从redis读取session信息

2.代码实现

①.maven需要引入的依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
</dependency>

②.配置文件指定redis的ip和端口

spring.redis.host=172.18.66.45
spring.redis.port=6379

③.httpSession配置

package com.session.config;

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;
//maxInactiveIntervalInSeconds设置session有效时间,单位是秒;默认是30分钟
@EnableRedisHttpSession(maxInactiveIntervalInSeconds=180)
public class SessionConfig { @Value("${spring.redis.host}")
private String hostName;
@Value("${spring.redis.port}")
private int port; @Bean
public JedisConnectionFactory connectionFactory() {
JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
connectionFactory.setPort(port);
connectionFactory.setHostName(hostName);
System.out.println("获取到的hostName是:"+hostName + ",port :"+port);
return connectionFactory;
}
}

再实现一个controller,就可以模拟实际业务场景写session、根据session校验用户是否登录

package com.session.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class SessionController { //模拟第一次登陆时,保存session
@RequestMapping(value="/login")
public String login(HttpServletRequest request) {
HttpSession session = request.getSession();
String str = (String) session.getAttribute("userInfo");
if(str == null || "".equals(str)) {
session.setAttribute("userInfo", "mpy test session");
return "用户登录成功-success";
}else{
return "session中存在数据,用户已登录";
}
} /*该方法模式登陆之后,调用业务接口
*在实际的业务场景中,可以使用拦截器,对每次请求进行判断,校验用户是否登录、session是否过期
*/
@RequestMapping(value="/getSession")
public String getSession(HttpServletRequest request) {
HttpSession session = request.getSession();
String str = (String) session.getAttribute("userInfo");
if(str == null || "".equals(str)) {
return "session中没有数据,请登录";
}else{
//已登录用户,进行其他业务代码的处理
System.out.println("session中的属性是:"+str);
return str;
}
} @RequestMapping(value="/logout")
public String logout(HttpServletRequest request) {
HttpSession session = request.getSession();
String str = (String) session.getAttribute("userInfo");
if(str != null && "".equals(str)) {
session.invalidate();
}
return "退出成功";
}
}

@EnableRedisHttpSession和spring-session的实现原理还有待研究学习

具体的代码,已经上传至GitHub,https://github.com/mapy95/spring-session.git

最新文章

  1. ng-repeat 里 使用ng-show ng-hide出现闪动
  2. EntityFrameWork 使用时碰到的小问题
  3. 2016HUAS暑假集训训练2 F - A Simple Problem with Integers
  4. require.async换这个方法的transport问题
  5. egrep 查找IP
  6. GlusterFS特性介绍
  7. FushionCharts Free 的运用[2D/3D图表处理]
  8. tomcat version
  9. SQL_substr功能测试
  10. 机器学习 - 正则化L1 L2
  11. php7 curl返回false error返回空串
  12. .NET Core 2.0应用程序大小减少50%
  13. HDU 1503【LCS】(字符串合并输出)
  14. Jquery书写AJAX动态向页面form传数据,清空之前的数据
  15. [sql]mysql5.6cmake安装/mysql5.7二进制安装
  16. Asp.net webapi Owin Get request form data
  17. 零基础图文傻瓜教程接入Facebook的sdk
  18. Linux centos下php安装cphalcon扩展的方法
  19. String.IsNullOrEmpty 与 String.IsNullOrWhiteSpace
  20. ZOJ 3774 二次剩余

热门文章

  1. opencv边缘检测
  2. Eureka参数配置-&gt;Client端参数
  3. JS/JQuery 禁用超链接a
  4. 插入排序--JavaScript描述
  5. python import cv2异常(dll load fail / windows server 2008)
  6. js中对于数组的操作
  7. ng-cli新建项目
  8. .netcore 开发的 iNeuOS 物联网平台部署在 Ubuntu 操作系统,无缝跨平台。助力《2019 中国.NET 开发者峰会》。
  9. 原生js使用getComputedStyle方法获取CSS内部属性值
  10. nginx的负载均衡实战