cookie机制

关于cookie和seesion的联系

cookie中会包含那些信息

名字,值,过期时间,路径,域

cookie会带到http请求头中发送给服务端

如果cookie没有设置过期时间的话,那么cookie的默认生命周期是浏览器的会话

session机制

1,session是容器对象,客户端在请求服务端的时候,服务端会根据客户端的请求判断是否包含了jsessionId的标识

2,如果已经包含了,说明客户端之前已经创建了会话。sessionId是一个唯一的值

3,如果sessionid不存在,那么服务端为这个客户端生成一个sessionid. JESSIONID

session       cookie 存储的是JSESSIONID

session存储在服务器端  cookie存储在浏览器端

服务器端(Tomcat) 会生成一个唯一的sessionId号存储在cookie中 叫 jessionid

在服务器端(tomcat)中存储serssion 使用concurrentMap (ConcurrentMap   key JSESSIONID  values session)

浏览器端下次请求服务器端是将jsessionId带过来 找到对应的session 获取session中存储的信息(用户信息)

客户端浏 览器禁用了cookie怎么办?

[如果客户端浏 览器禁用了cookie,一般会通过URL重写的方式来进行会 话会话嗯个总,也就是在url中携带sessionid]

解决session跨域共享问题

1.  session sticky  :会话保存在单机上  保证会话请求落在同一台服务器上

    采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列 表不变时,它每次都会映射到同一台后端服务器进行访问

根据获取客户端的IP地址,通过哈希函数计算得到的一个 数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希 法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问

这种实现方式会有些问题:  如果一台web服务器宕机或者重启,那么这台机器上保 存的会话数据都会丢失,会造成用户暂时无法访问的问 题,或者用户之前的授权操作需要再执行一次

2. session replication:session 复制  每一台服务器上都保持一份相同的session (造成额外的存储开销和网络开销)

session复制,通过相关技术实现session复制,使得集群 中的各个服务器相互保存各自节点存储的 session 数据。 tomcat本身就可以实现session复制的功能,基于IP组播 放方式。

这种实现方式的问题:

1. 同步session数据会造成网络开销,随着集群规模越大, 同步session带来的带宽影响也越大

2. 每个节点需要保存集群中所有节点的 session 数据,就 需要比较大的内存来存储。

3. session 集中存储  :存储在db、 存储在缓存服务器 (redis)

使用 spring-session -data-redis

http://www.glmapper.com/

4. 基于cookie (主流)

a)

access_token(userid/token/timestamp(过期时间)   加密)  

将access_token存储在客户端的cookie中 每次 客户端过来访问 服务器端拦截其中 获取cookie中的access_token 根据 userid和timestamp(过期时间) 判断是否有效

b)基于JWT的解决方案

json web Token  客户端和服务端信息安全传递,身份认证的一种解决方案。用在登陆上

jwt由三个组成:header,payload 载荷,signature

header{

typ:"jwt" //类型

alg:"HS256" //加密算法

zip: "gzip/deflate"  //压缩算法   加密之后的字符串 比较长的时候 可以使用压缩算法

}

payload  :jwt本身规范提供的格式 claims

iss:“签发者”

iat:“签发时间”

exp:“过期时间”

sub:

可以自己定一些claims,放入自定义的信息如 uid 等

signature: 将 header+ payload 组合成为一个字符串

Base64(header).Base64(payload)  +  head中定义的算法 +密钥  生成一个字符串    str.签名字符串  就是 JWT的token

<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt --><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.3.0</version></dependency><!-- https://mvnrepository.com/artifact/joda-time/joda-time --><dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId><version>2.9.9</version></dependency>

/*** @Auther: tengxiao* @Date: 2018/9/13 16:47* @Description:*/
public class JWTTokenUtil {private static final String JWT_KEY_USER_ID="JWT_KEY_USER_ID";private static final int EXPIRED_TIME=6000;private static final String SECRET_KEY="tengvincent_user";public static String generatorToken(Long userId)throws Exception{//header MapMap<String,Object> headerMap=new HashMap<>();headerMap.put("typ","JWT");headerMap.put("alg","HS256");String token=JWT.create().withHeader(headerMap).withClaim("iss","Service")//签发者.withClaim("aud","APP").withClaim(JWT_KEY_USER_ID,userId).withIssuedAt(DateTime.now().toDate())//sign time.withExpiresAt(DateTime.now().plusMinutes(EXPIRED_TIME).toDate())//expired time.sign(Algorithm.HMAC256(SECRET_KEY));return token;}public static Map<String,Claim> varifyToken(String token){DecodedJWT jwt=null;try{JWTVerifier verifer= JWT.require(Algorithm.HMAC256(SECRET_KEY)).build();jwt=verifer.verify(token);}catch (Exception e){// e.printStackTrace();// token 校验失败, 抛出Token验证非法异常}return jwt.getClaims();}public static Long getTokenInfo(String token){Map<String, Claim> claims = varifyToken(token);Claim user_id_claim = claims.get("user_id");if (null == user_id_claim || StringUtils.isEmpty(user_id_claim.asString())) {// token 校验失败, 抛出Token验证非法异常}return Long.valueOf(user_id_claim.asString());}}

1.token+redis与jwt的区别

(1)简单的说,token只是一个标识,以token加redis为例,服务端将token保存在redis中,客服端访问时带上token,如果在redis中能够查到这个token,说明身份有效。

(2)jwt不需要查库,本身已经包含了用户的相关信息,可以直接通过服务端解析出相关的信息,与session,token的最大区别就是服务端不保存任何信息(服务端只需要保存密钥key)。

2.如何实现jwt续期

在jwt中保存过期时间,解析时进行判定,如果即将超时则重新设置过期时间返回一个新的jwt给客户端。

3.jwt登出失效

登出时将相关的信息比如用户名存储在redis中,并设置过期时间。当再次访问时,从jwt中解析出用户名去redis中查找,如果存在则表示此jwt已登出失效。这里需要注意的是,如果用此方法,则验证jwt是否登出应该放在第一位。思考一个场景,如果redis中存储的是用户名,那么当用户登出后,redis中已经有了相应的用户名,当用户再次登录时,解析jwt发现此用户已登出,则jwt失效,所以在登录时要清空相关的登出缓存。

参考文档

jwt demo 代码: https://github.com/tengxvincent/spring-boot-vincent/tree/master/vincent-jwt

https://www.cnblogs.com/mantoudev/p/8994341.html

https://bbs.huaweicloud.com/blogs/06607ea7b53211e7b8317ca23e93a891

https://blog.csdn.net/w57685321/article/details/79463837

Session跨域及单点登录解决方案相关推荐

  1. 深入理解跨域SSO单点登录原理与技术

    文章目录 1 SSO体系结构 1.1 SSO 1.2 体系结构 1.3 Token(令牌) 1.4 同域SSO原理分析 token的生成 token过期移除 认证流程 1.5 跨域SSO原理分析 分析 ...

  2. 完全跨域的单点登录(SSO)解决方案源码解析

    为什么80%的码农都做不了架构师?>>>    本文介绍的是一种PHP的开源SSO解决方案,可完全跨域,实现较简洁,源码地址:https://github.com/legalthin ...

  3. jsonp跨域实现单点登录,跨域传递用户信息以及保存cookie注意事项

    网站A:代码:网站a的login.html页面刷新,使用jsonp方式将信息传递给b.com的login.php中去,只需要在b.com中设置一下跨域以及接收参数,然后存到cookei即可, 注意:网 ...

  4. 绝对完全跨域统一单点登录登出

    应用场景:多个系统下同属于一个用户,当用户登录了web1系统,那么访问web2,web3. . . . 时候,用户就无需再次登录.如:淘宝与天猫,登出也如此,一个系统登出,其他系统的登录也随之失效,这 ...

  5. .net 实现Cookie跨域共享,单点登录SSO

    实现原理:cookie是不能跨域访问的,但是在二级域名是可以共享cookie的 概念说明:站点1=a.devin.com   站点2=b.devin.com 实现步骤:1. 配置两个站点的webcon ...

  6. ajax请求头cookies中传递sid,跨域请求单点登录,登录成功,但是在controller中获取的cookie与浏览器中不一致,请大神指点一二。^_^...

    跨域请求js代码: $.ajax({ type:"post", async:false, contentType : "application/x-www-form-ur ...

  7. Web应用跨域访问及单点登录解决方案汇总

    做过跨越多个网站的Ajax开发的朋友都知道,如果在A网站中,我们希望使用Ajax来获得B网站中的特定内容,如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题.Ajax的跨域访问问题是现有的Aj ...

  8. Cookie Session跨站无法共享问题(单点登录解决方案)

    单点登录 什么是单点登录,举个例子,如果你登录了msn messenger,访问hotmail邮件就不用在此登录. 一般单点登录都需要有一个独立的登录站点,一般具有独立的域名,专门的进行注册,登录,注 ...

  9. session跨域共享解决方案

    session跨域共享解决方案 参考文章: (1)session跨域共享解决方案 (2)https://www.cnblogs.com/sustudy/p/5332584.html 备忘一下.

最新文章

  1. 【Linux】 诊断工具-strace
  2. HDMI光端机是什么?hdmi光端机产品参数及性能特点介绍
  3. java图片的导出,并压缩
  4. 图论 —— 生成树 —— 生成树计数 —— 基尔霍夫矩阵
  5. 超赞!3行代码可视化Transformer
  6. oracle mysql 透明网关_如何在Oracle中建立透明网关
  7. MyEclipse快捷键两篇文章
  8. RESTful Request:GET/PUT/DELETE/POST/HEAD/OPTIONS
  9. 11.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- 自定义插件
  10. pdms二次开发入门 c#语言
  11. 物流行业GPS定位应用解决方案
  12. 项目管理中的配置管理
  13. vncview用法_vnc远程桌面怎么使用(最新vncviewer使用教程)
  14. 【开源代码】-基于国民N32G45x系列MCU使用JLINK的RTT Viewer/logger/Client组件工具
  15. Android麦克风探测器
  16. UDF函数maven工程出现:Missing artifact javax.jdo:jdo2-api:jar:2.3-ec或xsi:schemaLocation=http://maven.apach
  17. 基于java斗地主_码云推荐开源项目丨 用 Java 写了一个控制台玩的斗地主
  18. 什么是威胁建模及其最重要的优势?
  19. 蓝桥 星期一 JAVA
  20. 计算机屏幕显示故障,led显示屏的十大常见故障及其解决方法

热门文章

  1. 【noip2016普及】魔法阵
  2. 用python做一个简易的狼人杀
  3. 论文润色 ‖ 论文前言怎么写?
  4. linux fsck ntfs,fsck找不到 fsck.ntfs
  5. 微信怎么开店?和淘宝开店一样吗?
  6. vue 图片裁剪工具_使用Vue.js的图片裁剪工具,包括预览
  7. DataTables Editor 2.0.4 Crack
  8. Hybrid APP 混合开发模式的选择之路(三)
  9. 滴滴+Uber的想法
  10. 【附源码】Java计算机毕业设计窗户管理系统(程序+LW+部署)