Spring Session

认证授权问题概览

眉间皱痕 提交于 2020-03-18 09:56:59
某厂面试归来,发现自己落伍了!>>> 相信很多人对认证授权方面都不是特别了解,搞不清Session认证、JWT以及 Cookie 这些概念。所以,我根据日常对这部分学习已经在项目中的实际运用总结了这8 个相关的问题并且附上了详细的回答 所有问题如下,开始看答案之前不妨自己测验一下自己究竟能回答几个: 认证 (Authentication) 和授权 (Authorization)的区别是什么? 什么是Cookie ? Cookie的作用是什么?如何在服务端使用 Cookie ? Cookie 和 Session 有什么区别?如何使用Session进行身份验证? 如果没有Cookie的话Session还能用吗? 为什么Cookie 无法防止CSRF攻击,而token可以? 什么是 Token?什么是 JWT?如何基于Token进行身份验证? 什么是OAuth 2.0? 什么是 SSO? 1. 认证 (Authentication) 和授权 (Authorization)的区别是什么? 首先先从读音上来认识这两个名词,很多人都会把它俩的读音搞混,所以我建议你先先去查一查这两个单词到底该怎么读,他们的具体含义是什么。 说简单点就是: 认证 (Authentication): 你是谁。 授权 (Authorization): 你有权限干什么。 稍微正式点(啰嗦点)的说法就是:

spring session connect factory异常

天大地大妈咪最大 提交于 2020-03-11 11:48:49
spring boot ,spring data redis , spring session redis 整合时,redis connectFactory配置异常,并且无法从文档中获得有效信息,RedisConnectionFactory 不论是Spring data redis 还是spring session redis 都应当是自动装配,两边都整合时表现如下: 如果不手动声明 @bean RedisConnectionFactory,无法启动项目,并没有异常抛出。 声明RedisConnectionFactory,走的是默认的localhost配置,不是根据yml装配,需要手动填写连接配置。 其实这个问题想解决简单,只需要手动声明RedisConnectionFactory并且手动从yml读取配置,但是明明可以自动装配为何要多此一步,导致这个问题的原因是什么呢?如何不声明RedisConnectionFactory解决?前面已经提到了,官方文档中无法获取有效的帮助,短时间内也不可能去研究spring data 和spring session自动装配原理,只能变着花样在google搜索,当然这种问题指望中文描述来搜索是不可能的,最终 查到解决方案如下: https://stackoverflow.com/questions/51915100/springboot-redis

基础图解之分布式服务部署请求流程

你。 提交于 2020-02-28 18:52:00
今天,深层次和群里同学讨论关于分布式系统问题 汇总如下: 单体应用,分布式部署:保存会话信息(spring-session) 客户端cookies + 服务端 redis = 用户信息 单机应用中,HttpSession是通过Servlet容器创建和管理的,servlet容器一旦停止服务,那么session也随之消失;但如果session被保存到redis中,只要redis服务没停且session在有效期间内,那么servlet容器停止服务了,session还是存在的,这有什么好处了,好处就是servlet容器出现闪停闪修复的情况,用户就不用重新登录了。 使用redis存储用户会话信息,客户端web请求每次携带cookies,在拦截器中,获取通过cookies获取redis中用户信息 集群部署时(3台服务器部署3个tomcat, 其中tomcat部署同一个项目) ,其session是无法共享的, 可以使用 spring-session 共享session ; 分布式应用:保存会话信息(sso单点登录) sso登录 分布式系统部署时, 多服务器, session是无法共享的,这是公认的, 同时顶级域名下, 不同服务,前端请求是无法跨域获取cookie的,要想实现效果, 参考使用 sso登录 模式; 逻辑: 抽离登录业务逻辑为公共服务,统一验证是否登录未登录,反馈cookies等参数;

使用postman测试接口,解决Session共享问题

女生的网名这么多〃 提交于 2020-02-27 12:32:55
问题: 在做登录模块时,使用Postman做接口测试,发现session不能共享问题:第一次请求将系统随机生成验证码放入Session中,第二次请求想要获取系统生成的验证码,但是取到的值为null,因此无法判断登录条件是否满足。 问题发现与解决: 验证码信息: { "status" : 200 , "msg" : "发送成功" , "data" : "810661" } 登录接口,登录时发现验证码不正确, 两次获取的sessionid不一致,导致在登录时候,没有获取session中的验证码! ,第二次接口访问从session获取的验证码的值是null,因此返回验证码不正确: 最后也就是将这个问题归咎于 验证码的获取与验证,在AController里面获取生成验证码,放到session,如何在BController里面获取? 也就是我们常件的spring如何共享controller里面的session问题! SessionSetController @RestController public class SessionSetController { @GetMapping ( value = "/set" ) public String setSessionAttribute (HttpSession session){ String uuid = UUID. randomUUID

Spring Session跨域

喜欢而已 提交于 2019-12-05 15:39:22
1. 思路   在传统的单服务架构中,一般来说,只有一个服务器,那么不存在 Session 共享问题,但是在分布式/集群项目中,Session 共享则是一个必须面对的问题:      在如上架构中,客户端发起一个请求,这个请求到达 Nginx 上之后,被 Nginx 转发到 Tomcat A 上,然后在 Tomcat A 上往 Session 中保存了一份数据,下次又来一个请求,这个请求被转发到 Tomcat B 上,此时再去 Session 中获取数据,发现没有之前的数据。对于这一类问题的解决,思路很简单,就是将各个服务之间需要共享的数据,保存到一个公共的地方(主流方案就是 Redis):      当所有 Tomcat 需要往 Session 中写数据时,都往 Redis 中写,当所有 Tomcat 需要读数据时,都从 Redis 中读。这样,不同的服务就可以使用相同的 Session 数据。   若手动往 Redis 中存储、读取数据,相当于使用一些 Redis 客户端工具来实现这样的功能,工作量太大。   简化的方案就是使用 Spring Session 来实现这一功能:Spring Session 就是使用 Spring 中的代理过滤器,将所有的 Session 操作拦截下来,自动将数据同步到 Redis 中,或者自动从 Redis 中读取数据。   对于开发者来说

”万丈高楼平地起“——如何从“建筑师”角度打造【装饰者设计模式】

房东的猫 提交于 2019-12-03 19:19:44
写在前面:设计模式源于生活,而又高于生活! 什么是装饰者模式 在 不改变原有对象 的基础上 附加功能 ,相比生成子类更灵活。 装饰者模式应用场景 过滤器,网关控制,P2P分控审批 装饰者模式类图 装饰者模式定义 (1)抽象组件:定义一个抽象接口,来规范准备附加功能的类 (2)具体组件:将要被附加功能的类,实现抽象构件角色接口 (3)抽象装饰者:持有对具体构件角色的引用并定义与抽象构件角色一致的接口 (4)具体装饰:实现抽象装饰者角色,负责对具体构件添加额外功能。 装饰者代码实现 定义一个抽象的接口 /** * 定义【抽象构建角色】:GatewayComponent * GatewayComponent:相当与建筑师设计好高楼的建造目标 */ public abstract class GatewayComponent { /** * 定义共同行为的方法标准 */ public abstract void service(); } 定义被装饰角色 /** * 【网关获取基本参数】,BasicComponentGateway【被装饰的类】 * BasicComponentGateway:相当于建房子的【地基】 */ public class BasicComponentGateway extends GatewayComponent { public void service() {

便宜有便宜的办法-小微企业云上的springboot集群方案2.1:redis的消息订阅和session过期机制

这一生的挚爱 提交于 2019-12-01 19:00:28
1、session在redis里面的存储结构2 在 上一章 讲spring session存储到redis的时候,在redis里面看到每一个session存储都会生成三条记录,记录格式如下: 这就很麻烦了,为啥不能一一对应,做彼此的天使呢,搞的一对三,很影响风化啊。到底是道德的沦丧还是人性的扭曲,让我们走进redis,看下具体的数据内容: 第一个k-v存储这个Session的id,是一个Set类型的Redis数据结构。这个key中的最后的1570550340000值是一个时间戳,根据这个Session过期时刻滚动至下一分钟而计算得出。里面的值是这样的 第二个k-v用来表示Session在Redis中的过期,是个String类型,这个k-v不存储任何有用数据,只是表示Session过期而设置。这个key在Redis中的过期时间即为Session的过期时间间隔 第三个k-v用来存储Session的详细信息,是hash类型,包括Session的创建时间、过期时间间隔、最近的访问时间、attributes等等。这个k的过期时间为Session的最大过期时间 + 5分钟。如果默认的最大过期时间为30分钟,则这个k的过期时间为35分钟 说到这里,会有个灵魂的拷问,就一个session的存储,为啥要搞三条记录?这里要提一下HttpSession的接口规范了。 session虽然也是一条数据

Simple Session 源码分析

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-01 07:32:57
摘要: 分布式Session的实现有很多,从简单到复杂各种各样,但是要做到分布式Session跟原生本地Session一致的API,对开发人员几乎是0门槛是不容易的。SpringSession 提供了现成的分布式Session功能,本文就是介绍SpringSession的实现细节 1. 概要 本文介绍SpringSession的主要功能的实现原理。在看源码的同时参照SpringSession开了一个“简化”版的Session框架--SimpleSession,简单好用,功能刚好够用,由于删除了很多SpringSession种用不到的功能,源码上可读性更好和自定义开发更容易。 2. 替代本地原生Session的秘密 几乎所有的方案都类似,使用 Filter 把请求拦截掉然后包装 Request 和 Response 使得 Request.getSession 返回的 Session 也是包装过的,改变了原有 Session 的行为,譬如存储属性值是把属性值存储在 **Redis** 中,这样就实现了`分布式Session`了。 SpringSession 使用 SessionRepositoryFilter 这个过滤器来实现上面所说的。 SimpleSession 使用 SimpleSessionFilter 来实现。 2.1 SessionRepositoryFilter

nginx 解决session一致性

╄→尐↘猪︶ㄣ 提交于 2019-11-30 19:01:50
session 粘滞性 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 upstream backserver { ip_hash; server 192.168.0.14:88; server 192.168.0.15:80; } 但是有缺点,这存在单点风险,倘若我已经在192.168.0.14:88端口登录后,过段时间发现14服务器挂了(session时间未过期),那么这时候会访问到15服务器,那这时候需要重新登录,因为在拿14服务器上的JsessionId去15服务器请求发现不存在。 2、session 复制 可以通过tomcat的server.xml文件进行配置,这样每个tomcat都会同步对应的session,那么此时即使某个tomcat被宕机了,也不影响服务。 具体的tomcat可以参见如下 , tomcat 官网对应的tomcat集群配置 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false"