新接手的一个项目,在单机上部署,登录访问没有问题,但是部署在Weblogic集群上后,从Nginx反向代理登录发现登录不上,这个需要配置weblogic.xml文件,网上能找到很多资料在weblogic.xml文件中添加
<session-descriptor>
<persistent-store-type>replicated_if_clustered</persistent-store-type>
<sharing-enabled>true</sharing-enabled>
</session-descriptor>
接着,很诡异的事情发生了,登录上去后,先是发现页面有些不正常,页面上有一个菜单树,是动态加载的,有时能加载进来,有时又加载不进来,页面刷新刷者刷着,就发现从登录态变成未登录的了,以为是服务端httpsession共享没有成功,于是写了一段代码,写一个数据到session,然后再访问一个页面获取session中是否有数据,并读取机器的IP地址一并显示出来,发现集群中的每台服务器都存在session中的数据,也就是httpsession共享成功了,那我就怀疑是服务端哪有代码清除了session。
经过一段事件的寻找,发现服务端代码没有找到相关代码,我就刷新页面寻找,发现登录后刷新页面,在加载的过程中,出现某次请求后,浏览器的cookie被设置了一个新的cookie,相当于服务端给客户端换了个HTTP Session,这就有点奇怪了,那应该还是服务端的问题,可是我把加载出现cookie被重置的那个请求单独拿出来从浏览器地址栏访问,刷新,无论刷新多少次,cookie都不会被重置,那我就怀疑是不是jQuery的Ajax请求导致的问题,然后观察其他类似页面,发现也有这个问题,于是我又单独写了个页面用Ajax请求服务端,服务端读取客户端的Cookie值,并返回显示到客户端:
<div id='ct'><div>
<script type="text/javascript">
function check(){
function onReturn(result){
ct.innerHTML = result;
setTimeout(check, 1000);
}
$.ajax({
url:'a.jsp',
type='get',
dataType='text',
success:onReturn
});
}
check();
</script>
这样请求,发现没有问题,cookie不会被重置
然后我觉得是不是访问太慢了,所以体现不出问题,然后改成如下:
<div id='ct'><div>
<script type="text/javascript">
function check(){
function onReturn(result){
ct.innerHTML = result;
check();
}
$.ajax({
url:'a.jsp',
type='get',
dataType='text',
success:onReturn}
);
}
check();
</script>
这样访问够快了吧,嗯,还是不出问题!!
当我再次改动,终于发现问题了!
function check(){
function onReturn(result){
ct.innerHTML = result;
}
$.ajax({
url:'a.jsp',
type='get',
dataType='text',
success:onReturn
});
}
function a(){
check();
check();
check();
check();
setTimeout(a, 3000);
}
a();
</script>
这回体现出问题了,问题估计就是处在当一个Ajax请求还没有返回时,又发起了另外的请求,就会出这个问题,根本原因还没有功夫去深究,到底时Nginx的问题还是weblogic集群的问题还没有去查,但是已经可以帮助我暂时解决问题了。
这个问题,我又做了个实验,发现单机的Web服务,Ajax并发访问,不会出这种问题,也就是说,我只是找到了在集群、Nginx反向代理情况下,从客户端触发这种问题出现的条件,而真正的问题,还是应该从Nginx的配置,weblogic的配置上去查找具体原因。