nginx + tomcat 导致session丢失的问题

niginx 在做反向代理的时候,如果代理的目录地址和用户访问的目录地址不在同一个层级下的时候,即

server {
   listen 80;
   server_name www.bzf.com;
location / {      
        proxy_pass http://127.0.0.1:8090/sso;
}
}

如上所示,若用户访问 www.bzf.com,则会被nginx代理到本地8090端口下的sso项目下,

tomcat是通过cookie中的JsessionId来判断是否是一个新用户的,使用上述代理方式时,tomcat会将JsessionId写入www.bzf.com域名下的/sso路径下面。

用户下次再访问 www.bzf.com 的时候,发送给服务器的请求拿不到 /sso 路径下的 JsessionId,因此tomcat 会一直认为是一个新用户,这从/sso 路径下的 JSessionId会一直变化也可以看到。

上述分析表明,我们要让用户拿到它上次写入的JsessionId才可以,因为用户访问的域名是 www.dzf.com,这我们不能改变,因此应改变保存JSessionId的cookie的路径,将该路径变为 “/” 即可,这可通过nginx 的 proxy_cookie_path 来设置,将 tomcat 写入的 /sso 路径下的cookie 变为"/" 路径下,添加两行代码如下:

server {
   listen 80;
   server_name www.bzf.com;
location / {      
        proxy_pass http://127.0.0.1:8090/sso;
        proxy_cookie_path /sso/ /;
        proxy_cookie_path /sso /;
}
}

相关推荐