Nginx(二) 实践中遇到问题

4 篇文章 0 订阅
1 篇文章 1 订阅

项目架构,Nginx+tomcat(三台)

为了实时向页面端推送消息,使用了WebSocket,一开始的时候用户访问登录页面就会发送WebSocket连接请求,同时登陆页面会调用一次验证码接口获取页面验证码,测试时,时不时的就会出现验证码验证不通过的错误(前提是用户验证码输入正确),经过反复研究测试,最终发现是由于如下原因导致的:


1.登录页面会向后台发两次请求,一次是获取验证码图片,一次是请求建立Websocket连接,因为使用了Nginx做分发(Sticky),当获取验证码的请求发送到服务器,此时nginx会在response的cookie里设置一个route=A(代表分配给当前请求的后台服务器),这是请求还未返回,WebSocket建立连接的请求也来到Nginx,因为cookie里没有设置route,nginx认为这是客户端第一次请求服务,那么它会设置一个route到response里,这里的route和请求验证码时的route有可能不一致(即两次请求不是被分到了不同的服务器),这时验证码请求返回(带回route=A),紧接着WebSocket请求返回(带回一个route,这个route值可能和A不一致),如果不一致,客户端浏览器的cookie里存储的route就是后面WebSocket请求返回的route(覆盖之前验证码请求带回的route),然后用户填写用户信息和验证码点击登录,这时Nginx发现请求的cookie里有route值,那就把这次请求分发到这个route对应的服务器,但这台服务器并不是获取验证码的那台服务器,因为验证码时存储在session上的(没有做session共享),所以自然找不到相应的验证码值,从而验证码校验不会通过。

2.解决方案

   2.1 把验证码存储到其他地方,不存在session里,比如内存数据库redis

   2.2  页面发送建立WebSocket连接的请求放到用户验证登录成功之后

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值