Java sessionID 一直变化的解决方案「建议收藏」

Java sessionID 一直变化的解决方案「建议收藏」最近在开发一个项目,测试的人员给我说IOS的登录不上去,由于我和他不是一起的,不能面对面的调试,我就自己找问题喽。没成想正让我找到了。问题一:使用IE浏览器访问的时候sessionID一直变化,其他的浏览器没问题。找了半天原因,发现IE登录的时候路径一样的会自动缓存数据,压根就不进你的后台,直接就是没登录,sessionID一直变化也是正常的,这个问题在参数后面加个时间戳就解决了。…

大家好,又见面了,我是你们的朋友全栈君。

最近在开发一个项目,测试的人员给我说IOS的登录不上去,由于我和他不是一起的,不能面对面的调试,我就自己找问题喽。

没成想正让我找到了。

问题一:

使用IE浏览器访问的时候sessionID一直变化,其他的浏览器没问题。

找了半天原因,发现IE登录的时候路径一样的会自动缓存数据,压根就不进你的后台,直接就是没登录,sessionID一直变化也是正常的,这个问题在参数后面加个时间戳就解决了。

问题二:

我以为IOS也是这个问题,后来让测试的去测,发现不是这个问题,IOS能正常登录进入后台,但是登录成功后再访问就是未登录,也就是说不是这个问题。

我又继续找问题,我就每次访问后台打印sessionID,结果坑爹的事情出现了,任何浏览器都访问不上,每次sessionID都在变化,把我给急的,代码恢复问题还是没有解决,我勒个擦。

最后我把打印给去掉了,然后就好了??????

后来查了一下资料,发现sessionID每次调用 request.getSession() session都会变,然后因为用了Shiro的框架,它里面的sessionID因为外部的session发生变化自身的也会发生变化,然后自然就认为你没登录喽。

总结

当然我遇到的问题就这两个,都给我解决了,也算是一种经验吧,感觉我这两个问题有点扯,特别是第二个哈,但是怕有人遇到和我一样的问题结果还找不到原因白白浪费时间,所以也写上了,咱不要面子搞了一个这么脑残的问题还写出来了,浪费了我几个小时的时间,引以为戒啊。

说到这,IOS端的问题还是没有解决啊!!!!

所以请求哪位大佬有没有遇到相似的问题,求助!!!!!

 

2020-08-29更新

问题解决之后一直没怎么关注了,现在分享解决方案。

1.后台登录后主动返回生成的sessionID给前端。

2.前端存储,每次请求的时候带上,我是放在请求头中。

3.后台修改shiro获取sessionId的方式,不从cookies中拿,从header中拿。

前端代码怎么处理的都可以,就不分享了,主要是后端

1.继承 DefaultWebSessionManager,实现自定义TOKEN获取方式

public class StatelessSessionManager extends DefaultWebSessionManager {
    /**
     * 这个是服务端要返回给客户端,
     */
    public final static String TOKEN_NAME = "TOKEN";
    /**
     * 这个是客户端请求给服务端带的header
     */
    public final static String HEADER_TOKEN_NAME = "token";
    public final static Logger LOG = LoggerFactory.getLogger(StatelessSessionManager.class);
    private static final String REFERENCED_SESSION_ID_SOURCE = "Stateless request";

    /**
     * 重写getSessionId,分析请求头中的指定参数,做用户凭证sessionId
     */
    @Override
    protected Serializable getSessionId(ServletRequest request, ServletResponse response) {
        String id = WebUtils.toHttp(request).getHeader(HEADER_TOKEN_NAME);
        //System.out.println("id:"+id);
        if (StringUtils.isEmpty(id)) {
            //如果没有携带id参数则按照父类的方式在cookie进行获取
            //  System.out.println("super:"+super.getSessionId(request, response));
            return super.getSessionId(request, response);
        } else {
            //如果请求头中有 authToken 则其值为sessionId
            request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, REFERENCED_SESSION_ID_SOURCE);
            request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, id);
            request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);
            return id;
        }
    }
}

2.接管shiro的SessionManage,在配置shiro的java类中加入如下代码

    /**
     * shiro session的管理
     */
    @Bean
    public DefaultWebSessionManager sessionManager() {
        StatelessSessionManager sessionManager = new StatelessSessionManager();
        sessionManager.setGlobalSessionTimeout(tomcatTimeout * 1000);
        sessionManager.setSessionDAO(sessionDAO());
        Collection<SessionListener> listeners = new ArrayList<SessionListener>();
        listeners.add(new BDSessionListener());
        sessionManager.setSessionListeners(listeners);
        return sessionManager;
    }

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160440.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • xshell的安装和使用_Xshell是什么

    xshell的安装和使用_Xshell是什么安装参考该链接安装家庭免费版,现在刚开始用,还不知道这个版本能不能满足我们日常的需求,等到后面使用一段时间再来更新!连接linuxwindows下使用xshell连接linux错误:Couldnotconnectto‘172.18.0.1’(port22):Connectionfailed首先我们需要安装sshsudoapt-getinstallsshsudoapt-getinstallopenssh-server每个人出现这个问题的原因都不太一样,要去排查自己

    2022年9月3日
    1
  • 如何设置电信光猫?图解手把手教你(超级详细)「建议收藏」

    如何设置电信光猫?图解手把手教你(超级详细)「建议收藏」自从电信升级成光纤之后,光猫经常有点小问题的,如果电信说帮你设置好漫天要价的话,求人还不如求自己,或者电信送的光猫坏了,买他们的超贵,自己买一个又好又便宜的自己设置就的了注意:2016年以后,电信为

    2022年8月3日
    3
  • java实现快速排序图解_快速排序图文详解

    java实现快速排序图解_快速排序图文详解快速排序快速排序法介绍图解代码理解快速排序法介绍快速排序(QuickSort)是对冒泡排序的一种改进,基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。图解代码理解publicclassQuickSort{//从小到大排序publicvoidquickSort(intleft,intright,

    2022年10月21日
    0
  • ubuntu(乌班图)常用命令大全

    安装完系统后,除了需要会用常用命令,各种软件也需要,关于Ubuntu系统常用软件安装我建立一个分类,用来记录菜鸟揪心的安装历程。。。Ubuntu16.04系统安装系列:Ubuntu配置TensorFlow—GPU版本Ubuntu系统安装搜狗输入法Ubuntu系统安装SMPlayer播放器Ubuntu系统安…

    2022年4月8日
    94
  • mysql的innodb与myisam(oracle主键和唯一索引的区别)

    InnoDB和MyISAM是很多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,5.7之后就不一样了1、事务和外键InnoDB具有事务,支持4个事务隔离级别,回滚,崩溃修复能力和多版本并发的事务安全,包括ACID。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索…

    2022年4月14日
    70
  • mysql 多行转一列_mysql行转列(多行转一列)

    mysql 多行转一列_mysql行转列(多行转一列)场景比如说一个订单对应多条数据,当状态(status)=1的时候,数量(num)=25,当状态(status)=2的时候,数量(num)=45,现在想用一条sql记录下不同状态对应的数量为多少,如下图所示:期待结果->sql语句示例SELECTtrades_id,MAX(CASEWHENapply_status=1THENpay_changeELSE0END)’nu…

    2022年5月24日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号