一、首先Session

Session 是客户端与服务器通讯会话技术, 比如浏览器登陆、记录整个浏览会话信息。session存放在服务器,关闭浏览器不会失效。

Session实现原理

客户对向服务器端发送请求后,Session 创建在服务器端,返回Sessionid给客户端浏览器保存在本地,当下次发送请求的时候,在请求头中传递sessionId获取对应的从服务器上获取对应的Sesison

请求过程: 

 服务器端接受到客户端请求,会创建一个session,使用响应头返回 sessionId给客户端。客户端获取到sessionId后,保存到本地。

下次请求:客户端将本地的sessionId通过请求头发送到服务器。服务器从请求头获取到对应的sessionId,使用sessionId在本地session内存中查询。

 

HttpSession session = request.getSession();  //默认创建一个session  默认值为true  没有找到对应的session 自动创建session

HttpSession session = request.getSession(false) //true的情况是 客户端使用对应的sessionId查询不到对应的session 会直接创建一个新的session  如果有的话直接覆盖之前的

//false               客户端使用对应的sessionId查询不到对应的session   不会创建新的session

session 包括 sessionId和sessionValue

session本身是临时的  token(令牌)与  sessionId很相似   保证了临时且唯一

玩下session:

前提需要安装nginx

配置如下:

host文件:c:\windows\system32\drivers\etc

访问 www.toov5.com时候 走的nginx的服务器域名 然后默认监听的端口号80。 进而通过配置upstream 负载均衡!

lz在玩时候,弄到了半夜,也没排查出来原因,妈的气死了! 地址写成了 127.0.0.1

yml:

server:port: 8080  

pom:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.toov5.loveCode</groupId><artifactId>loveCode</artifactId><version>0.0.1-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.0.RELEASE</version><relativePath /> <!-- lookup parent from repository --></parent><properties><weixin-java-mp.version>2.8.0</weixin-java-mp.version><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.encoding>UTF-8</maven.compiler.encoding><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.build.locales>zh_CN</project.build.locales></properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> --></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency><!-- Testing Dependencies --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--spring session 与redis应用基本环境配置,需要开启redis后才可以使用,不然启动Spring boot会报错 --><!-- <dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency> --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><maimClass>com.meiteedu.WxMpApplication</maimClass></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

  

服务器端代码:

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 不 会直接创建一个新的sessionHttpSession session = request.getSession(true);if (session == null) {return serverPort + "  该服务器上没有存放对应的session值";}System.out.println("获取Session sessionid:信息" + session.getId() + "serverPort:" + serverPort);Object value = session.getAttribute("name");return serverPort + "-" + value;}}

启动类:启动两次 端口号修改8080、 8081

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);}}

运行结果:8080 和 8081来回切换 负载均衡

调用服务器端方法: fist 存放在8080

查询不到哦!

8081 没有  就创建新的session  覆盖原来的sessionId    true没有就创建

下次 又去8080 又没有 又创建 来回折腾..............

此时:

修改false  没有时候不创建

然后传入 value 然后继续轮训访问;

二、分布式Session

1、直接使用cookie替代session 不安全(存客户端)

2、Nginx的IP绑定  目的是同一个IP只能指定同一个机器访问(相当于没做集群了)

3、 使用数据库(效率低)

4、tomcat内置Session同步,通过广播可能产生延迟,占用带宽

5、使用 Spring-Session框架,相当于把session缓存缓存到redis中 (  缓存框架,缓存Session的值 )

6、可以使用token替代session功能。自定义令牌替代session

Spring-Session 重写httpsession框架,将对应的值缓存到redis中,有点类似于一级、二级缓存。

必须要有的!

yml文件:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.toov5.loveCode</groupId><artifactId>loveCode</artifactId><version>0.0.1-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.0.RELEASE</version><relativePath /> <!-- lookup parent from repository --></parent><properties><weixin-java-mp.version>2.8.0</weixin-java-mp.version><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.encoding>UTF-8</maven.compiler.encoding><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.build.locales>zh_CN</project.build.locales></properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> --></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency><!-- Testing Dependencies --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--spring session 与redis应用基本环境配置,需要开启redis后才可以使用,不然启动Spring boot会报错 --><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency> <dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><maimClass>com.meiteedu.WxMpApplication</maimClass></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

 非常非常重要的:一定要jredis引入  同时这个对session提供了大力支持哈哈

yml 的redis配置文件:

server:port: 8080redis:hostname: 192.168.91.3     port:  6379password:  123

  

 后台业务逻辑:

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 不 会直接创建一个新的sessionHttpSession 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;@Beanpublic JedisConnectionFactory connectionFactory() {JedisConnectionFactory connection = new JedisConnectionFactory();connection.setPort(Port);connection.setHostName(HostName);connection.setPassword(password);return connection;}
}

初始化:

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);}}

虽然是存放在8081,但是访问时候 都有哦~ 大家试试玩玩吧~~

 引入的jar包重写了 HttpSession类  去解决Session共享问题

而此时的:redis

控制台:

补充:

Spring Boot 整合redis:

server:port: 8080
spring:redis:database: 0   host:  192.168.91.3port:  6379password:  123jedis:pool:max-active: 8max-wait: -1max-idle: 8min-idle: 0timeout: 10000
redis:hostname: 192.168.91.3     port:  6379password:  123

  

转载于:https://www.cnblogs.com/toov5/p/9903017.html

分布式session之redis解决方案实现相关推荐

  1. 【49.Auth2.0认证与授权过程-微博开放平台认证授权过程-百度开放平台认证授权过程-社交登录实现(微博授权)-分布式Session问题与解决方案-SpringSession整合-Redis】

    一.知识回顾 [0.三高商城系统的专题专栏都帮你整理好了,请点击这里!] [1-系统架构演进过程] [2-微服务系统架构需求] [3-高性能.高并发.高可用的三高商城系统项目介绍] [4-Linux云 ...

  2. 分布式session之token解决方案实现

    分布式session之token解决方案实现 参考文章: (1)分布式session之token解决方案实现 (2)https://www.cnblogs.com/toov5/p/9904317.ht ...

  3. 分布式session问题

    分布式session问题 问题: 假设我们登录,每个用户登录会分配一个session空间,当只有一台Tomcat服务器时,并不会出现分布式session问题,但一台Tomcat服务器的并发量有限,在大 ...

  4. 分布式Session解决方案_Token + Redis

    接上一篇:分布式6大核心专题_分布式Session https://gblfy.blog.csdn.net/article/details/113802195 文章目录 1. 安装redis服务并启动 ...

  5. 分布式Session解决方案_Spring Session + Redis

    接上一篇:分布式6大核心专题_分布式Session https://gblfy.blog.csdn.net/article/details/113802195 文章目录 1. 安装redis服务并启动 ...

  6. redis session java获取attribute_面试题:给我说说你能想到几种分布式session实现?...

    作者:yanglbme 来源:https://github.com/doocs/advanced-java/blob/master/docs/distributed-system/distribute ...

  7. java分布式会话redis_详解springboot中redis的使用和分布式session共享问题

    对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载均衡算法,由于Nginx对不同的请求分发到某一个Tomcat,Tomca ...

  8. 分布式session的6种解决方案

    先来复习三个基础问题 : Q1 . session什么时候创建 ? 一个常见的错误是在客户端请求到达的时候就被创建 , 然而实际上是直到某服务端程序(如servlet)调用HttpServletReq ...

  9. spring+redis自主实现分布式session(非spring-session方式)

    为什么80%的码农都做不了架构师?>>>    背景:最近对一个老项目进行改造,使其支持多机部署,其中最关键的一点就是实现多机session共享.项目有多老呢,jdk版本是1.6,s ...

  10. 分布式 Session 一致性解决方案

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 cnblogs.com/SimpleWu/p/10118674.html 推荐: ...

最新文章

  1. ANT无线通信技术(2) 通道配置
  2. 自动唤醒解锁电脑 bat_吉行贴士 | 一键解锁智能语音新姿势
  3. 计算机病毒能够自我复制自我执行吗,计算机病毒能够自我复制、自我执行。
  4. Docker学习(一)
  5. ecshop 搜索热词推荐_拼多多搜索推广实操——如何选择正确的关键词实现高投产!...
  6. Android-RelativeLayout布局技巧(一)
  7. 光端机与光纤收发器的应用
  8. 01-UIScrollView01-大图片展示
  9. sqlserver入门
  10. 2016年上半年系统集成中项4月6日作业
  11. logutils java_【java】简单的日志工具类LogUtils
  12. 计算机机房动环系属于什么分项,动环监控系统
  13. 芯片程序保护-常规芯片加密方式
  14. H.266/VVC代码学习:MIP技术相关代码之initIntraMip函数
  15. PMP考试有哪些科目
  16. 2022.11.27 第10次周报
  17. android 查看cpu 工具6,Android 之CPU监控命令
  18. java 大量数据保存_使用Java保存大量数据的最佳实践
  19. DxO PhotoLab 4.2Crack,使用独特的DxO本地调整工具
  20. 2023年电工杯数学建模AB题思路分析

热门文章

  1. 拓端tecdat|R语言使用倾向评分提高RCT(随机对照试验)的效率
  2. 粒子群优化算法python_粒子群优化算法(PSO)
  3. java日历制作日期不对_在我的代码中,为什么Java日期或日历中的月份日期不同? - java...
  4. opencv ret, binary = cv2.threshold(src, 180, 255, )二值化的类型
  5. python读取图片路径f.read()转化为bytes类型
  6. labelme 将自己数据集实现自动标注
  7. Caffe学习:使用pycaffe读取caffemodel参数
  8. 多线程(what,why,when)
  9. 概率生成模型-朴素贝叶斯(Naive Bayes)
  10. java redis3.0_Java + Redis(第三章)