设为首页 收藏本站
查看: 794|回复: 0

[经验分享] weblogic之同域下session冲突解决

[复制链接]

尚未签到

发表于 2017-2-17 11:45:29 | 显示全部楼层 |阅读模式
  这两天在搭一个环境,要求把金税三期的三个子系统(系统A、系统B、系统C)合并成一个部署,由于3个子系统相互之间有些配置文件冲突无法放在一个应用下部署,只好随找了2台机器,建了3个domain来部署。也许有人问,在1个domain下部署3个应用也可以吧,事实我也想这么部署,但由于公司框架要求上下文根必须为/,那这种方式部署就不行了。


3个系统部署在3个domain下,且使用了不同的ip和端口,如何才能让用户看起来是在一起呢?相信大家也有了答案,使用apache http server或nginx等之类的web服务器做代理实现。遂使用nginx搭建环境,搞定之。代理主要的配置如下:



#转发系统B管理
location ~ /jxgl/ {
proxy_pass http://192.168.40.134:8001;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header  X-Real-IP  $remote_addr;
proxy_set_header Host $host;
}

#转发系统C
location ~ /zcpg/ {
proxy_pass http://192.168.40.134:8002;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header  X-Real-IP  $remote_addr;
proxy_set_header Host $host;
}

#转发系统A管理
location ~ /fxgl/ {
proxy_pass http://192.168.110.121:7001;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header  X-Real-IP  $remote_addr;
proxy_set_header Host $host;
}

#转发其他所有
location ~ /.* {
proxy_pass http://192.168.110.121:7001;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header  X-Real-IP  $remote_addr;
proxy_set_header Host $host;
}
  

由配置可以看出,以/zcpg开头的应用,转发到http://192.168.40.134:8002,以/jxgl开头的应用,转发到http://192.168.110.121:7001,以 /fxgl开头的应用,转发到http://192.168.110.121:7001,其他的都转发到http://192.168.110.121:7001


单点登录问题随之而来,由于部门暂无单点登录产品,且目前无时间临时加上单点登录,只好让三个系统各自登录各自的系统。由于三个系统的登录地址完全一样,故做了一点配置上的改动,把系统B和系统C的登录和提交界面的url添加上了后缀。这样3个系统可以访问自己的登录url单独登录。改动后ngix增加代理的配置



#转发系统C__登录
location ~ .*_zcpg\.(webfaster|html|htm){
proxy_pass http://192.168.40.134:8002;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header  X-Real-IP  $remote_addr;
proxy_set_header Host $host;
}
#转发系统B管理__登录
location ~ .*_jxgl\.(webfaster|html|htm){
proxy_pass http://192.168.40.134:8001;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header  X-Real-IP  $remote_addr;
proxy_set_header Host $host;
}
  


至此,本以为万事大吉,结果登录过程中还是遇到了麻烦。先登录系统A,然后再登录系统B,结果系统B登录成功后,系统A却意外的退出了。仔细翻查了代码和配置,3个系统的登录过程完全是隔离开的,系统B的会话不会影响系统A的会话。


经过httpwatch跟踪登录过程,意外发现在系统B登录过程中,cookie中的jsessionid值被修改了。登录系统A成功后,再登录系统B,这是jsessionid被系统B的应用改了其他值,导致了系统A登录信息的丢失,以致被系统任务登录失效了。


众所周知,服务器端session是以jsessionid来识别是不是同一个会话,当客户端开启cookie时,会在cookie中设置jsessionid。客户端未开启时,会以url的方式传递jsessionid。问题的原因显然是weblogic初始化session时,如果session还未初始化,没有使用客户端传递的jsessionid来初始化(据说tomcat会使用客户端传递的jsessionid)。


问题找到了,解决办法就有2种方法。1是让weblogic使用客户端的jsessionid来初始化session 2是让每个应用使用不同的key来存储jsessionid的值。即系统A使用jsessionid,系统B使用jsessionidjxgl,系统C使用jsessionidzcpg。

第1种方法不知道怎么配置,第2中方法比较简单,直接配置WEB-INF\weblogic.xml即可。weblogic.xml增加如下配置:

<session-descriptor>
<cookie-name>jsessionidjxgl</cookie-name>
</session-descriptor>
  
至此,问题解决。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-343454-1-1.html 上篇帖子: weblogic中将控制台信息打印到log文件中 下篇帖子: BEA Weblogic Portal内容管理的几点开发经验
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表