centos中多台主机免密登录_关于单点登录(SSO)数据共享(session和redis)的那点事?...

竹韵编程 2019-10-14 17:43:41

前言
“数据共享”顾名思义就是将本身可以共同利用的数据分离出来,从而更加方便的利用,比如一般单点登录时会将用户信息存入session(多台主机无法共享)或者redis,然后在代码中通用式的调用获取用户信息等,但当我们把信息存入session后如果使用nginx负载多台主机时会出现退出系统的情况。因此需要通过redis去存储用户信息而实现共享。

f46687dc4a2f813b05f78de56d035369.png


正文
1、首先来说下session的相关概念
session本身是一个会话对象,在用户通过客户端(浏览器)向服务端发送请求时,也就是单点登录后,服务器会为当前用户的整个浏览器创建一个session会话对象,也就是服务器会将用户信息写入当前用户独占的会话中去,当点击访问其他程序时也可以使用会话中的用户信息而不丢失(关闭浏览器后会话会失效)。那么服务端是如何将session信息传递到客户端的呢?
当服务端创建session会话的对象后,会将此对象的id以cookie的方式传递给客户端(浏览器),如果用户不关闭客户端的情况下再去访问会把此id传递给服务端,此时服务端会判断当前id做出响应。那么如果客户端禁用cookie后服务端该如何传呢?
当浏览器禁用cookie后可以通过对url地址进行重写解决共享问题,具体重写也就是使用response对url重新构写
response.encodeRedirectURL(java.lang.String url) 对sendRedirect方法后的url地址进行重写。
response.encodeURL(java.lang.String url)对表单action和超链接的url地址进行重写
这两种方式:当发现如果浏览器禁用了cookie,在session会话创建后没法传递的情况会自动找到本地释放cookie的浏览器打开访问。那么session会话在那个时间创建和销毁呢?
一般来说当用户登录后session对象就创建了,此时的也是最新的session对象,默认时间一般是30分钟,也可以到web.xml中去配置响应的session会话失效时间。那么session和cookie的区别呢?
session创建的会话对象一般在服务端,而且是用户独占整个session。
cookie是缓存客户端(浏览器)的用户信息。
总结来说就是一个是客户端缓存,一个是浏览器缓存。

0ef3f7c324890b69c6182ed22d77440c.png


2、说一下单点的登录的流程

  • 首先用户第一次访问系统时,通过单点登录(SSO)进行登录系统的操作。
  • 根据用户输入的信息检查输入的信息是否有效(如果无效则提示,发生在客户端)。
  • 如果输入的验证信息都正确则会生成tocket(安全校验),并将用户对象信息进行转化(一般是json格式数据)
  • 此时会将用户信息和tocket写入session或者redis(此处涉及多台主机不共享问题,后面说)
  • 当用户登录成功后,如果是存入session则会通过cookie给客户端传递session的id,如果是存入redis则会将tocket校验信息存入cookie客户端缓存。
  • 当用户再次访问系统时可根据tocket或者session的id去访问用户数据信息。
  • 此时无论在何处单点都会去校验时候存在tocket或者session数据,如果没有则会跳转到登录界面重新登录。

6e6aee8096001d72544fa1625d636aee.png


3、实现多台主机登录共享多台主机共享存在什么问题呢?
随着互联网的发展,分布式已经被广泛应用,因此很多时候一台主机已经无法满足大用户的请求量了,那么如果减轻压力呢?此时会出现一个项目距多台主机部署的情况,然后使用nginx做负载均衡从而将用户的请求量分发处理,那么如果将用户的信息存入session出现重复提示登录的情况,也就是一直在创建会话,无法实现多台主机共享。一般出现多台主机共享问题怎么解决呢?
现在很多公司在做单点登录时(SSO)时会将用户信息直接保存在redis中,也就是前面说到的,当登录成功后会生成tocket从而根据这个随处都可以取用户信息,因此此时信息都已经存入了redis,也就不存在访问其他主机要创建session会话的问题了。如果已经存入了session后该怎么解决呢?
如果在涉及项目时将用户信息存入了session,其实可以考虑将整个session会话存入redis,然后取的时候可以直接从redis中取到session对象而得到用户信息。
也可以使用tomcat的session复制(当然如果使用的是tomcat中间件),通过配置tomcat的server.xml去实现tomcat之间的数据复制。从而实现多台主机共享还有什么可以配置更加简便的方式呢?
之前在网上看到过一个jar包spring-session-data-redis将整个包导入到项目中后,和之前配置redis的方式一样配置相关的配置文件,然后将它引入到web.xml中后就可以直接实现session存入redis,但这种方式弊端太多,如果是用户量较大的前台系统不推荐使用。
结语:关于共享问题这里是一个大概的经验总结,有不足之处大家一起讨论

5279d8f89777de22c39caae034d76193.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值