一个统一登录的项目。
登录模块部署在了xxx.xxx.xxx.xx的8001端口下
需要对接的项目部署在了xxx.xxx.xxx.yy的8080端口下
在8001项目中,账号验证通过后,生成了一个ticket,存到了session中。
在8080项目中,写了拦截器,拦截请求,判断是否有session,有的话,跳过登录,没有的话,进入登录页。
问题:
在8001模块确认已生成ticket并写入session中
但是在8080模块的拦截器中无法获取session值
不同IP能否处理一下,让session共享
8081登录成功之后,你是如何回跳到8080端口的
去8001端口时,访问链接拼接了返回地址参数,在登录时访问链接 xxx.xxx.xxx.xx:8001/checkLogin?service=http://xxx.xxx.xxx.yy:8080/aaa/bbb,同时还会携带用户名和密码,如果是登录状态,则直接/aaa/bbb对应的页面
@代码羡: 如果是登录状态的话,你是通过redirect方式跳转到对应页面的吗
@编程小大白: 是的
@代码羡: 使用redirect方式的时候,一般会把令牌拼接到redirect_url后面把,类似redirect_url?ticket=xxx
@编程小大白: 是的,但是现在比如说有两个系统A、B,都对接了8001登录模块,在A系统上登录了,获取了ticket,也生成了session,A和B的session没有同步的话,那我在B上面,如何能能拿到ticket呢?A、B、登录模块在三台服务器上。
@代码羡: 我们之前的做法是在登录服务器,也就是你们这边的8001模块存储ticket,A或者B发送登录请求时,8001校验有无登录信息,有则redirect到指定页面并携带ticket,无则登录。
@编程小大白:
我们这边,比如A、B两个系统都是必须登录才能访问的话,在某个浏览器里面,A系统登录成功之后,如果进入B系统的话,这时肯定是不需要再进入登录页的对吧。
也就是说,B发送请求的时候要进行拦截,然后去【登录模块】验证此时的登录状态。
【登录模块】提供能我们的验证方式就是B在访问的时候,携带在A系统登录时生成的ticket。
那这个ticket是【登录模块】写在session中的,B、A、【登录模块】都没在一个服务器上,session没有同步,B也就拿不到ticket,这样B在【登录系统】的验证中,就是一个没有ticket的请求,需要再次进入登录页面。
@代码羡: 如果是你们这种方式的话,那只能按照楼下大佬说的,用redis或其他公用存储媒介存储ticket,然后都可以读取和写入。
@编程小大白: 好的,感谢
用session是解决不了单点登陆问题. 你可以用redis存用户的token信息.然后读取同一个redis就行
不过单点登录系统不是我们做的,我们只负责跟他们的登录系统做一个对接,能改的只有 8080项目的内容,哎,实在不行,得让8001的人改了
奇怪了,两个不同的站点,session能共享吗? 除非你把session放到数据库里面
同一IP下,两个不同的端口时可以共享的,这个昨天查了好久,可以在tomcat的conf文件下,修改context.xml,在Context标签中增加sessionCookieName="mySessionName",sessionCookieName不重复的话,8080是可以拿到8001端口的session的。
然而,现在在两台服务器上
按照W3C标准,不同网站之间的session本就不应该共享。最好还是想其他办法吧
好的,感谢,我去找做登录的人聊一聊吧
8080想8001发送请求的时候,多进行一步操作,8001回调一下8080的端口,把需要的session值带到8080端口