跨域请求的场景有很多种,多模块项目之间端口号不同,前后端分离之间的请求,jsonp远程接口的调用,iframe的嵌套等等。
       导致session丢失的原因也有很多,大致有spring security、shiro等安全框架的拦截,自定义过滤器的拦截、不同浏览器内核版本的限制,服务器的配置等等,首先要确认自己遇到这个问题是什么原因导致的,再去做相应的解决方案,一般为加注解,加配置bean,改配置文件等方法。这里提出一种不易发现的问题,而导致session丢失。

问题提出

       在springboot多模块项目中,A项目有一个页面用iframe的方式嵌套了B项目中的一个页面,发现嵌套后,A项目session丢失,需要重新登录;或者A项目调用了B项目的一个接口,两个项目端口号不同,发现调用失败,token为空。

发生原因

打开浏览器的检查,点击application,查看session与cookies,发现默认session的名称为JSESSIONID,这样两个不同端口的请求或页面,他们的session名重复了,这时候需要我们自己定义session名称,保证跨域请求或引用的页面,他们的session名称不同,否则会重名,导致session丢失
在这里插入图片描述
在这里插入图片描述

问题解决

加上一个配置bean即可,指定你的session名称

@Bean
    public ServletContextInitializer servletContextInitializer() {
        return new ServletContextInitializer() {
            @Override
            public void onStartup(ServletContext servletContext) throws ServletException {
                servletContext.getSessionCookieConfig().setName("你自己定义的session名称");
            }
        };
    }

这只是其中一种问题的解决方法,比较难以发现,如不是此问题导致的session问题,需要自行根据项目内容进行排查。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐