同域名下不同应用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,能不能换个好听的名字,或者每个应用自己定义一个名字,方便针对每一个独立的应用维护

  1. 为什么有JSESSIONID,可以搜一下url append jsessionid

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

你可能感兴趣的:(同域名下不同应用cookie中jsessionid拼接在url后问题)