会话
- 会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,最后关闭浏览器。这个过程可以称为会话。
一个网站如何证明你来过?
- 服务端给客户端一个信件,客户端下次访问服务端的时候带上信件就可以,这就是cookie
- 服务器登记此客户端来过,下次这个客户端再来的时候服务器会去匹配它,这就是session
保存会话的两种技术
Cookie
- 客户端技术:通过响应和请求携带cookie
- Cookie是由服务器端创建,并由response对象返回给客户端浏览器保存
Session
- 服务器技术:利用这个技术,可以保存用户的会话信息,可以把信息或者数据存放在session中
- Session是由服务器创建,并且由服务器自己保存
- Session是基于Cookie来实现的,服务器第一次将http请求响应给浏览器携带着Cookie,Cookie中就保存着JSESSIONID。
-
JSESSIONID就像一把钥匙,客户端浏览器拿到这把钥匙之后,可以与服务器进行匹配,如果匹配成功,则可以进入服务器内访问其网站的所有数据,并可以保存自己相关的数据信息
-
常见场景:网站登录之后,下次会自动登录
Cookie
案例:获取上一次访问浏览器的时间
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
Cookie[] cookies = req.getCookies();
PrintWriter out = resp.getWriter();
if (cookies != null){
out.print("您上一次访问本站的时间为:");
for (Cookie cookie : cookies) {
if (cookie.getName().equals("lastLoginTime")){
long last = Long.parseLong(cookie.getValue());
Date date = new Date(last);
out.write(date.toLocaleString());
}
}
}else {
out.print("这是您第一次访问本站");
}
Cookie lastLoginTime = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
lastLoginTime.setMaxAge(60*24*24);
resp.addCookie(lastLoginTime);
}
常见方法
Cookie[] cookies = req.getCookies();//获取cookie
cookie.getName();//获取cookie名字
cookie.getValue();//获取cookie内容
new Cookie("lastLoginTime", System.currentTimeMillis() + "");//新建cookie
lastLoginTime.setMaxAge(60*24*24);//设置cookie的到期时间
resp.addCookie(lastLoginTime);//往响应中添加cookie返回给客户端
cookie细节问题
- 一个网站的cookie是否存在上限
1.一个cookie只能保存一个信息
2.一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
3.cookie有大小限制:4kb
4.浏览器存放cookie上限:300个 - 删除cookie
1.不设置有效期:关闭浏览器自动失效
2.设置有效时间为0
乱码问题
URLEncoder.encode("你好","utf-8");
URLDecoder.decode("你好","utf-8");
Session
案例:储存每个登录用户的个人信息
- 一个用户在一次会话中仅拥有一个session,用于保存会话的相关信息
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
HttpSession session = req.getSession();
session.setAttribute("person",new Person("张三", 12));
String id = session.getId();
if (session.isNew()){
resp.getWriter().write("session创建成功,ID:"+id);
}else {
resp.getWriter().write("session已经存在,ID:"+id);
}
}
常见方法
req.getSession();//获得session
session.setAttribute("person",new Person("张三", 12));//设置session中存储的内容(键值对)
session.getAttribute("person");//获取session中存储的内容
session.getId();//获取JSESSIONID
session.isNew();//判断session是否是新创建的
session.invalidate();//手动取消session
使用场景
- 保存一个登录用户的信息(例如购物车信息)
- 在整个网站中经常会使用的数据,保存与session中
销毁
- 手动销毁:getSession.invaildate();
- 自动销毁:设置过期时间