Weblogicの同ドメインでのsession競合解決
3757 ワード
この2日間、1つの環境を構築して、金税の3期の3つのサブシステム(システムA、システムB、システムC)を1つの配置に統合することを要求して、3つのサブシステムの相互間のいくつかの配置ファイルの衝突が1つの応用の下で配置することができないため、2台の機械を探して、3つのdomainを建てて配置するしかありません.1つのdomainの下に3つのアプリケーションを配置してもいいかと聞かれるかもしれませんが、実は私もそう配置したいのですが、会社のフレームワークではコンテキストルートが/でなければならないので、このような方法では配置できません.3つのシステムを3つのdomainの下に配置し、異なるipとポートを使用して、ユーザーを一緒に見せるにはどうすればいいのでしょうか.皆さんも答えがあると思いますが、apache http serverやnginxなどのwebサーバを使ってエージェントとして実現します.それでnginxを使って環境を構築して、それを完成しました.エージェントの主な構成は次のとおりです.
構成から分かるように、/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単点登録の問題に伴い、部門は一時的に単点登録製品を持っておらず、現在は一時的に単点登録を加える時間がないため、3つのシステムをそれぞれのシステムに登録させるしかない.3つのシステムのログインアドレスが全く同じであるため、構成上の変更を少し行い、システムBとシステムCのログインとコミットインタフェースのurlに接尾辞を追加した.このように3つのシステムは,自分のログインurlにアクセスして単独でログインすることができる.変更後ngixにエージェントの構成を追加
これで万事順調と思いきや、ログイン中にトラブルに見舞われた.先にシステムAにログインしてから、システムBにログインしたところ、システムBのログインに成功した後、システムAは意外に終了した.コードと構成をよく調べてみると、3つのシステムのログインプロセスは完全に分離されており、システムBのセッションはシステムAのセッションに影響しません.httpwatchでログインプロセスを追跡したところ、システムBのログイン中にクッキーのjsessionid値が変更されたことが意外にわかりました.ログインシステムAが成功した後、システムBにログインします.これはjsessionidがシステムBのアプリケーションによって他の値を変更されたため、システムAのログイン情報が失われ、システムタスクによってログインが失効しました.周知のように、サーバ側sessionはjsessionidで同じセッションかどうかを識別し、クライアントがcookieを開くと、cookieにjsessionidが設定される.クライアントが開いていない場合、jsessionidはurlで渡されます.問題の原因は明らかにweblogicがセッションを初期化していない場合、セッションがまだ初期化されていない場合、クライアントが渡すjsessionidを使用して初期化されていない(tomcatはクライアントが渡すjsessionidを使用するそうです).問題が見つかったら、解決策は2つあります.1は、クライアントのjsessionidをweblogicに使用させてsessionを初期化する2は、アプリケーションごとに異なるkeyを使用してjsessionidの値を格納することである.すなわち、システムAはjsessionidを使用し、システムBはjsessionidjxglを使用し、システムCはjsessionidzcpgを使用する.第1の方法はどのように配置することを知らないで、第2の方法は比較的に簡単で、直接WEB-INFweblogicを配置します.xmlでいいです.weblogic.xmlは次の構成に追加されます.
これで問題が解決する.
# 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単点登録の問題に伴い、部門は一時的に単点登録製品を持っておらず、現在は一時的に単点登録を加える時間がないため、3つのシステムをそれぞれのシステムに登録させるしかない.3つのシステムのログインアドレスが全く同じであるため、構成上の変更を少し行い、システム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のログイン中にクッキーのjsessionid値が変更されたことが意外にわかりました.ログインシステムAが成功した後、システムBにログインします.これはjsessionidがシステムBのアプリケーションによって他の値を変更されたため、システムAのログイン情報が失われ、システムタスクによってログインが失効しました.周知のように、サーバ側sessionはjsessionidで同じセッションかどうかを識別し、クライアントがcookieを開くと、cookieにjsessionidが設定される.クライアントが開いていない場合、jsessionidはurlで渡されます.問題の原因は明らかにweblogicがセッションを初期化していない場合、セッションがまだ初期化されていない場合、クライアントが渡すjsessionidを使用して初期化されていない(tomcatはクライアントが渡すjsessionidを使用するそうです).問題が見つかったら、解決策は2つあります.1は、クライアントのjsessionidをweblogicに使用させてsessionを初期化する2は、アプリケーションごとに異なるkeyを使用してjsessionidの値を格納することである.すなわち、システムAはjsessionidを使用し、システムBはjsessionidjxglを使用し、システムCはjsessionidzcpgを使用する.第1の方法はどのように配置することを知らないで、第2の方法は比較的に簡単で、直接WEB-INFweblogicを配置します.xmlでいいです.weblogic.xmlは次の構成に追加されます.
<session-descriptor>
<cookie-name>jsessionidjxgl</cookie-name>
</session-descriptor>
これで問題が解決する.