美文网首页
同一个tomcat 部署多个项目的session 共享问题

同一个tomcat 部署多个项目的session 共享问题

作者: 唠嗑爱钓鱼 | 来源:发表于2018-04-08 11:53 被阅读0次

问题描述:

         在同一个tomcat下部署两个以上的 web项目,同事要实现这个项目的中的session信息资源共享的问题,但是在同一个tomcat 中的其他的项目创建的session信息,另一个项目中是无法访问到的,

    session 共享的解决的思路:

1,找一个公共的地方作为存放数据的地方(类似redis 当做一个远程的session库,这个多用于多个tomcat 的分布式的)

2,将存储的信息防到数据中保存起来,用数据作为交互,但是这个是有弊端的,因为多次和数据库的交互影响效率)

3,用tomcat  在server.xml 配置 ,,这个配置主要用于小的项目,同时的项目并发来不是太大

现在设置一下tomcat 中的设置

解决方案:

1、修改tomcat的server.xml文件

每一个web应用程序都有唯一一个ServletContext实例对象,被该web应用下面的每一个servlet共享。通过修改tomcat的server.xml,使不同web应用的ServletContext可以互相访问。然后,用ServletContext的setAttribute()方法把session存入ServletContext中,在另一个web程序就可以用getAttribute()方法取得传递过来的session。

server.xml文件修改如下:

[java] view plain copy

  

 //WebappA为项目名,crossContext="true"是关键  

crossContext属性的意思是:如果设置为true,你可以通过ServletContext.getContext() 调用另外一个WEB应用程序,获得ServletContext 然后再调用其getAttribute() 得到你要的对象

java代码如下:

WebappA:

[java] view plain copy

HttpSession session = request.getSession();  

session.setAttribute("userId", "test");  

ServletContext ContextA =session .getServletContext();  

ContextA.setAttribute("session", session );  

WebappB:

[java] view plain copy

HttpSession sessionB = request.getSession();    

ServletContext ContextB = sessionB.getServletContext();    

ServletContext ContextA= ContextB.getContext("/WebappA");// 这里面传递的是 WebappA的虚拟路径  

HttpSession sessionA =(HttpSession)ContextA.getAttribute("session");  

System.out.println("userId: "+sessionA.getAttribute("userId"));  

2、用数据库存放session数据

将session数据存入数据库,不同web程序读取数据库数据即可。这样做的好处是实现简单,缺点是每次请求都要读写一次数据库,加大了系统开销。

3、用cookie代替session

cookie是存放在本地硬盘上的文件,适合用于存放小量数据,且可以通过cookie.setPath(“/”)方法设置cookie为同一tomcat下的所有webapp共享。cookie.setPath(“/”)方法的参数”/”表示tomcat的webapps文件夹下的所有应用共享该cookie。

java代码

写cookie:

[java] view plain copy

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式  

Cookie cookie =new Cookie("loginTime",df.format(new Date()));  

cookie.setPath("/"); //Tomcat的webapps目录下共享  

context.getHttpResponse().addCookie(cookie);  

读cookie:

[java] view plain copy

Cookie[] cookies = context.getHttpRequest().getCookies();  

for(Cookie c :cookies ){  

if(c.getName().equals("loginTime")){  

System.out.println("loginTime: " + c.getValue());  

            }  

        }  

相关文章

网友评论

      本文标题:同一个tomcat 部署多个项目的session 共享问题

      本文链接:https://www.haomeiwen.com/subject/ziyphftx.html