解决任何跨域访问请求session丢失问题
跨域请求的场景有很多种,多模块项目之间端口号不同,前后端分离之间的请求,jsonp远程接口的调用,iframe的嵌套等等。 导致session丢失的原因也有很多,大致有spring security、shiro等安全框架的拦截,自定义
跨域请求的场景有很多种,多模块项目之间端口号不同,前后端分离之间的请求,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问题,需要自行根据项目内容进行排查。
更多推荐
所有评论(0)