我们在开发中由于项目大的原因,经常要把项目分为几个不同的子栏目,然后分别放在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的值
不同应用sesion共享
猜你喜欢
转载自buhuilayun.iteye.com/blog/1715424
今日推荐
周排行