一、问题说明
过滤器在过滤登录请求的时候,对服务器的ip+端口号与访问请求的ip+端口号进行了校验。在没有使用nginx反向代理服务器的时候,可以校验成功的,但是在使用nginx反向代理之后,校验失败了。失败的错误图如下所示:
这是我公司系统部署给外省,他们在演示的时候出现的问题。下面解决的时候,ip和端口号我使用本地的来进行说明。
上图很明显是服务器的端口没有,我在本地debug调试查看,首先测试没有使用nginx反向代理的情况:
由上图可见通过request.getHeader()获取的是服务器的ip+端口号。request.getServerPort()获取的是本地服务器的端口号。(代码的那句“反向代理服务器端口”控制台打印就忽略吧,哈哈,之前调试的时候写的。)
然后测试使用nginx反向代理的情况:
nginx.conf的配置如下所示:
由上图可见,通过request.getHeader()获取的是服务器的ip,没有端口号了,emmm,一定是代理服务器设置的哪里出了问题。但是通过request.getServerPort()方法也是可以获取到反向代理服务器的端口号80的。
二、问题解决
后来查资料,发现了问题,修改如下:
也就是在$host后面加上端口号。测试发现可以了,如下图:
可以发现request.getServerPort()获取的端口号也变成了8080。咦~ 不禁有个疑问nginx的端口不是80吗,咋request.getServerPort()怎么是8080端口了。
查资料发现,nginx的监听端口默认的80端口,如果nginx的监听端口不是默认的80端口,改为其他端口如81端口。
后端服务器中request.getServerPort()无法获得正确的端口,返回的仍然是80;正因为我指定了端口8080,所以返回的是8080端口了。来个小测试说明一下。来,我们用图说话:
nginx.conf配置:
debug调试:
看到没有,获取的依旧是80端口号。
修改配置:
debug调试:
三、总结
nginx.conf配置要通过request.getServerPort()获取指定的端口号,此时需要修改所访问请求的代理相关的配置:proxy_set_header Host $host:端口号;