单机会话管理

1.基于cookie传输的sessionId:在java tomcat容器session实现

http请求会有一个Session会话管理机制,用来标识用户会话的过程,默认使用的是springboot内嵌的httpSession的实现机制,这个tomcat协议实现是基于cookie传输sessionId的方式来完成容器的实现

比如我们使用HttpServletRequest.getSession().getAttribute(telephone,otpCode);去存储用户获取验证码时手机和验证码对应信息,以使得用户在注册的方法可以从界面上拿到的otpCode和Session中otpCode的比较。

还有在用户登录的模块中,我们将登录凭证加入到session中:this.httpServletRequest.getSession().setAtteibute("IS_LOGIN",true);
this.httpServletRequest.getSession().setAtteibute("LOGIN_USER",userModel);

然后我们在用需要用到用户登录状态的业务方法中,会先判断当前用户对应的session中是否是login的,并且将LOGIN_USER获取到用户信息,完成对应用户的操作:

这个JSESSIONID就是 tomcat返回的内置cookie的标识,在tomcat内就是用来获取用户的session。因此客户端在每次发送到对应域名下的请求都会在RequestHeaderCookie里面带上JSESSIONID。

2.基于token传输类似sessionId:java代码session实现

基于token传输用java代码实现是因为移动端APP客户可能会禁止掉cookie。

分布式会话管理

对于以上两种方案在分布式环境内都不可以生效,因为单体的会话管理都是基于tomcat的内存去实现的。每台服务器都是互相分开的,一旦nginx映射到另一台机器上,session信息就不会存在了。所以就需要分布式会话管理机制。

redis是一个集中式的缓存中间件,可以把它认为是Nosql的KV数据库。在分布式会话场景上面,我们无需开启持久化磁盘的功能,只需要它内存数据库存放缓存功能即可。

1.基于cookie传输sessionid:java tomcat容器session实现迁移到redis

导入pom坐标:

第二个包的作用就是redis管理session对象。

<!--    springboot对Redis的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
<!--    spring对session的管理存在redis里面--><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId><version>2.0.5.RELEASE</version></dependency>

配置application文件:

#配置springboot对redis的依赖
spring.redis.host=线上redis服务器ip地址
spring.redis.port=6379
spring.redis.database=10
#spring.redis.password=#设置jedis连接池
#最大连接数量
spring.redis.jedis.pool.max-active=50
#最小idle连接
spring.redis.jedis.pool.min-idle=20

注意:

1.redis默认序列化方式是jdk方式,存入redis的类需要实现序列化,或者修改redis的序列化方式。

2.需要把redis部署在不和项目服务器冲突的服务器上,不然nginx没法映射

3.修改redis的配置文件:bind在redis线上服务器ip 然后指定一下:src/redis-server ./redis.conf

2.基于token传输类似sessionid:java代码session实现迁移到redis

    //用户登录接口@RequestMapping(value = "/login", method = {RequestMethod.POST}, consumes = {CONTENT_TYPE_FORMED})@ResponseBodypublic CommonReturnType login(@RequestParam(name="telephone") String telephone,@RequestParam(name = "password") String password) throws BusinessException, UnsupportedEncodingException, NoSuchAlgorithmException {//入参校验if(org.apache.commons.lang3.StringUtils.isEmpty(telephone) || StringUtils.isEmpty(password)){throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR);}//用户登录服务,就是检验用户登录是否合法UserModel userModel = userService.validateLogin(telephone, EncodeByMds(password));//将登录凭证加入到用户登录成功的session内//修改成若用户登录验证成功后将对应的登录信息和登录凭证一起存入redis中//生成登录凭证token,UUIDString uuidToken = UUID.randomUUID().toString();uuidToken = uuidToken.replace("-", "");//建立token和用户登录态之间的联系redisTemplate.opsForValue().set(uuidToken,userModel);  //只要有uuid,用户登录态就存在redisTemplate.expire(uuidToken,1, TimeUnit.HOURS);//下发tokenreturn CommonReturnType.create(uuidToken);}
    //封装下单请求@RequestMapping(value = "/createorder",method = {RequestMethod.POST},consumes = {CONTENT_TYPE_FORMED})@ResponseBodypublic CommonReturnType createOrder(@RequestParam(name="itemId")Integer itemId,@RequestParam(name = "promoId",required = false) Integer promoId,@RequestParam(name = "amount")Integer amount) throws BusinessException {String token = httpServletRequest.getParameterMap().get("token")[0];  //也可以从参数中获取if(StringUtils.isEmpty(token)){throw new BusinessException(EmBusinessError.USER_NOT_LOGIN,"用户还未登录,不能下单");}//获取用户登录信息UserModel userModel = (UserModel)redisTemplate.opsForValue().get(token);if(userModel == null){  //以过期throw new BusinessException(EmBusinessError.USER_NOT_LOGIN,"用户还未登录,不能下单");}OrderModel order = orderService.createOrder(userModel.getId(), itemId,promoId, amount);return CommonReturnType.create(order);}

分布式会话存储策略

分布式会话持久性管理:

不要redis降低处理到mysql中存储用户登录信息,一旦有高并发redis抗不住,关系型数据库一定也扛不住。所以还是要redis调优。

会话有效期时间:Tomcat默认为30min不与服务端发生交互的呆滞时间。

会话续命管理:触发操作延长声明周期,延长到30min,而不是加30min。

安全性问题:

1.url query string,get请求参数内(不安全)

2.自定义header内(不安全)

3.用安全传输的https:将http的明文字符流转用加密的方式换成数据流传输到服务端。但是发送请求时打开调试窗口仍可以看见请求格式,就可以模拟请求攻击。

4.自定义协议:使用app来进行输,app没有办法进行线上调试内在执行,只能通过wireshark等网络抓包工具去抓取http发出去的请求,这时候自定义协议就产生了效果,我们可以自己定义协议去传输报文,这样我们的请求就像https一样无法解析。

强登录态与弱登录态:

强登录态:需要登录操作才能做的行为

无需登录:只浏览公共页面

弱登录态:千人千面的智能推荐

弱登录态的续命能力:1.请求续命,2.keepalive续命

SSO单点登录:

同域名:都是www域名,则对应SSO是同一个存储即可。

根域名相同子域名不同:设置cookie时可以指定两个参数,第一个参数httpOnly=true,处理浏览器自身,javaScript是无法访问这个cookie的,第二个参数domain=/,只要拿到cookie,在顶级域名下都可以共享。

域名都不相同:两个不同的公司合作,太复杂,需要专业架构设计。

分布式会话和基于TOKEN的分布式会话相关推荐

  1. 分布式事务模型--基于消息的分布式事务

    本文来说下分布式事务模型之基于消息的分布式事务 文章目录 概述 基于消息的分布式事务 基于事务消息的分布式事务 基于本地消息的分布式事务 特点剖析 本文小结 概述 事务是一组不可分组的操作集合,这些操 ...

  2. 分布式认证方案-基于token的认证方式

    基于token的认证方式,服务端不用存储认证数据,易维护扩展性强, 客户端可以把token 存在任意地方,并且可以实现web和app统一认证机制.其缺点也很明显,token由于自包含信息,因此一般数据 ...

  3. php使用redis分布式锁,php基于redis的分布式锁实例详解

    在使用分布式锁进行互斥资源访问时候,我们很多方案是采用redis的实现. 固然,redis的单节点锁在极端情况也是有问题的,假设你的业务允许偶尔的失效,使用单节点的redis锁方案就足够了,简单而且效 ...

  4. Mysql学习总结(83)——常用的几种分布式锁:ZK分布式锁、Redis分布式锁、数据库分布式锁、基于JDK的分布式锁方案对比总结

    一.基于数据库实现分布式锁 1.1.悲观锁 利用select - where - for update 排他锁.注意: 其他附加功能与实现一基本一致,这里需要注意的是"where name= ...

  5. 分布式计算机联锁系统,基于MAS的分布式计算机联锁系统研究

    基于MAS的分布式计算机联锁系统研究 第29卷 第1期2010年2月 文章编号:1001 4373(2010)01 0021 04 兰州交通大学学报 JournalofLanzhouJiaotongU ...

  6. python分布式存储系统_基于Python的分布式文件共享系统的实现

    基于 Python 的分布式文件共享系统的实现 朱亚林 ; [期刊名称] <智能计算机与应用> [年 ( 卷 ), 期] 2015(005)004 [摘要] 大数据时代 , 信息的分享与传 ...

  7. etcd 笔记(08)— 基于 etcd 实现分布式锁

    1. 为什么需要分布式锁? 在分布式环境下,数据一致性问题一直是个难点.分布式与单机环境最大的不同在于它不是多线程而是多进程.由于多线程可以共享堆内存,因此可以简单地采取内存作为标记存储位置.而多进程 ...

  8. 基于Consul的分布式锁实现

    我们在构建分布式系统的时候,经常需要控制对共享资源的互斥访问.这个时候我们就涉及到分布式锁(也称为全局锁)的实现,基于目前的各种工具,我们已经有了大量的实现方式,比如:基于Redis的实现.基于Zoo ...

  9. 如何实现分布式 java_Redis中是如何实现分布式锁的?

    分布式锁常见的三种实现方式: 数据库乐观锁: 基于Redis的分布式锁: 基于ZooKeeper的分布式锁. 本地面试考点是,你对Redis使用熟悉吗?Redis中是如何实现分布式锁的. 要点 Red ...

最新文章

  1. 大多数人对AI的理解,都是错的
  2. 手机号 imsi tmsi_抓取网站访客手机号
  3. 【BZOJ3997】[TJOI2015]组合数学 最长反链
  4. Git篇——Git使用教程
  5. 聊聊JvmGcMetrics的managementExtensionsPresent
  6. 39 网络相关函数(七)——live555源码阅读(四)网络
  7. mysql5.7.14安装版_MySql5.7.14安装教程详解(解压版)_MySQL
  8. 收藏 | 从SGD到NadaMax,深度学习十种优化算法原理及实现
  9. 当集合a为空集时a的取值范围_1.2 集合间的基本关系20202021学年高一数学新教材配套学案(人教A版必修第一册)...
  10. python module
  11. java并发编程(3)避免活跃性危险
  12. 命令注入的一点学习记录
  13. 单片机74LS138扩展中断
  14. 战胜25名医生:AI真能成为医疗界的“擂主”?
  15. ESP32C3 CORE+PIO+lvgl显示
  16. 微信个人赞赏码怎么用?微信赞赏码使用教程详解
  17. 2016预测哪些公司增值最猛?
  18. win7系统电脑蓝屏怎么解决,如何解决win7电脑蓝屏
  19. 上海亚商投顾:沪指缩量跌0.43%
  20. HOJ 1276 士兵队列训练问题(stl, 水题)

热门文章

  1. 反手来个K8S入门到跑路
  2. matlab虚线缺一截,Matlab如何将有缺口的圆补足
  3. 微信小程序设置padding-right和margin-right无效
  4. 生成二维码,并且打印
  5. 什么情景下应当考虑使用JMS(Java Message Service )技术
  6. Oracle与PL/SQL是什么关系
  7. 切入AIGC新赛道,「炎黄盈动」发布国内首个AI低代码平台
  8. 浪潮云:以数据云IBP释放数据要素力量
  9. 数组的下标为什么从0开始
  10. 为什么数组的下标从 0 开始?