nginx做了一层负载均衡代理,nginx转发请求给tomcat时,端口号已经丢失掉了
2016-01-25 20:20
519 查看
一个单点登录问题的解决
上周五的时候,一个同事问我一个单点登录的问题 。整个系统结构并不复杂,在webapp应用中配置一个sso应用的servlet 过滤器 ,这个过滤器会从指定的域名下拿cookie中保存的一个加密sessionid ,利用这个sessionid到sso系统中判断是否登录以及是否在登录有效期内,未登录则进入登录页面,登录成功后,通过一个浏览器的302重定向进入目标页面。同事反映,正常登录以后进入的目标页面,地址不对,我看了一下, 是目标主机的端口号丢失了。于是我在本地搭建了一个测试环境,启动tomcat进行测试,发现并没有出现类似的问题,debug到源码发现目标页面URL也是正确的,继续debug源码,发现sso的servlet过滤器使用的是httpservletRequest获取到http请求的hostname,port,requestURI的。
这时, 我又分析同事的maven 依赖的sso 二方包版本是否和我的一致, 也没有问题。
进一步分析应用部署环境的差异, 发现同事的环境使用了nginx + tomcat的架构, 采用nginx做了一层负载均衡代理,于是查看webapp获取到的requestURL,发现根本就没有浏览器发送的原始URL中的端口。问题就在于此,
浏览器发送的请求是交给nginx,而nginx转发请求给tomcat时,端口号已经丢失掉了, 所以依赖于这个URL拼接出来的目标页面URL自然也就不对了。进一步看sso
Filter 的配置项,是专门有针对主机端口的配置项的。
这个问题的解决提醒我们,在查找问题时,系统部署环境的差异往往是解决问题的一个关键,特别是在很多问题从代码本身找不到原因的时候。
相关文章推荐
- Tomcat启动分析(Tomcat7.0)
- tomcat 两个端口部署应用
- java.lang.UnsatisfiedLinkError: D:\Tomcat\apache-tomcat-7.0.37\bin\tcnative-1.dll: Can't load AMD 6
- 运行tomcat7w.exe tomcat7.exe ,提示 指定的服务未安装 unable to open the service 'tomcat7'
- tomcat远程调试设置
- tomcat远程调试设置
- 运行tomcat7w.exe tomcat7.exe ,提示 指定的服务未安装 unable to open the service 'tomcat7'
- 【转】使用Eclipse远程调试发布在Tomcat上的Web应用
- 【转】使用Eclipse远程调试发布在Tomcat上的Web应用
- Tomcat Can't load AMD 64-bit .dll on a IA 32
- memerched+tomcat 缓存浏览器的session
- nginx+tomcat实现负载均衡
- c3p0、dbcp和proxool比较 据说TOMCAT 7之后的 JDBC 性能更好
- Tomcat安装配置
- Tomcat启动报Error listenerStart解决方法
- 关于通过nginx配置到apache-tomcat-7.0.67的端口的时候access中打印访问日志会一直输出nginx的地址而不是用户的真实地址
- 关于使用apache-tomcat-7.0.67中在apache-tomcat-7.0.67/log/catalina.out文件过大的解决方案
- 设置JAVA路径、TOMCAT路径、启动TOMCAT、启动浏览器
- solr-4.10.0、tomcat7、IKAnalyzer2012FF_u1中文分词器相整合以及相关配置
- 如何监控 Tomcat?Zabbix 与 Cloud Insight 对比