同域名下不同应用cookie中jsessionid拼接在url后问题

简单记录一下


环境介绍

  1. nginx反向代理某一个域名/ip,姑且叫$nginx_host
  2. 此nginx下挂了很多个不同的应用,不在同一个tomcat中
  3. 主系统与其他应用/系统做了sso
  4. JAVA web应用

问题描述

  1. 很久很久以前,我作为开发人员通过主系统访问子系统时,偶尔发现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'

  1. 当时没当回事,就这么过去了。

问题爆发

直到...有一天客户发现了这个地方,给我发消息说

xxx,你这个系统挂了啊,没法访问了

我一脸懵逼,客户上截图,才想起来这个问题。


目标

url到服务端的时候,里面的;JSESSIONID=xxx需要被干掉


思路(暂时想了两个)

  1. filter拦一道,检测是否初次登录(为什么需要检测是否初次登陆,由是否做了sso,由哪个cookie做sso而定,或者其他sso方案),然后决定是否重写url

  2. 有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;
        ....
        }
      ....
}                             

有兴趣的同学接着往下看

  1. 为什么叫JSESSIONID,能不能换个好听的名字,或者每个应用自己定义一个名字,方便针对每一个独立的应用维护
<Context docBase="/home/xxx/Tomcat-xxxtest/webapps/sub_webapp" path="/sub_webapp" reloadable="false"
                sessionCookieName="这里换名字" sessionCookiePath="cookie在域下的path"/>
  1. 为什么有JSESSIONID,可以搜一下url append jsessionid

  2. 其他人怎么处理的,请面向github/segmentfault/stackoverflow编程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,292评论 19 139
  • 1.ngnix介绍 ngnix www服务软件 俄罗斯人开发 开源 性能很高 本身是一款静态WWW软件 静态小文件...
    逗比punk阅读 6,365评论 1 6
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,425评论 11 349
  • 单例模式的作用是在多次调用对象创建实例的时候,返回最初创建的实例,而不是每次创建新的实例。 比如在创建一个DB实例...
    守望星空l阅读 1,755评论 0 1
  • 刚入学,一切都觉得很宽敞。 桌子上零零落落的摆着一些书和生活必备品,柜子里几件换洗衣物,东西少得可怜。 细想之下,...
    窝窝的特殊时光阅读 1,111评论 0 0