如何实现多个WEB 应用共享一个 HTTPSession

billwindows 2008-10-21 04:39:06
我要实现 两个 WEB 应用系统,A 系统 为权限系统,B系统为A 系统的子系统,在B系统为了进行权限的验证,需要从A 系统中取出session对象,获取信息进行验证。
在网上看了下 有篇文章写的很好,给了一些思路,但我怎么试都没试出来,希望老竹子大哥给个详尽的代码解决此问题撒
文章地址 : http://hua6884858.javaeye.com/blog/191469

注: 以前的一个系统使用 cookie 将 sessionid 保存在cookie 中在通过重写 url 来保证不丢失sessionid ,但sessionid 存在了数据库里,时间上已经不允许这么做了,最好能用 ServletContext 搞定,我这边环境是 Weblogic81,屡试就是不对,按照那篇文章里的 第七节 日的


附上我的代码 :
A 应用 :

request.getSession().setAttribute(Constants.Login_User_Key, user);
ServletContext context = request.getSession().getServletContext();
context.setAttribute("appA", request.getSession());
B 应用 :
HttpSession sessionb = req.getSession();
ServletContext contextb = sessionb.getServletContext();
ServletContext contextA = contextb.getContext(req.getContextPath());
System.out.println(" contextA = " + contextA);
HttpSession sessionA = (HttpSession)contextA.getAttribute("/appA");
我在 A应用中打印的 context 对象如下 :
context = ServletContext(id=40599548,name=marm,context-path=/marm)
B应用中打印的 context 对象如下 :
contextA = ServletContext(id=37190216,name=report,context-path=/report)
我怀疑 contextb.getContext 那里的 url 写错了,如果写错了应该写什么呢?
...全文
393 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
billwindows 2008-10-23
  • 打赏
  • 举报
回复
嘎嘎,那块都调通了,原因是如果在 过滤器里 跳转了 就不应该在执行 doFilter()了,直接return 即可,但虽然可以互相通信了,可是一个应用中只有一个 ServletContext对象,这个ServletContext对象是不能解决并发问题的,当然一个哥们想到了一个好办法,那就是在 B 应用中设置 ServletContext的属性为Map,然后在map里存放n个用户登陆的 VO信息,这样就不会有问题了 ,key 直接用 ip,而且不用每次遍历 Map ,超级高效,嘎嘎! 有时间我会写在博客里的,欢迎大家捧场撒~oo~
Fachorovic 2008-10-22
  • 打赏
  • 举报
回复
学习叻
billwindows 2008-10-22
  • 打赏
  • 举报
回复
我日,正常跑的业务都实现了,为什么还报这种异常,无语! 路过的牛人看下为什么啊!!!


java.lang.IllegalStateException: cannot resize buffer, 303 bytes have been written (Servlet 2.3,
sec. 5.1)
at weblogic.servlet.internal.ServletResponseImpl.setBufferSize(I)V(ServletResponseImpl.j
ava:219)
at weblogic.servlet.jsp.PageContextImpl.initialize(Ljavax.servlet.Servlet;Ljavax.servlet
.ServletRequest;Ljavax.servlet.ServletResponse;Ljava.lang.String;ZIZ)V(PageContextImpl.java:65)
at weblogic.servlet.jsp.PageContextImpl.<init>(Ljavax.servlet.jsp.JspFactory;Ljavax.serv
let.Servlet;Ljavax.servlet.ServletRequest;Ljavax.servlet.ServletResponse;Ljava.lang.String;ZIZ)V
(PageContextImpl.java:104)
at weblogic.servlet.jsp.JspFactoryImpl.getPageContext(Ljavax.servlet.Servlet;Ljavax.serv
let.ServletRequest;Ljavax.servlet.ServletResponse;Ljava.lang.String;ZIZ)Ljavax.servlet.jsp.PageC
ontext;(JspFactoryImpl.java:37)
at jsp_servlet.__index._jspService(Ljavax.servlet.http.HttpServletRequest;Ljavax.servlet
.http.HttpServletResponse;)V(__index.java:104)
at weblogic.servlet.jsp.JspBase.service(Ljavax.servlet.ServletRequest;Ljavax.servlet.Ser
vletResponse;)V(JspBase.java:33)
at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run()Ljava.lang.Obj
ect;(ServletStubImpl.java:996)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(Ljavax.servlet.ServletRequest
;Ljavax.servlet.ServletResponse;Lweblogic.servlet.internal.FilterChainImpl;)V(ServletStubImpl.ja
va:419)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(Ljavax.servlet.ServletRequest
;Ljavax.servlet.ServletResponse;Lweblogic.servlet.internal.FilterChainImpl;)V(ServletStubImpl.ja
va:463)
at weblogic.servlet.internal.TailFilter.doFilter(Ljavax.servlet.ServletRequest;Ljavax.se
rvlet.ServletResponse;Ljavax.servlet.FilterChain;)V(TailFilter.java:28)
at weblogic.servlet.internal.FilterChainImpl.doFilter(Ljavax.servlet.ServletRequest;Ljav
ax.servlet.ServletResponse;)V(FilterChainImpl.java:27)
at com.aspire.cem.marm.common.filter.ClientSessionCallbackFilter.doFilter(Ljavax.servlet
.ServletRequest;Ljavax.servlet.ServletResponse;Ljavax.servlet.FilterChain;)V(ClientSessionCallba
ckFilter.java:133)
at weblogic.servlet.internal.FilterChainImpl.doFilter(Ljavax.servlet.ServletRequest;Ljav
ax.servlet.ServletResponse;)V(FilterChainImpl.java:27)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run()Ljava.lan
g.Object;(WebAppServletContext.java:6458)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(Lweblogic.security.subject.A
bstractSubject;Ljava.security.PrivilegedAction;)Ljava.lang.Object;(AuthenticatedSubject.java:321
)
at weblogic.security.service.SecurityManager.runAs(Lweblogic.security.acl.internal.Authe
nticatedSubject;Lweblogic.security.acl.internal.AuthenticatedSubject;Ljava.security.PrivilegedAc
tion;)Ljava.lang.Object;(SecurityManager.java:118)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(Lweblogic.servlet.intern
al.ServletRequestImpl;Lweblogic.servlet.internal.ServletResponseImpl;)V(WebAppServletContext.jav
a:3661)
at weblogic.servlet.internal.ServletRequestImpl.execute(Lweblogic.kernel.ExecuteThread;)
V(ServletRequestImpl.java:2630)
at weblogic.kernel.ExecuteThread.execute(Lweblogic.kernel.ExecuteRequest;)V(ExecuteThrea
d.java:219)
at weblogic.kernel.ExecuteThread.run()V(ExecuteThread.java:178)
at java.lang.Thread.startThreadFromVM(Ljava.lang.Thread;)V(Unknown Source)
2008-10-22 10:03:30 [com.aspire.cem.marm.common.filter.ClientSessionCallbackFilter]-[ERROR] erro
r in sessionfilter
java.lang.IllegalStateException: cannot resize buffer, 303 bytes have been written (Servlet 2.3,
sec. 5.1)
at weblogic.servlet.internal.ServletResponseImpl.setBufferSize(I)V(ServletResponseImpl.j
ava:219)
at weblogic.servlet.jsp.PageContextImpl.initialize(Ljavax.servlet.Servlet;Ljavax.servlet
.ServletRequest;Ljavax.servlet.ServletResponse;Ljava.lang.String;ZIZ)V(PageContextImpl.java:65)
at weblogic.servlet.jsp.PageContextImpl.<init>(Ljavax.servlet.jsp.JspFactory;Ljavax.serv
let.Servlet;Ljavax.servlet.ServletRequest;Ljavax.servlet.ServletResponse;Ljava.lang.String;ZIZ)V
(PageContextImpl.java:104)
at weblogic.servlet.jsp.JspFactoryImpl.getPageContext(Ljavax.servlet.Servlet;Ljavax.serv
let.ServletRequest;Ljavax.servlet.ServletResponse;Ljava.lang.String;ZIZ)Ljavax.servlet.jsp.PageC
ontext;(JspFactoryImpl.java:37)
at jsp_servlet.__index._jspService(Ljavax.servlet.http.HttpServletRequest;Ljavax.servlet
.http.HttpServletResponse;)V(__index.java:104)
at weblogic.servlet.jsp.JspBase.service(Ljavax.servlet.ServletRequest;Ljavax.servlet.Ser
vletResponse;)V(JspBase.java:33)
at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run()Ljava.lang.Obj
ect;(ServletStubImpl.java:996)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(Ljavax.servlet.ServletRequest
;Ljavax.servlet.ServletResponse;Lweblogic.servlet.internal.FilterChainImpl;)V(ServletStubImpl.ja
va:419)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(Ljavax.servlet.ServletRequest
;Ljavax.servlet.ServletResponse;Lweblogic.servlet.internal.FilterChainImpl;)V(ServletStubImpl.ja
va:463)
at weblogic.servlet.internal.TailFilter.doFilter(Ljavax.servlet.ServletRequest;Ljavax.se
rvlet.ServletResponse;Ljavax.servlet.FilterChain;)V(TailFilter.java:28)
at weblogic.servlet.internal.FilterChainImpl.doFilter(Ljavax.servlet.ServletRequest;Ljav
ax.servlet.ServletResponse;)V(FilterChainImpl.java:27)
at com.aspire.cem.marm.common.filter.ClientSessionCallbackFilter.doFilter(Ljavax.servlet
.ServletRequest;Ljavax.servlet.ServletResponse;Ljavax.servlet.FilterChain;)V(ClientSessionCallba
ckFilter.java:133)
at weblogic.servlet.internal.FilterChainImpl.doFilter(Ljavax.servlet.ServletRequest;Ljav
ax.servlet.ServletResponse;)V(FilterChainImpl.java:27)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run()Ljava.lan
g.Object;(WebAppServletContext.java:6458)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(Lweblogic.security.subject.A
bstractSubject;Ljava.security.PrivilegedAction;)Ljava.lang.Object;(AuthenticatedSubject.java:321
)
at weblogic.security.service.SecurityManager.runAs(Lweblogic.security.acl.internal.Authe
nticatedSubject;Lweblogic.security.acl.internal.AuthenticatedSubject;Ljava.security.PrivilegedAc
tion;)Ljava.lang.Object;(SecurityManager.java:118)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(Lweblogic.servlet.intern
al.ServletRequestImpl;Lweblogic.servlet.internal.ServletResponseImpl;)V(WebAppServletContext.jav
a:3661)
at weblogic.servlet.internal.ServletRequestImpl.execute(Lweblogic.kernel.ExecuteThread;)
V(ServletRequestImpl.java:2630)
at weblogic.kernel.ExecuteThread.execute(Lweblogic.kernel.ExecuteRequest;)V(ExecuteThrea
d.java:219)
at weblogic.kernel.ExecuteThread.run()V(ExecuteThread.java:178)
at java.lang.Thread.startThreadFromVM(Ljava.lang.Thread;)V(Unknown Source)

billwindows 2008-10-22
  • 打赏
  • 举报
回复
挖哈哈,用 ServletContext 的调通了。
实现如下: 我在 A应用的 Action 中写了如下代码 :
request.getSession().setAttribute(Constants.Login_User_Key, user);
ServletContext context = request.getSession().getServletContext();
context.setAttribute("marmSession", request.getSession());

B应用中的过滤器 的 doFilter() 方法中写了如下代码:

public class ClientSessionCallbackFilter implements Filter {
static Log logger = LogFactory.getLog(com.aspire.cem.marm.common.filter.ClientSessionCallbackFilter.class);
private static String login_page = "/login.jsp";
private static String loginSuccessPage = "/home.jsp";
private static String login_action = "/login.do";
private static ReadPropertiesFile rpf = new ReadPropertiesFile();
private String encoding;
private Set sessionExecludeSet;
private Set permExcludeSet;

public ClientSessionCallbackFilter() {
sessionExecludeSet = new HashSet();
permExcludeSet = new HashSet();
encoding = "GBK";
}

public void init(FilterConfig config)
throws ServletException
{
String temp = config.getInitParameter("encoding");
if(temp != null)
encoding = temp;
String excludeFile = config.getInitParameter("exclude_file");
if(excludeFile != null)
{
Element root = null;
try
{
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(config.getServletContext().getResource(excludeFile));
root = doc.getRootElement();
Element element = root.getChild("session_exclude_urls");
if(element != null)
{
List urls = element.getChildren("url");
for(int i = 0; urls != null && i < urls.size(); i++)
{
Element url = (Element)urls.get(i);
sessionExecludeSet.add(url.getTextTrim());

}

}
element = root.getChild("perm_exclude_urls");
if(element != null)
{
List urls = element.getChildren("url");
for(int i = 0; urls != null && i < urls.size(); i++)
{
Element url = (Element)urls.get(i);
permExcludeSet.add(url.getTextTrim());
}

}
}
catch(Exception e)
{
// logger.error("\u521D\u59CB\u5316RightCheckFilter\u51FA\u9519", e);
e.printStackTrace();
throw new ServletException("\u521D\u59CB\u5316RightCheckFilter\u51FA\u9519", e);
}
}
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterchain) throws java.io.IOException,
javax.servlet.ServletException {
try {
String targetURL = rpf.getCallbackDomain() + login_page;
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
String uri = req.getServletPath();
if(uri.endsWith(login_page) || uri.endsWith(login_action))
{
filterchain.doFilter(request,response);
return;
}
HttpSession sessionb = req.getSession();
ServletContext contextb = sessionb.getServletContext();
ServletContext contextA = contextb.getContext("/marm");
HttpSession sessionA = (HttpSession)contextA.getAttribute("marmSession");
if(sessionA != null) {
UserVO uvo = (UserVO)sessionA.getAttribute("userinfo");
if(uvo == null){
targetURL = rpf.getCallbackDomain() + login_page;
redirect(req,resp,targetURL);
}
if(req.getRequestURL().indexOf("report/index.jsp")!= -1) {
targetURL = rpf.getCallbackDomain() + loginSuccessPage;
redirect(req,resp,targetURL);
}
filterchain.doFilter(request,response);
return;
} else {
targetURL = rpf.getCallbackDomain() + login_page;
redirect(req,resp,targetURL);
}
//权限校验
} catch(Exception e) {
logger.error("error in sessionfilter", e);
}
}

private void redirect(HttpServletRequest request, HttpServletResponse response, String url)
throws IOException
{
String targetURL = url + "?__URL__=" + request.getServletPath();
targetURL = response.encodeRedirectURL(targetURL);
response.sendRedirect(targetURL);
}


public void destroy()
{
sessionExecludeSet.clear();
permExcludeSet.clear();
}
}
java__king 2008-10-22
  • 打赏
  • 举报
回复
很好很强大,学习一下.
hanbb 2008-10-22
  • 打赏
  • 举报
回复
学习
billwindows 2008-10-22
  • 打赏
  • 举报
回复
竹子大哥,这么做原则上讲是可以,但如果客户端/服务器禁用cookie咋办,那不就game over 了么,用cookie 是没错,为了防止禁用cookie ,可以使用重写url 的方法来吧 服务器为客户端分发的 唯一session 传回给服务器,服务器通过管理 sessionid 来管理客户端就没问题了。
老紫竹 2008-10-21
  • 打赏
  • 举报
回复
l_wenb 2008-10-21
  • 打赏
  • 举报
回复
学习!
l_wenb 2008-10-21
  • 打赏
  • 举报
回复
学习!
billwindows 2008-10-21
  • 打赏
  • 举报
回复
to 4 楼,请看下我说的那个网站,实现方法有好多呢,可惜我一个都不会,惭愧啊
这种实现方式就是为了 做一个大项目,可以通过做n个web 应用的办法来进行 各个子系统的并行开发。
泄泻~oo~
billwindows 2008-10-21
  • 打赏
  • 举报
回复
2楼说的是个办法,但有点大材小用,而且我们现网里有n个domain里跑着呢,动公用的文件根本没可能,而且我就想搞定两个应用而已。
sunwei_07 2008-10-21
  • 打赏
  • 举报
回复
不同工程项目也可以吗?
xuhaiyang 2008-10-21
  • 打赏
  • 举报
回复
http://java.chinaitlab.com/EJB/37577.html
这有怎么设置
xuhaiyang 2008-10-21
  • 打赏
  • 举报
回复
用weblogic集群就可以共享session了
sunwei_07 2008-10-21
  • 打赏
  • 举报
回复
没搞过weblogic,帮LZ顶!

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧