在一个应用服务器里面部署多个应用的问题。

sandyen 2005-01-30 03:38:53
现在的服务器环境是:Soloris+Websphere+DB2
现在我在Websphere部署了两个应用A和B,现在在A的一个a.jsp中通过iframe的方式引用了B中的b.jsp。
两个应用分别都有自己的用户登录,在a.jsp第一次调用b.jsp的时候,b.jsp会对用户做登录处理,也就是记住用户(保留用户的Session)。我的问题是,在用户做完登录以后,当用户通过IE工具栏中的刷新按钮刷新页面的时候。b.jsp中的用户Session将丢失。也就是用户成了未登录状态。
不知道那个大哥有什么好的方法解决。当然现在用户不让屏蔽IE的刷新功能。
...全文
248 点赞 收藏 25
写回复
25 条回复
Idora 2005年02月04日
这个 Balancer 上的程序先取到 App Server 传来的 cookieValue 和 redirectURL
这两个参数,然后设一个 Cookie,然后再转回到 redirectURL 所设定的 URL 去,
这样就可以保证 Balancer 也能访问到这个 Cookie 值了。

现在 Balancer 可以取到 App Server 所设的 Cookie 了,下次客户访问过来的
时候就先取到 Cookie 值,然后选择一个负载最少的 App Server 把请求转发过去。
转发过去的时候也是采用上面 App Server 为 Balancer 设 Cookie 的方法,
Balancer 给要转的 App Server 设一个 Cookie,这个 App Server 就可以判断
出该用户是否已登录了。



现在我们已经解决了不同的 App Server 传递登录信息的问题,下面需要处理的是
Balancer 和 App Server 之间的信息交换问题。


每个 App Server 在运行时都需要定时给 Balancer 传递一个 heart-beat,Balancer
上会有个后台线程在实时检测,如果发现那个 App Server 的 heart-beat 已经超时
就去掉它,在以后不再转用户请求过来。

具体实现方式是这样的:

Balancer 上启动一个 RMI Service thread,作为 App Server 注册 heart-beat
信息用,App Server 也会起来一个线程,专门是每隔指定的时间就访问 Balancer
上的 RMI Service 来注册自己。Balancer 会维护一个可用 App Server 的列表,
并记录转发用户请求的次数,这样就可以在下次用户请求过来的时候选择出负载
最低的 App Server 并把请求转过去。

在新起来一台 App Server 后,会立即向 Balancer 注册,这样 Balancer 就会加入
到 App Server 列表中。

在一台 App Server 当掉后,Balancer 收不到它的 heart-beat 就会把它从 App Server
列表中去掉。



这种 Cluster 实现方式是很容易理解的,也很有效,可以有效保证应用的高可用性。
回复 点赞
Idora 2005年02月04日
具体实现方法如下:

首先我们要保证 session 信息能在几台 Application Server 间传递,你的
Web 应用一般都需要用户登录,并保留登录信息在 session 里。如果用户是
在一台 Application Server 上登录的,那再访问另外一台 Application Server
的时候应该怎样判断该用户已在别的服务器上登录过了呢?

我们可以用 Cookie 解决这个问题,但 Cookie 有一个限制,就是 domain,即
你在一台服务器上设置了一个 Cookie 后,只有这台服务器才能访问到这个 Cookie,
其他服务器根本访问不到。我们必须想个办法让其他服务器也能访问到,这是我们
这个 Cluster 实现中的关键点之一。

我们可以这样解决,在一台 App Server 登录后,App Server 先设置一个 Cookie,
然后再发给客户端一个象下面这样的 JSP

<html>
<head>
</head>
<body>
<form action="http://balancer_setcookie_jsp_url" method="POST" name="frmSetCookie">
<input type="hidden" name="cookieValue" value="<%=cookieValue%>">
<input type="hidden" name="redirectURL" value="<%=redirectURL%>">
</form>
<script lnguage="JavaScript">
document.frmSetCookie.submit();
</script>
</body>
</html>

上面这段程序会立即自动提交个 balancer_setcookie_jsp_url 这个在 Balancer 上的
程序,这个程序是这样处理的:

<%
String redirectURL = request.getParameter("redirectURL");
String cookieValue = null;

cookieValue = request.getParameter("cookieValue");

if (cookieValue != null)
{
Cookie c = new Cookie("itman",cookieValue);
c.setPath("/");
response.addCookie(c);
%>
<html>
<head>
</head>
<body>
<script language="JavaScript">
document.location.href = "<%=redirectURL%>";
</script>
</body>
</html>
<%
}
else
{
if (redirectURL != null)
{
response.sendRedirect(redirectURL);
}
else
{
//error handling
}
}
%>
回复 点赞
Idora 2005年02月04日
楼主,给你篇文章看看,可能有用。有用的话给我加分哦,呵呵:)
Cluster 技术在很多重要应用中都很关键,利用 Cluster 可以保证系统的
高可用性。但往往 Cluster 在很多人眼里都是高不可攀的,认为这是非常
高端的技术。其实不然,你也可以尝试在你的应用内部实现一种相对比较
简单的 Cluster,这种方式对很多中小型的 Web 应用已经足够了。

这种应用级别的 Cluster 技术一个独特的优势就是你可以不依赖于任何
应用程序服务器,象 Tomcat, WebSphere, WebLogic 等,完全是是自己
应用内部的实现。这样可以实现在混合环境下的 Cluster,比如我们可以
利用一个 Windows 2000 下跑的 Tomcat 和 一个在 Linux 下跑的 WebSphere
组成一个 Cluster。


我们要实现的 Cluster 功能如下:

1.有三台服务器,一台做 Balancer,另外两台做 Application Server;
2.Balancer 可以根据两台 Application Server 的负载情况来分配用户请求;
3.在某台 Application Server down 掉后,Balancer 可以马上知道,并在以后
不再向这个 Application Server 转发用户请求;
4.在启动新的 Application Server 后,Balancer 也可以马上知道,并在以后
会向该 Application Server 转发用户请求;


回复 点赞
GFNotFoundException 2005年02月03日
学习中,up~
回复 点赞
gohands 2005年02月03日
up up
没这么做过!!
顶啊!!
回复 点赞
eshiqi 2005年02月03日
up 俺不懂啊
回复 点赞
sandyen 2005年02月03日
谁能告诉我URL重写,到底都做了那些工作??
怎么我设置了服务器对URL重写以后,b应用的Session就整个丢失了。
回复 点赞
以梦为马 2005年02月01日
up
回复 点赞
liaohaiying 2005年01月31日
你的登陆没做好,
刷新登陆页面相当于退出,把session清空了,
唯一好用的办法是在页面上加判断,加什么判断呢?
就是检测是否有session,有session的话就显示用户名,没有就显示登陆。
<%
int pintsysuserid = 0;
if(session.getAttribute("SysUserID")!=null)
{
pintsysuserid = Integer.parseInt(session.getAttribute("SysUserID").toString());
}
SysUserServices pobjSysUserServices = new SysUserServices();
String userName = "此用户已删除";
if(pintsysuserid!=0)
{
userName = pobjSysUserServices.getuserdetail(pintsysuserid).getLogonName();
out.println("<font color='red'> "+userName+" </font>您好!欢迎光临!");
}
else
{

%>
用户名:<INPUT class=topblack onfocus="if (this.value=='用户名') this.value=''" size=10 value=用户名 name="userName">
密 码:<INPUT class=topblack onfocus="if (this.value=='mimami') this.value=''" type=password size=10 value="" name="passWd">
<INPUT type=submit name=submit value=登陆>
<%
}
%>
<%
if(request.getMethod().equals("POST"))
{
String pstrLogonName = request.getParameter("userName");
String pstrPassWord = request.getParameter("passWd");
SysUser pobjSysUser = new SysUser();
LogonService pobjLogonService = new LogonService();
pobjSysUser = pobjLogonService.getLogonSysUser(pstrLogonName,pstrPassWord);
if(pobjSysUser!=null)
{
//设置SESSIN的值!
session.setAttribute("SysUserID",String.valueOf(pobjSysUser.getID()));
session.setAttribute("SysUserName",pobjSysUser.getUserName());
session.setAttribute("SysUserLogonName",pobjSysUser.getLogonName());
response.sendRedirect("lunTan/index.jsp");
}
else
{
String pstr="<script language='javascript'>alert('用户名与密码不正确,请重新输入!');";
pstr = pstr + "location.href='lunTan/index.jsp';";
pstr = pstr + "</script>";
out.println(pstr);
}
}
(本来这里还要在ELSE里加清session的语句的,根据你的需要我把它去掉了)
%>
回复 点赞
JeromeLiu 2005年01月31日
当用户刷新的时候,a.jsp中的session是不会丢的,所有可以想办法将应用B中需要保存的用户信息都保存在应用A中。等传递到b.jsp中再将信息保存到B的session中。

这里有个问题就是要在b.jsp中用户登陆成功后,应该立即刷新一下整个页面a.jsp,这样可以将b.jsp中的登陆信息传递到a.jsp中通过session保存,再传递给b.jsp就可以了。
回复 点赞
JeromeLiu 2005年01月31日
我想每次刷新a.jsp时候,iframe里面的jsp都会重新加载,里面也就相当于一个新的页面,类似打开一个新的ie窗口,session自然就丢失了。
处理方法你可以通过在a.jsp中即A应用中保存一个session的变量,这个session记录是用户登陆应用B的信息,在你iframe的href后加?变量传递给b.jsp。
回复 点赞
cn_patriot 2005年01月31日
页面载入的时候总要判断一下当前用户有没有登陆吧,如果没有登陆你才需要调用登陆处理。
回复 点赞
feishao45 2005年01月31日
我也遇到了同样的问题,呵呵
关注ing……
回复 点赞
dabo1980 2005年01月31日
UPUPUP
回复 点赞
wjr1982et 2005年01月31日
ding~ding~ding~
回复 点赞
bp69 2005年01月31日
在用户做完登录以后,当用户通过IE工具栏中的刷新按钮刷新页面的时候。b.jsp中的用户Session将丢失--------〉这里是不是有初始化的东西,一刷新就都重新初始化了
回复 点赞
lxleaves 2005年01月31日
jsessionid
url重写也是记录客户端sessionid的一种方法
回复 点赞
sandyen 2005年01月31日
to lxleaves(飘泊的叶子)
在response中加入sessionid我也试过了,没有用。
不知道你说的日重写是指什么。
回复 点赞
sandyen 2005年01月31日
现在这个问题已经影响到整个应用的功能。当互相访问以后,用户再点击刷新的话,ie会不停的闪动。
A的Sesion也受到了影响。
回复 点赞
sandyen 2005年01月31日
to lxleaves(飘泊的叶子)
现在我的两个应用用的是同一个domain
我也想用cookie解决,但是没有想到好的办法。
请具体一点。谢谢。
回复 点赞
发动态
发帖子
Web 开发
创建于2007-09-28

5.2w+

社区成员

34.1w+

社区内容

Java Web 开发
社区公告
暂无公告