Cookie和Session
Cookie和Session是什么
Cookie和Session是两种会话数据的保存方式。其中,Cookie是客户端技术,Session是服务端技术。
两者具体的类封装在(时代变了)javax.servlet.http
jakarta.servlet.http
包中,依赖jakarta.servlet-api
包即可使用jakarta.servlet.http
下的类。
Cookie
存储位置
存储在客户端,一般保存在本地用户目录下的appdata
中。生命周期
默认会话结束后消失(存于内存中)。通过
setMaxAge(int time)
可以设置cookie的有效期(单位是s,存到硬盘):- 默认值为
-1
- 如果设为
0
,立即删除
- 默认值为
缺陷
大小和数量限制:一般每个站点大约能保存20个cookie,大小限制在4kb以内。浏览器一般有300个cookie上限。
数据安全性问题:http请求中的cookie是明文传递的。以存储网站的上次访问时间为例:
1 | public class CookieDemo1 extends HttpServlet { |
Session
服务器会自动给每一个用户(浏览器)创建一个Session对象,一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在。
服务器在自动创建Session的时候,会同时生成一个Cookie,存储sessionId:
1 | Cookie cookie = new Cookie("JSESSIONID", sessionId); |
存储位置
保存于服务端。使用场景
- 保存登录用户的信息
- 保存购物车信息
- 其他在整个网站中经常会使用的数据
生命周期
- 有效期30min,可以通过两种方式设置有效期:
setMaxInactiveTnterval(int time)
,单位是s- 在
web.xml
中配置session有效期,单位是min
1
2
3<session-config>
<session-timeout>time</session-timeout>
</session-config>- 还可以通过HttpSession的
invalidate()
方法,手动使session失效。
- 有效期30min,可以通过两种方式设置有效期:
相关方法
Session也能和
ServletContext
一样,实现不同Servlet之间的通信。并且该方式**优于利用ServletContext
**。
1 | String password = request.getParameter("password"); |