美文网首页
代理之后 cookie无效

代理之后 cookie无效

作者: dozenx | 来源:发表于2019-04-19 11:00 被阅读0次

tomcat 中的session 只有在使用的时候才会创建

他的id 是对应后台保存在 request==> session==>id中的
前端是保存在cookie JSESSIONID

可以尝试写一个请求 如果没有触碰request.getSession 那么请求完成以后,在浏览器里查看cookie ,是没有jsessionid这一项的,

对cookie的探索

项目中

前端 将后端/xxxsrv/xxxx 的请求代理成api/xxxsrv/xxxxxxxx

导致 前端每次都会设置JSESSIONID的cookie 被设置到了 /xxxsrv

然后登陆的时候会调用 /api/xxxsrv/login的时候 就带不上来 这个 JSESSIONID cookie了

因为 /a 的cookie 在/a/b是能访问并得到的

但是/a/b 的cookie 在/c/a/b 下是不能访问到的.

所以能不能让后端在设置cookie的时候直接设置到 / 根目录下呢

cookie实验

在java代码中做了调整 将当前的seessionId保存到 JSESSIONID 的cookie值中,并将该cookie的path 设置为/

Cookie hit=new Cookie("JSESSIONID",request.getRequestedSessionId());

hit.setHttpOnly(true);//如果设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法访问该Cookie

hit.setMaxAge(60*60);//设置生存期为1小时

// hit.setDomain("www.zifansky.cn");//子域,在这个子域下才可以访问该Cookie

hit.setPath("/");//在这个路径下面的页面才可以访问该Cookie

// hit.setSecure(true);//如果设置了Secure,则只有当使用https协议连接时cookie才可以被页面访问

response.addCookie(hit);

然后我看到我的接口返回的时候设置了两个地方的cookie

  1.  set-cookie:

  JSESSIONID=BDA1544BA63F2DB7761BAC127128E59F; Path=/mssrv; HttpOnly

  2.  set-cookie:

  JSESSIONID=BDA1544BA63F2DB7761BAC127128E59F; Max-Age=3600; Expires=Fri, 19-Apr-2019 03:08:28 GMT; Path=/; HttpOnly

  3.  transfer-encoding:

  chunked

然后 问题也解决了, 这样改了之后就能解决 你的服务是一个微服务 然后通过nginx 代理 主页是/目录下的页面 /目录下的页面都能公用一个jessionId 不会存在 在/目录下调用后端接口 拿不到

回到另一个应用上

我有一个应用是/home 开头的微服务应用,现在主页即使在登录之后依然报错未登录 ,我们来看下究竟为什么

我在前端做了nginx 转发 将wwww.xxx.com/ 的 index 设置为了 /home/index.jsp

wwww.xxx.com的页面上上 我请求/home/usr/info 经常报用户未登录

即使跳到 /home/login.html上进行了登录

跳回主页的时候依然报的是未登录错误

  1. 我们首先来还原这一个步骤 我们先把cookie 全部清空

  2. 应用请求wwww.xxx.com的时候 nginx将请求转到了 home/index.jsp
    请求和cookie如下

6.  Server:
nginx/1.7.3
7.  Set-Cookie:
JSESSIONID=94C4A7DD142381EBDC7069B9E6793888; Path=/home; HttpOnly

可以看到 index.jsp转到 后台的java服务的时候自动生成了cookie JSESSIONID,

  1. 然后调用 /home/user/info的接口
6.  Cookie:
JSESSIONID=94C4A7DD142381EBDC7069B9E6793888

我们看到了 他带上了之前的cookie

这个时候这个接口返回未登录

{"r":504,"msg":"未登录","right":false}

是没有问题的

  1. 然后我们去http://www.xxxx.top/home/sys/auth/login.htm?进行登录

我们看到请求的时候带上了cookie

Cookie:

username=admin; password=14e1b600b1fd579f47433b88e8d85291; userId=1; JSESSIONID=94C4A7DD142381EBDC7069B9E6793888

是之前设置的/home下的 JSESSIONID的值

  1. 在这个页面上

又触发了一个请求验证码图片的接口

Request URL:
[http://www.xxxxx.com/home/code/img/request.json](http://www.xxxxx.com/home/code/img/request.json)
Cookie:
JSESSIONID=94C4A7DD142381EBDC7069B9E6793888

然后我们请求登录接口

登录接

Request URL:

[http://www.xxxx.com/home/sys/auth/loginPost.json](http://www.dapark.com/home/sys/auth/loginPost.json)

Cookie:

username=admin; password=14e1b600b1fd579f47433b88e8d85291; userId=1; JSESSIONID=94C4A7DD142381EBDC7069B9E6793888

登录成功 我们看到 response 里并没有设置cookie 也就是说 他同意使用原来的JESSIONID

这个时候我们再次请求主页

发现这个时候首页的cookie变了 又被更新成了一个新的cookie


Response Headersview source 
7.  Set-Cookie:

JSESSIONID=20B396447D2A6E0A580510CE657547CB; Path=/home; HttpOnly

Request Headersview source
Accept: 
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: 
gzip, deflate
Accept-Language: 
zh-CN,zh;q=0.9
Connection: 
keep-alive
Host: 
www.xxxx.top
Referer: 
http://www.xxx.top/home/sys/auth/login.htm
Upgrade-Insecure-Requests: 
1
User-Agent: 
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36

为什么会这样呢 我们看request header 里面 并没有带上cookie值

因为我们请求的是 http://www.xxx.com

所以 他是不会把http://www.xxx.com/home的cookie带上去的

所以后端以为他没有JSESSIONID又帮他生成了一个新的JESSIONID 这样就导致了他每次都生成了一个新的cookie

解决办法就是在后台再写一遍 把 cookie JSESSIONID的值设置到/目录下就可以了
也就是上面采用的方法.
其实绕了一大圈,发现问题其实很简单 ,就是 在首页请求的时候,后端把cookie写到了 /home 下面了,
但是我们的页面是根目录下的 path ,所以他取不到 /home下的cookie值

相关文章

网友评论

      本文标题:代理之后 cookie无效

      本文链接:https://www.haomeiwen.com/subject/oafqgqtx.html