V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
choice4
V2EX  ›  Java

微信授权登录丢失 session

  •  
  •   choice4 · 2018-04-07 22:54:07 +08:00 · 6347 次点击
    这是一个创建于 2456 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在想将用户登录时的 openId 获取到,然后放到 session 中(其他地方用的比较多,一直要验证 openId),但是微信的授权登录时候,访问回调地址时 request 和自己登录前的 request 不在同一个 session 中 如果拿到 openId 后就把 openId 放到 session 中,以后用户在 session 中拿这个 openId 是拿不到的(空指针),打印过两个 session 的 sessionId 确实是不一样,现在解决就是搞了个静态 map,来将用户发起第一次请求时的 session 保存在 map 中,然后保存 openId 时,去这个 map 中拿 session,但是这样的话,当多用户操作到这个 map。。。不敢想象,,问下大家有没有什么解决思路,,学生小项目,redis 做缓存有点过分了。。guava 怎么样,,或者说大哥们还有更好的方法,csdn 搜到了一个帖子跟我这个问题一模一样。。解决思路都一样。。不过回答区好多 redis..问下大哥们有没有这方面的经验

    12 条回复    2018-04-09 23:08:27 +08:00
    choice4
        1
    choice4  
    OP
       2018-04-07 23:16:00 +08:00
    又想一个,在回调后把 openId 放到 cookie 里 下一个接口拿到这个 cookie 再把 cookie 的值放回 session 怎么样。。明天测试。。大哥们也给点意见。。
    liuzhedash
        2
    liuzhedash  
       2018-04-07 23:21:05 +08:00
    听起来这似乎是单点登录相关的问题,可以参考:
    https://www.cnblogs.com/ywlaker/p/6113927.html
    zhantss
        3
    zhantss  
       2018-04-07 23:22:02 +08:00
    学生小项目,guava 就行,设置个若干个单位的 LRU 缓存,存储放数据库就可以
    zhantss
        4
    zhantss  
       2018-04-07 23:22:49 +08:00
    guava 只是缓存实现,和存储无关,想放哪就放哪
    torbrowserbridge
        5
    torbrowserbridge  
       2018-04-07 23:23:31 +08:00 via Android
    访问回调地址时 request 和自己登录前的 request 不在同一个 session 中 。

    这句不对吧。
    paicha
        6
    paicha  
       2018-04-07 23:34:19 +08:00
    JWT 了解一下
    choice4
        7
    choice4  
    OP
       2018-04-08 08:07:14 +08:00 via Android
    @torbrowserbridge 嗯。。这个怎么表达呢,想着就是应该去请求了微信的 web 服务器,他那边保存的会话跟我这 tomcat 的不是同一个会话,我的 openid 应该是保存在微信回调时候那边的 session 里了,但是在我这拿不到那个 session
    choice4
        8
    choice4  
    OP
       2018-04-08 08:07:38 +08:00 via Android
    多谢大哥们。。
    Sypher
        9
    Sypher  
       2018-04-08 09:11:22 +08:00
    以前用过。可以分析一下几个请求是不是同源,要想 session 一致,就不要跨域,比如 java 后台,设置 cookie.setPath("/"),response.addCookie(cookie),可以使得请求再次发起时用的同一个 sessionId。
    仅供参考
    choice4
        10
    choice4  
    OP
       2018-04-08 09:30:13 +08:00
    @Sypher 没明白所得啥,直接用的 servlet, 一个 servlet 就是负责一个授权登录(此时的 request.getSession().getId() = 1(假设)),重定向到微信给的授权登录 url 后(这个 url 中有一个参数还是一个 url(这个就是回调的了)),然后应该是微信方吧去请求那个回调(这块又是一个 servlet,此时的 doGet 或者 doPost 方法参数的 request.getSession().getId() == 2(反正就是不一个 session 了。。)),大哥你说的这个是在 cookie 中存什么?SessionId ?
    honeycomb
        11
    honeycomb  
       2018-04-08 12:56:19 +08:00 via Android
    @choice4 缓存也可以用 caffeine (相当于 guava cache 的一个改进版),还可以直接搭 spring 全家桶
    zeayes
        12
    zeayes  
       2018-04-09 23:08:27 +08:00
    对称加密存 cookie
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1186 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 18:12 · PVG 02:12 · LAX 10:12 · JFK 13:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.