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上进行了登录
跳回主页的时候依然报的是未登录错误
-
我们首先来还原这一个步骤 我们先把cookie 全部清空
-
应用请求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,
- 然后调用 /home/user/info的接口
6. Cookie:
JSESSIONID=94C4A7DD142381EBDC7069B9E6793888
我们看到了 他带上了之前的cookie
这个时候这个接口返回未登录
{"r":504,"msg":"未登录","right":false}
是没有问题的
我们看到请求的时候带上了cookie
Cookie:
username=admin; password=14e1b600b1fd579f47433b88e8d85291; userId=1; JSESSIONID=94C4A7DD142381EBDC7069B9E6793888
是之前设置的/home下的 JSESSIONID的值
- 在这个页面上
又触发了一个请求验证码图片的接口
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值
网友评论