简单记录一下
环境介绍
- nginx反向代理某一个域名/ip,姑且叫$nginx_host
- 此nginx下挂了很多个不同的应用,不在同一个tomcat中
- 主系统与其他应用/系统做了sso
- JAVA web应用
问题描述
- 很久很久以前,我作为开发人员通过主系统访问子系统时,偶尔发现url中有点问题。如通过主系统$nginx_host/$main_webapp/index下菜单进入子系统$nginx_host/$sub_webapp时,url后默认拼上了主系统的JSESSIONID。
如$nginx_host/$sub_webapp;JSESSIONID=xxx,结果服务端抛出来异常,springMVC无法解析此url。手工干掉;JSESSIONID=xxx后,能正常进入子系统
HTTP Status 500 - Could not resolve view with name 'sub_webapp/index/' in servlet with name 'mvc'
- 当时没当回事,就这么过去了。
问题爆发
直到...有一天客户发现了这个地方,给我发消息说
xxx,你这个系统挂了啊,没法访问了
我一脸懵逼,客户上截图,才想起来这个问题。
目标
url到服务端的时候,里面的;JSESSIONID=xxx需要被干掉
思路(暂时想了两个)
filter拦一道,检测是否初次登录(为什么需要检测是否初次登陆,由是否做了sso,由哪个cookie做sso而定,或者其他sso方案),然后决定是否重写url
有nginx,可以rewrite
最终方案
考虑到便捷性与效率,比较懒的我用了nginx rewrite方案。
在nginx.conf加了一行配置..
server块
server {
listen 4040;
server_name $server_name;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For
error_log logs/error.log error;
#下面这行
rewrite ^/(.*)\;JSESSIONID=(.*) /$1 permanent;
location / {
root html;
....
}
....
}
有兴趣的同学接着往下看
- 为什么叫JSESSIONID,能不能换个好听的名字,或者每个应用自己定义一个名字,方便针对每一个独立的应用维护
<Context docBase="/home/xxx/Tomcat-xxxtest/webapps/sub_webapp" path="/sub_webapp" reloadable="false"
sessionCookieName="这里换名字" sessionCookiePath="cookie在域下的path"/>
为什么有JSESSIONID,可以搜一下url append jsessionid
其他人怎么处理的,请面向github/segmentfault/stackoverflow编程