javaweb session,cookie和浏览器之间的关系总结
之前我一直不清楚session和cookie还有浏览器之间到底是什么关系,都说http是无状态的调用,那么服务端这边应该不认识客户端发送过来的请求到底是谁的,可是当我们登录应用后再次发送请求的时候,服务端却能认出我.当时也没太在意为什么会是这样的.前几天看了动脑学院老师讲这章知识点的时候才发现原来是这么回事的
1 客户端第一次发送请求java服务器时,是不会产生JSESSIONID的
2 当客户端第一次向服务端请求session的时候,服务端通过调用request.getSession()的时候才会创建session,并且这个时候会在response的cookie中写入JSESSIONID=session.getId() 之后这台浏览器发送的请求时候都会带上这个cookie . 这样浏览器和服务器之间通过cookie中的JSESSIONID就产生了关联
3 当客户端第一次向服务端请求jsp的时候也会产生session, jsp中9大隐藏域对象(out,request,response,session,application,pageContext,page,config,exception)就包含了session 关联方式同2
图解
第一种请求 不会产生cookie和session
第二种请求 服务端显示的调用session,这时就会在response中写入cookie,并在cookie中写入JSESSIONID
可以发现request.getSession().getId()得到值和浏览器中cookie的JSESSIONID的值是一致的
只有浏览器发送的请求的时候都会带上这个cookie到服务端
第三种 客户端向服务端请求jsp的页面
客户端向服务端请求session后,之后的每一次请求都带上cookie中JSESSIONID和服务端进行"长久友好关系"
可以看到request headers中就带了 cookie中JSESSIONID
总结
有些东西真的值得深究啊 看似简单的东西当时没搞懂就一直拖着,结果人家面试官一问就懵了
以上测试都是基于tomcat.可能别的web服务器产生的session机制不同
源码在此:https://github.com/zhouminsen/web