同一Tomcat不同项目如何实现session共享【面试+工作】
需求: 现A、B两个项目,运行于同一tomcat下,要求在A项目下登录后,B项目中同样获取登录权限,支持同一用户重复登录。
分析: 即要实现A、B项目的session共享。 如何共享?
思路:
技术支持:
实现: 1.不同项目ServletContext共享
修改tomcat的service.xml文件
此处为了简便
其中项目mate配置了crossContext=”true”属性,即代表可在此项目中可调用另一个WEB应用的ServletContext对象
2.管理A项目session的生命周期
web.xml配置session监听器
复制一份session存进内存中,手动来管理session的生命周期
3.A项目中进行登录,并保存信息进session
在项目A中获取session,并存入一些测试属性,当并将此session id以键值对形式存入cookie中,创建一个作用域全局的cookie(1.此处使用其他key均可,使用JSESSIONID是为了访问B项目后在访问A项目getSession时不需要重新创建session,节省资源,2.设置全局是为了跨项目也能访问到)
4.重写项目B中获取session的方法,使其不自动创建,而是使用A项目的session
获取A项目中的session集合,通过全局的cookie中的session id即可找到A中对应的session
5.项目B中获取session,操作其中属性
6.查看结果
A调用完成后客户端会存在2个cookie,一个自动创建,一个人创建
访问B项目时即可携带全局的cookie
查看打印结果:
调用A项目
调用B项目
再调用A项目
由上可以看出,调用A,A创建了session,并存入属性值。B中获取到A的session,并获取属性值,修改属性值;再次调用A,A取得上一次的session,并获取修改后的属性。不同项目实现了共享session。
1.依此类推,假如有多个项目,可将session的管理均存放与一个项目中,其他项目只是变向的去获取此项目中的session,便于维护与管理;
2.此种情况下,可以简化操作,避免了session的序列化,使用更简便;
3.此方案遵从servlet的运行机制,极大的依赖session与cookie对应关系,所以cookie中存储的信息就尤为重要,为防止JSESSIONID泄露而绕过登录,需要采取一些安全措施,最好是使用https进行加密。
而当跨服务器环境时,则需要对session进行序列化存储,可以保存到数据库或其他的地方,进行统一管理,原理与此类似。
1.最简便的就是修改session的生命周期,虽然会浪费一些资源,但处理大多数情况是足够了;
2.优化方案就将session token化,将口令存储于cookie中,根据口令获取用户登录权限。需要注意的是token的一些加密及防窃取设置