解决nginx中proxy_pass到tomcat的session丢失问题

之前在配置tomcat的时候都是一个项目对应一个tomcat,也就是一个端口。最近需要把两个项目整合到同一个tomcat中,通过配置nginx让两个域名指向同一tomcat的不同项目。整合完毕后发现其中一个项目的后台管理系统登录不了了。经过调试发现原来是session丢失了。上网查了之后得到解决方案。现记录下来作为备忘。

文章转自:http://blog.csdn.net/yakson/article/details/46683285

*****************************************************************************************************************************************************************************************

引言

  一直以来我都是用nginx1.5.7来作为web服务器和代理服务器来使用,一直都是一个应用对应一个Tomcat也就是一个端口,也只对应一个域名。 
  今天把服务器上的Tomcat整合了一下,5个应用共用一个Tomcat。 
最先出现的问题是,用户等进入后台时出现异常,找不到登录的用户信息! 
  经调试发现是request请求变成了多个,并且session也不一致,感觉就像是另一个浏览器在访问,得出结论:肯定是session丢失了!

原因

  经过认真的分析,得出结论:问题出在Nginx的配置上!

server_name  www.weixin4j.org;
charset utf-8;
root   /opt/apache-tomcat-7.0.53/webapps/weixin4j/;
location / {
    proxy_pass         http://127.0.0.1:8180/weixin4j/;
    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
}

此配置会导致cookie存储的位置不是基于“/”那么在第二次访问的时候会从新创建session,因此session中的信息丢失。

解决方案

修改cookie的存储路径

server_name  www.weixin4j.org;
charset utf-8;
root   /opt/apache-tomcat-7.0.53/webapps/weixin4j/;
location / {
    proxy_pass         http://127.0.0.1:8180/weixin4j/;
    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    add_header From www.weixin4j.org;
    proxy_cookie_path /weixin4j/ /;
    proxy_set_header Cookie $http_cookie;
}

重启服务,测试! 
通过!

时间: 2024-10-29 19:08:34

解决nginx中proxy_pass到tomcat的session丢失问题的相关文章

解决nginx中fastcgi(php-fpm)60s超时的问题

在配置中加上 location ~ .*\.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_read_timeout 700; fastcgi_index index.php; include fastcgi.conf; } 解决nginx中fastcgi(php-fpm)60s超时的问题

Spring Boot+AngularJS中因为跨域导致Session丢失

http://blog.csdn.net/dalangzhonghangxing/article/details/52446821 如果还在为跨域问题烦恼,请查看博主的 解决angular+spring boot的跨域问题 那篇文章. 博主在项目开发过程中,遇到了由于跨域而导致的Session丢失问题,非常的恶心,但是经过在网上查阅各种资料,发现解决方法十分简单. 在我们每一次的数据请求中,浏览器都会向后台发送一个JSession,后台会根据这个值自动查找Id为JSession的那个sessio

解决网站在负载均衡环境下SESSION丢失的问题

在WEB场中,动态网页往往会因为几台主机做了负载而产生SESSION丢失的问题,网上也有很多的介绍,我这里只将我经历的过程给大家分享一下: 系统要运行在负载平衡的 Web 场环境中,而系统配置文件web.config中的Session状态却设置为InProc(即在本地存储会话状态),导至在用户访问量大时,Session常经超时的情况.引起这个现象的原因主要是因为用户通过负载平衡IP来访问WEB应用系统,某段时候在某台服务器保存了Session 的会话状态,但在其它的WEB前端服务器中却没有保存S

windows系统下配置Nginx反向代理多tomcat共享session

nginx.tomcat下载安装本篇不提了,直接说步骤: 1 配置nginx配置文件: nginx下conf文件夹中的nginx.conf 添加下面代码, upstream web_apps{ server 127.0.0.1:8080 weight=1; server 127.0.0.1:8989 weight=1; } server { listen 80; server_name localhost 127.0.0.1; proxy_set_header Host $host; proxy

解决eclipse中无法删除Tomcat服务器中的项目,报maven is required and cannot be removed from the server错误情况

maven is required and cannot be removed from the server 翻译:Maven是必需的,不能从服务器中删除. 无论是maven工程还是dynamic web工程都会出现这种情况 这是为什么呢? 因为这是预加载了,是你一创建工程时就已经把项目部署到指定的Tomcat中了 但这只是绑定,并不意味着该项目就在该服务器中,其实这仅是绑定了而已,即使你新建时不绑定,该项目依然是会在你右击使用run as service 时也会默认绑定 证明:右击别的项目r

解决IE中window.open打开链接refer丢失的问题

来源: http://www.coderanch.com/t/114767/HTML-CSS-JavaScript/nClick-window-open-loses-referrer Hello,I have a table with cells, and the complete area of each cell should be a clickable link (not only the text in it). Therefore I couldn't use normal hype

asp.net session丢失的解决方法小结

现在我就把原因和解决办法写出来. ASP.NET Session丢失原因: 由于Asp.net程序是默认配置,所以Web.Config文件中关于Session的设定如下: < sessionState mode='InProc' stateConnectionString='tcpip=127.0.0.1:42424' sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes' cookieless='true' time

ASP.NET 状态服务 及 session丢失问题解决方案总结

ASP.NET2.0系统时,在程序中做删除或创建文件操作时,出现session丢失问题.采用了如下方法:1.asp.net Session的实现:asp.net的Session是基于HttpModule技术做的,HttpModule可以在请求被处理之前,对请求进行状态控制,由于Session本身就是用来做状态维护的,因此用HttpModule做Session是再合适不过了.ASP.NET中Session的状态保持方式  ASP.NET提供了Session对象,从而允许程序员识别.存储和处理同一个

[转]ASP.NET 状态服务 及 session丢失问题解决方案总结

转自[http://blog.csdn.net/high_mount/archive/2007/05/09/1601854.aspx] 最近在开发一ASP.NET2.0系统时,在程序中做删除或创建文件操作时,出现session丢失问题.在网上搜了不少资料,最后终于解决了,采用了如下方法: 1.asp.net Session的实现: asp.net的Session是基于HttpModule技术做的,HttpModule可以在请求被处理之前,对请求进行状态控制,由于Session本身就是用来做状态维