網(wǎng)站首頁 編程語言 正文
一、首先Session
Session 是客戶端與服務(wù)器通訊會話技術(shù), 比如瀏覽器登陸、記錄整個瀏覽會話信息。session存放在服務(wù)器,關(guān)閉瀏覽器不會失效。
Session實現(xiàn)原理
客戶對向服務(wù)器端發(fā)送請求后,Session 創(chuàng)建在服務(wù)器端,返回Sessionid給客戶端瀏覽器保存在本地,當(dāng)下次發(fā)送請求的時候,在請求頭中傳遞sessionId獲取對應(yīng)的從服務(wù)器上獲取對應(yīng)的Sesison
請求過程:
服務(wù)器端接受到客戶端請求,會創(chuàng)建一個session,使用響應(yīng)頭返回 sessionId給客戶端??蛻舳双@取到sessionId后,保存到本地。
下次請求:客戶端將本地的sessionId通過請求頭發(fā)送到服務(wù)器。服務(wù)器從請求頭獲取到對應(yīng)的sessionId,使用sessionId在本地session內(nèi)存中查詢。
HttpSession session = request.getSession(); //默認(rèn)創(chuàng)建一個session 默認(rèn)值為true 沒有找到對應(yīng)的session 自動創(chuàng)建session HttpSession session = request.getSession(false) //true的情況是 客戶端使用對應(yīng)的sessionId查詢不到對應(yīng)的session 會直接創(chuàng)建一個新的session 如果有的話直接覆蓋之前的 //false 客戶端使用對應(yīng)的sessionId查詢不到對應(yīng)的session 不會創(chuàng)建新的session
session 包括 sessionId和sessionValue
session本身是臨時的 token(令牌)與 sessionId很相似 保證了臨時且唯一
玩下session:
前提需要安裝nginx
配置如下:
host文件:c:\windows\system32\drivers\etc
訪問 www.toov5.com時候 走的nginx的服務(wù)器域名 然后默認(rèn)監(jiān)聽的端口號80。 進(jìn)而通過配置upstream 負(fù)載均衡!
lz在玩時候,弄到了半夜,也沒排查出來原因,媽的氣死了! 地址寫成了 127.0.0.1
yml:
server: port: 8080
pom:
4.0.0 com.toov5.loveCode loveCode0.0.1-SNAPSHOT org.springframework.boot spring-boot-starter-parent 2.0.0.RELEASE 2.8.0 1.8 1.8 UTF-8 UTF-8 zh_CN org.projectlombok lombok org.springframework.boot spring-boot-starter-web com.alibaba fastjson 1.2.47 org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-starter-data-redis org.apache.commons commons-pool2 redis.clients jedis org.apache.maven.plugins maven-compiler-plugin 1.8 1.8 org.springframework.boot spring-boot-maven-plugin com.meiteedu.WxMpApplication repackage
服務(wù)器端代碼:
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; } // 創(chuàng)建session 會話 @RequestMapping("/createSession") public String createSession(HttpServletRequest request, String nameValue) { // 默認(rèn) 創(chuàng)建一個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) { // 設(shè)置為true 情況下的時候,客戶端使用對應(yīng)的sessionid 查詢不到對應(yīng)的sesison 會直接創(chuàng)建一個新的session // 設(shè)置為false 情況下的時候,客戶端使用對應(yīng)的sessionid 查詢不到對應(yīng)的sesison 不 會直接創(chuàng)建一個新的session HttpSession session = request.getSession(true); if (session == null) { return serverPort + " 該服務(wù)器上沒有存放對應(yīng)的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); } }
運(yùn)行結(jié)果:8080 和 8081來回切換 負(fù)載均衡
調(diào)用服務(wù)器端方法: fist 存放在8080
查詢不到哦!
8081 沒有 就創(chuàng)建新的session 覆蓋原來的sessionId true沒有就創(chuàng)建
下次 又去8080 又沒有 又創(chuàng)建 來回折騰..............
此時:
修改false 沒有時候不創(chuàng)建
然后傳入 value 然后繼續(xù)輪訓(xùn)訪問;
二、分布式Session
1、直接使用cookie替代session 不安全(存客戶端)
2、Nginx的IP綁定 目的是同一個IP只能指定同一個機(jī)器訪問(相當(dāng)于沒做集群了)
3、 使用數(shù)據(jù)庫(效率低)
4、tomcat內(nèi)置Session同步,通過廣播可能產(chǎn)生延遲,占用帶寬
5、使用 Spring-Session框架,相當(dāng)于把session緩存緩存到redis中 (緩存框架,緩存Session的值)
6、可以使用token替代session功能。自定義令牌替代session
Spring-Session 重寫httpsession框架,將對應(yīng)的值緩存到redis中,有點類似于一級、二級緩存。
必須要有的!
yml文件:
4.0.0 com.toov5.loveCode loveCode0.0.1-SNAPSHOT org.springframework.boot spring-boot-starter-parent 2.0.0.RELEASE 2.8.0 1.8 1.8 UTF-8 UTF-8 zh_CN org.projectlombok lombok org.springframework.boot spring-boot-starter-web com.alibaba fastjson 1.2.47 org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-starter-data-redis org.springframework.session spring-session-data-redis org.apache.commons commons-pool2 redis.clients jedis org.apache.maven.plugins maven-compiler-plugin 1.8 1.8 org.springframework.boot spring-boot-maven-plugin com.meiteedu.WxMpApplication repackage
非常非常重要的:一定要jredis引入 同時這個對session提供了大力支持哈哈
yml 的redis配置文件:
server: port: 8080 redis: hostname: 192.168.91.3 port: 6379 password: 123
后臺業(yè)務(wù)邏輯:
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; } // 創(chuàng)建session 會話 @RequestMapping("/createSession") public String createSession(HttpServletRequest request, String nameValue) { // 默認(rèn) 創(chuàng)建一個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) { // 設(shè)置為true 情況下的時候,客戶端使用對應(yīng)的sessionid 查詢不到對應(yīng)的sesison 會直接創(chuàng)建一個新的session // 設(shè)置為false 情況下的時候,客戶端使用對應(yīng)的sessionid 查詢不到對應(yīng)的sesison 不 會直接創(chuàng)建一個新的session HttpSession session = request.getSession(false); if (session == null) { return serverPort + " 該服務(wù)器上沒有存放對應(yīng)的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服務(wù)器的連接 //maxInactiveIntervalInSeconds為SpringSession的過期時間(單位:秒) @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800) public class SessionConfig { // 冒號后的值為沒有配置文件時,制動裝載的默認(rèn)值 @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; } }
初始化:
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
控制臺:
補(bǔ)充:
Spring Boot 整合redis:
原文鏈接:https://www.cnblogs.com/toov5/p/9903017.html
相關(guān)推薦
- 2022-05-18 React?Hook之使用Effect?Hook的方法_React
- 2022-10-12 sql中exists的基本用法示例_MsSql
- 2022-05-24 Asp.net?core?使用SignalR推送消息過程詳解_實用技巧
- 2022-04-17 Failed to bind properties under spring.servlet.mul
- 2022-12-29 基于R語言時間序列的平穩(wěn)時間序列模型預(yù)測圖文詳解_R語言
- 2022-06-18 C#如何實現(xiàn)dataGridView動態(tài)綁定數(shù)據(jù)_C#教程
- 2022-04-01 SQL?Server?數(shù)據(jù)庫的設(shè)計詳解_MsSql
- 2022-05-13 Android水波紋效果
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支