同一Tomcat不同项目如何实现session共享【面试+工作】

同一Tomcat不同项目如何实现session共享【面试+工作】

需求: 现A、B两个项目,运行于同一tomcat下,要求在A项目下登录后,B项目中同样获取登录权限,支持同一用户重复登录。

分析: 即要实现A、B项目的session共享。 如何共享?

  • A项目session创建后、B项目则不创建新的session;
  • B项目能实时获取A项目的session;
  • 需要有一块共用空间保存A项目的session。

思路:

  • A项目中进行session管理,即所有的登录操作均在A中进行;
  • 使用cookie传递session信息给客户端,避免创建多个session;
  • 维护共用空间中的session的生命周期。

技术支持:

  • 每一个web应用程序都有唯一一个ServletContext实例对象,被该web应用下面的每一个servlet共享。tomcat支持不同项目的ServletContext实例共享,如此就可以让ServletContext对象充当储存session的公共空间,而不需要序列化或数据库存储,从而节约资源;
  • 服务器一般采用session机制实现登录,当通过getSession()获取session后服务端会将此session的id作为JSESSIONID值保存在cookie中返回给客户端,客户端通过JSESSIONID来与服务器的session匹配来找到唯一的用户。sessioon保存于服务端,cookie保存于客户端。当用户于A项目登录后我们需要创建一个全局的cookie记录A项目的session id,以便在访问B项目时获取全局cookie的session id来找到A项目中对应的session,从而完成session共享。

实现: 1.不同项目ServletContext共享

修改tomcat的service.xml文件

此处为了简便

  • BudgetSystem充当A项目
  • mate充当B项目

其中项目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共享

而当跨服务器环境时,则需要对session进行序列化存储,可以保存到数据库或其他的地方,进行统一管理,原理与此类似。

  • 长时间登录方案

1.最简便的就是修改session的生命周期,虽然会浪费一些资源,但处理大多数情况是足够了;

2.优化方案就将session token化,将口令存储于cookie中,根据口令获取用户登录权限。需要注意的是token的一些加密及防窃取设置

原文发布于微信公众号 - Java帮帮(javahelp)

原文发表时间:2018-04-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Laoqi's Linux运维专列

告警监控系统开发

4005
来自专栏大数据实战演练

ambari-web/admin 前端二次开发

ambari-web可以单独编译,用来修改ambari UI页面。采用ember.js(版本: v1.0.pre)作为前端MVC框架和NodeJS相关工具,用h...

2711
来自专栏xiaoheike

Elasticsearch Network Settings

Elasticsearch 缺省情况下是绑定 localhost。对于本地开发服务是足够的(如果你在相同机子上启动多个节点,它还可以形成一个集群),但是你需要配...

1392
来自专栏编程

R基础——数据的导入与导出(下)

前面两篇文章介绍了导入导出csv文件,txt文件,xlsx文件,接下来,将介绍R连接数据库,从数据库中导入数据。 在我工作中,使用的是sql server,所以...

2258
来自专栏PHP实战技术

在PHP中,cookie和session的使用

cookie简介 Cookie是存储在客户端浏览器中的数据,我们通过Cookie来跟踪与存储用户数据。一般情况下,Cookie通过HTTP headers从服务...

3607
来自专栏finleyMa

一个比较扯淡的跨域问题

2018-08-27更新: 使用cookie前强烈建议先看下MDN的这篇基础文章 创建cookie可以配置的选项 Expires,Secure,HttpOn...

1702
来自专栏一个爱吃西瓜的程序员

Web前端基础【4】--HTTP标准

HTTP协议(超文本传输协议),是用于从www服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,减少网络传输。 一:HTTP请求过程 HTTP协议...

3857
来自专栏风中追风

一次URL输入域名按下回车到底发生了什么?

1、 浏览器的url输入栏发起一个请求,浏览器首先会看自己缓存中有没有对应的ip地址,如果有的话

3566
来自专栏云计算教程系列

如何在Nbuntu 18.04上将Nginx Web Root移动到新位置

在Ubuntu上,Nginx Web服务器将其文档存储在/var/www/html中,该文档通常位于其余具有操作系统部分的根文件系统上。但有时,将文档根移动到另...

570
来自专栏Java后端生活

JavaWeb(九)Cookie

1897

扫码关注云+社区