现在想将用户登录时的 openId 获取到,然后放到 session 中(其他地方用的比较多,一直要验证 openId),但是微信的授权登录时候,访问回调地址时 request 和自己登录前的 request 不在同一个 session 中 如果拿到 openId 后就把 openId 放到 session 中,以后用户在 session 中拿这个 openId 是拿不到的(空指针),打印过两个 session 的 sessionId 确实是不一样,现在解决就是搞了个静态 map,来将用户发起第一次请求时的 session 保存在 map 中,然后保存 openId 时,去这个 map 中拿 session,但是这样的话,当多用户操作到这个 map。。。不敢想象,,问下大家有没有什么解决思路,,学生小项目,redis 做缓存有点过分了。。guava 怎么样,,或者说大哥们还有更好的方法,csdn 搜到了一个帖子跟我这个问题一模一样。。解决思路都一样。。不过回答区好多 redis..问下大哥们有没有这方面的经验
1
choice4 OP 又想一个,在回调后把 openId 放到 cookie 里 下一个接口拿到这个 cookie 再把 cookie 的值放回 session 怎么样。。明天测试。。大哥们也给点意见。。
|
2
liuzhedash 2018-04-07 23:21:05 +08:00
听起来这似乎是单点登录相关的问题,可以参考:
https://www.cnblogs.com/ywlaker/p/6113927.html |
3
zhantss 2018-04-07 23:22:02 +08:00
学生小项目,guava 就行,设置个若干个单位的 LRU 缓存,存储放数据库就可以
|
4
zhantss 2018-04-07 23:22:49 +08:00
guava 只是缓存实现,和存储无关,想放哪就放哪
|
5
torbrowserbridge 2018-04-07 23:23:31 +08:00 via Android
访问回调地址时 request 和自己登录前的 request 不在同一个 session 中 。
这句不对吧。 |
6
paicha 2018-04-07 23:34:19 +08:00
JWT 了解一下
|
7
choice4 OP @torbrowserbridge 嗯。。这个怎么表达呢,想着就是应该去请求了微信的 web 服务器,他那边保存的会话跟我这 tomcat 的不是同一个会话,我的 openid 应该是保存在微信回调时候那边的 session 里了,但是在我这拿不到那个 session
|
8
choice4 OP 多谢大哥们。。
|
9
Sypher 2018-04-08 09:11:22 +08:00
以前用过。可以分析一下几个请求是不是同源,要想 session 一致,就不要跨域,比如 java 后台,设置 cookie.setPath("/"),response.addCookie(cookie),可以使得请求再次发起时用的同一个 sessionId。
仅供参考 |
10
choice4 OP @Sypher 没明白所得啥,直接用的 servlet, 一个 servlet 就是负责一个授权登录(此时的 request.getSession().getId() = 1(假设)),重定向到微信给的授权登录 url 后(这个 url 中有一个参数还是一个 url(这个就是回调的了)),然后应该是微信方吧去请求那个回调(这块又是一个 servlet,此时的 doGet 或者 doPost 方法参数的 request.getSession().getId() == 2(反正就是不一个 session 了。。)),大哥你说的这个是在 cookie 中存什么?SessionId ?
|
11
honeycomb 2018-04-08 12:56:19 +08:00 via Android
@choice4 缓存也可以用 caffeine (相当于 guava cache 的一个改进版),还可以直接搭 spring 全家桶
|
12
zeayes 2018-04-09 23:08:27 +08:00
对称加密存 cookie
|