美文网首页
代理之后 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