异常问题之重新登录
某项目反馈编辑报表页面点击任意按钮会弹出重新登录,很是怪异。
排查
通过浏览器确定了复现问题时候ng的会话变了,那么可以知道后续转发到tomcat就会有新会话,导致重新登录
- 首先排查了ng配置,没有发现跳转到新tomcat的相关内容,主要是故障漂移等没有触发,那么会话变化不是这里影响
-
ng开启了upsteam的日志,发现在复现操作的时候有一个跳转,之后upstream地址都变了,于是找到前后相关的请求,并且在浏览器的请求中对比,发现某个请求的上下文路径掉了,于是有了以下解释:
正常情况下,ng的会话是带了上下文路径的,但是这里某个请求没有路径,导致请求到达ng之后会通过rewrite重写来重新定位到此路径上,于是就返回了一个新的会话id,并且分配一个新的tomcat,最终ng会话,tomcat会话都变了,需要重新登录
有了这个推论,那么解决的话只需要开发把这个路径丢失的路径补上就好了。但是和开发交流的过程中发现了另外一个问题,不管是路径丢失还是什么其他错误请求,是不应该覆盖我当前会话的,在这个问题中,用户没有登出的情况下,最终浏览器的会话被覆盖,这也是一个不能接受的问题!于是通过排查浏览器跳转,发现当浏览器给出任意错误路径,请求中是没有cookie,但是响应给出的cookie有异常,如下:
请求的路径不是我们所需的xnzhjtcx,但是cookie却给他设置了值,导致覆盖。根据结果猜测过程,说明此请求是到达了tomcat,才返回路径和cookie,所以当前ng所做的操作可能包括:本地重写了地址,然后发往后端,但用原地址返回。在发往后端的时候发现没有cookie,认为是新请求。
附重写过程中的302:
附ng配置:
server {
...
if ( $request_uri !~ ^/(xnzhjtcx/.*|xnzhjtcx$) ) {
rewrite ^ /xnzhjtcx;
}
location /xnzhjtcx {
proxy_pass http://lb;
}
}
如何解决
要解决上面任意地址导致cookie覆盖的问题,既然是重写导致,那就需要从这里解决,尝试了如下方案:
- 在rewrite后面写带根的路径,请求没有cookie,响应设置了路径和cookie,但浏览器没有显示重定向(结果不行)
附ng配置:# 比较奇怪的是此rewrite之后浏览器返回的是200,而不是30x server { ... if ( $request_uri !~ ^/(xnzhjtcx/.*|xnzhjtcx$) ) { rewrite ^ /xnzhjtcx/; } location /xnzhjtcx { proxy_pass http://lb; } }
- rewirte后面接绝对地址,请求没有cookie,响应没有返回cookie(结果可以)
附ng配置:# 此配置返回30x但没有任何cookie server { ... if ( $request_uri !~ ^/(xnzhjtcx/.*|xnzhjtcx$) ) { rewrite ^ http://61.242.140.32:9100/xnzhjtcx/; } location /xnzhjtcx { proxy_pass http://lb; } }
- 使用location来配合重写,请求没有cookie,响应没有cookie(结果可以)
附ng配置:location / { rewrite ^ /XTJG/ permanent; }
- 疑问:
- 重写只接路径返回了302和cookie,中间经历了什么
- 基于上面重写路径后面加了根截止返回了200和cookie,中间经历了什么
- 重写路径修改为ip+port+路径,返回了302,中间经历了什么
其他问题
最后,不管重写的时候是相对地址还是绝对地址,如果重写的时候不以根结束,但是请求是目录,这样会多跳转一次,修改为根结束,可看下图效果:
修改后可以看到重定向少一次