目录
1、简介
session和cookie都是为了让服务器记住,来访问的客户端谁是谁,用于区别不同的访问者。比如一个有登录功能的网页,不同的用户访问并且登陆后,服务器利用cookie或session记住这些不同的用户,并为这些不同的用户展现出不同的个性化页面。
cookie和session从功能性看起来好像都一样,那么它们的不同点有什么呢?一个比较显著的差别就是cookie由服务器创建后,保存在客户端(浏览器);而session是由服务器创建好后就保存在服务器中。就好比升学后办理入学手续,学校一般会给你发一个校园卡,你想通过学校大门门禁就刷校园卡就可以了,学校知道你是这里的学生,并且知道你是哪一位学生。同时学校它还会在自己的一个文件里把你的相关信息登记好,这样就算你没带校园卡,但是如果你想进学校也可以和校方联系,校方查阅自己登记文件的信息也可以知道你是哪一位同学。
以上大概就是cookie和session的概述了,接下来用代码演示。
2、cookie
2.1测试过程
对cookie主要介绍一下设置attribute和设置最大有效时间
实现一个CookieServlet类,访问网站的时候检查是否有name为lastLoginTime的cookie来判断是否登录。第一次访问默认为未登录,服务器用当前系统时间创建一个name为lastLoginTime的cookie表示已登录。第二次访问的时候检查存在name为lastLoginTime的cookie,打印出上次登录时间
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=UTF-8");
Cookie[] cookies = req.getCookies();
boolean isLogin = false;
for (Cookie cookie : cookies) {
if(cookie.getName().equals("lastLoginTime")){
isLogin = true;
String Stime = cookie.getValue();
long Ltime = Long.parseLong(Stime);
Date date = new Date(Ltime);
resp.getWriter().write("您上次登录的时间是:" + date.toLocaleString());
break;
}
}
if(!isLogin){
resp.getWriter().write("未登录");
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
// cookie.setMaxAge(60*60);
resp.addCookie(cookie);
}
}
运行结果如下
测试的时候先访问cookieservlet的路径/c1,第一次访问未登录,第二次访问的时候页面显示出上一次访问这个页面的时间。然后关闭浏览器,在重新打开浏览器访问这个网站,发现还是未登录,且登陆后发现两次的lastLoginTime值不一样。1628503009872和1628503009872
然后把上面代码中被注释的那行取消注释,再次进行上述访问,结果如下:
在重新打开浏览器访问/c1的时候,没有出现“未登录”的提示,而且两次访问的lastLoginTime都一样。 1628503178842和1628503178842
2.2、小结
对于cookie,如果没有设置最大有效时间的话,在浏览器关闭页面后cookie就自动失效了。设置了最大有效时间后,就算关闭了浏览器,cookie依然存活。
3、session
session和cookie差不多,不过它是存储在服务器中而已,而且session可以通过设置多个attribute来保存多个值
void setAttribute(String var1, Object var2);
Object getAttribute(String var1);
session其它的方法和cookie都很相似,这里就不再细说。下面列出了一些session的方法
// 获得一个session
HttpSession session = req.getSession();
// 设置attribute
session.setAttribute("name", URLEncoder.encode("宏猪", "utf-8"));
// 获得sessionID——唯一标识
String id = session.getId();
// 移除一个attribute
session.removeAttribute("name");
// 判断这个session是不是新创建的
boolean aNew = session.isNew();
// 使session失效
session.invalidate();