不同应用sesion共享

我们在开发中由于项目大的原因,经常要把项目分为几个不同的子栏目,然后分别放在tomcat的webapps分别分配不同的子域名,此处不涉及到tomcat的集群,比如

Wp.java.com

Wangpeng.java.com

我们在这几个项目中要共享session的信息,因为在一个项目中登录后,点击链接在别的项目中登录的信息也是应该看到的。实现步骤:

1,在tomcat下server.xml中项目中配置以下

<Context path="" docBase="E:/work/java/WebRoot" reloadable="true" debug="0" crossContext="true"></Context>

<Context path="/wp.java.cn" docBase="E:/work/wp.java.cn/WebRoot" debug="0" reloadable="true" crossContext="true"></Context>

注意要设置crossContext="true",这样可以共享ServletContext的内存。我们就是根据共享ServletContext内存来实现session的共享。

2,在登录中的程序是:

session.setAttribute("ubiId", ubi.getId());

ServletContext context = session.getServletContext().getContext("/");

HashMap s_map = (HashMap) context.getAttribute("session_MAP");

String session_id = session.getId();

if(s_map == null) {

s_map = new HashMap();

}

s_map.put(session_id, session);

Cookie cookie = new Cookie("sessionId", session.getId());

//设为负值,在浏览器内存中保存,关闭浏览器,cookie失效

cookie.setMaxAge(-1);

cookie.setPath("/");

context.setAttribute("session_MAP", s_map);

response.addCookie(cookie);

每一个会话都有一个唯一的session,但是在tomcat下只有一个唯一的ServletContext,所以我们要把每一个session放到HashMap 下,然后在利用cookie技术把记录session唯一的id存到浏览器的内存中。切忌不要把session对象直接放到ServletContext中,这样总是保存最后一次登录的session的信息,以上的信息会被覆盖。

3,在另一个项目中取到session的值

ServletContext context = session.getServletContext().getContext("/");

String get_sessionId = "";

String cookieName = "sessionId";

Cookie[] cookies = request.getCookies();

int len = cookies.length;

for(int i=0; i<len; i++) {

Cookie cookie = cookies[i];

String c_name = cookie.getName();

if(c_name.equals(cookieName)) {

get_sessionId = cookie.getValue();

out.println("开始项目的sessionId:" + get_sessionId + "<br/>");

out.println("现在项目的sessionId:" + session.getId() + "<br/>");

}

}

HashMap s_map =  (HashMap)context.getAttribute("session_MAP");

if(s_map == null) {

System.out.println("session_MAP is null");

s_map = new HashMap();

} else {

System.out.println("session_MAP is not null");

}

HttpSession session_f = (HttpSession)s_map.get(get_sessionId);

out.println("开始项目的session:" + session_f.getAttribute("ubiId") + "<br/>");





反之也采用同样的方法,这样就可以共享session的值

猜你喜欢

转载自buhuilayun.iteye.com/blog/1715424
今日推荐