文章目录
前言
本篇主要记录了Cookie的常用api以及对应的一个小案例。
一、Cookie和Session的概念
1. 会话管理
首先我们先来了解下会话:用户打开一个浏览器,点击多个链接,访问服务器多个web资源,然后关闭浏览器,整个过程称为一个会话。
2. 保存会话的两种技术之一:cookie
Cookie:是 客户端 的技术,程序把用户的数据以cookie的形式写给各自的浏览器。当用户再次访问服务器的web资源时,就会带着各自的数据去。
二、Cookie的使用
1. 一些简单常用的API
获取cookie数组:Cookie[] cookies = request.getCookies();
创建cookie:Cookie cookie = new Cookie(key, value);
把cookie写入客户端:response.addCookie(cookie);
2. Cookie的清除以及设置路径注意事项
在cookie的api中还有两个个常用的api:
setMaxAge(),这里我们具体来看下它的使用:
- setMaxAge()是设置cookie有效时间,持久化到磁盘上的时间;
- 设置为0的时候,就相当于删除;
- 设置为整数,就是保存在磁盘上的时间,且参数是以秒为单位的;
- 如果设置为负数,那就是保存在浏览器缓存的时间,关闭浏览器,那么就没有了。
setPath() 是要这里提到的第二个常用的API。
- 它的作用是:在当前项目路径下的资源都可以访问到cookie。
(接下来,展示下设置为0,删除的功能以及设置路径的注意事项。)
首先,现创建一个servlet,在第一次访问的时候,我们把当前时间戳保存下来,当做cookie;之后访问的时候,展示这个cookie
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer = resp.getWriter();
Cookie[] cookies = req.getCookies();
for (int i = 0; cookies!=null&&i <cookies.length ; i++) {
if("lastAccessTime".equalsIgnoreCase(cookies[i].getName())){
long l = Long.parseLong(cookies[i].getValue());
writer.write("最后的访问时间为:"+new Date(l).toString());
writer.println("<a href='"+req.getContextPath()+"/cookie/clear'>clear</a>");
}
}
Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+"");
cookie.setMaxAge(60*5);
cookie.setPath("/"); //注意这里我们给cookie设置了路径,则在当前项目下的servlet都可以访问到这个cookie
resp.addCookie(cookie);
}
我们再写一个删除cookie的servlet,这里用到的就是把setMaxAge()中传入0:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
for (int i = 0; cookies!=null&&i <cookies.length ; i++) {
if("lastAccessTime".equalsIgnoreCase(cookies[i].getName())){
cookies[i].setMaxAge(0);
cookies[i].setPath("/"); //要设置和上面的servlet一样的路径,要不然过期的这个cookie和那个就不是同一个
resp.addCookie(cookies[i]);
}
}
}
最后的页面展示如图:
(这里需要注意的一点是,第一次访问的时候是没有这个访问时间,和清除链接的,因为第一次访问我们没有cookie,所以不会走for循环,而是直接走下面的设置cookie的代码)
当我们点击clear之后,再访问demo1这个链接的时候,就是一片空白了,因为cookie被清除了,如同我们第一次访问一样。
刚刚我们讲解的是setMaxAge()的功能,仔细看的话,会注意到一个细节,就是我在两个servlet下都设置了同样的path,如图:
这里我们先来看下如果,我们只给demo1的servlet设置setPath("/"),不给clear的设置,会出现什么样的效果:
在浏览器的cookie中我们看到了两个同名的cookie,一个是demo1中的,一个是clear中的,而我们在clear的代码中设置了删除,确实这里是过期了,但是另一个依然存在,并且没有过期。
所以,当我们去使用setMaxAge()删除一个cookie的时候,一定要保证这个cookie的路径和我们创建的那个cookie是用一个路径的,最稳妥的办法就是给他设置成同一个。因为使用默认的路径,有概率出现不是同一个的情况。
下面这张图,就是设置了同一个路径(也就是我们一开始代码所写的)查看的cookie情况:
3. Cookie的小案例:记住用户名
我们先看一下,页面的样子:
这个案例的要求如下:当我输入正确的用户名和密码并勾选记住用户名登录,第二次我再次访问这个登录的页面时,会默认记住我的用户名和勾选的状态。
下面我们来看下代码的实现:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer = resp.getWriter();
String userName="";
String checked = "";
Cookie[] cookies = req.getCookies();
for (int i = 0; cookies!=null&&i < cookies.length; i++) {
if("userName".equalsIgnoreCase(cookies[i].getName())){
userName=cookies[i].getValue();
checked="checked='checked'";
//这里从cookie中拿到userName,然后再写回页面中同时设置复选框为勾选状态;
//如果没有cookie,那么就不会走这里的代码,也就不会展示
}
}
writer.write("<form action='/java_web_day01/cookie/demo3' method='post'>");
writer.write("用户名:<input type='text' name='userName' value='"+userName+"'><br/>");
writer.write("密码:<input type='password' name=pwd><br/>");
writer.write("记住用户名:<input type='checkbox' name=remember "+checked+"><br/>");
writer.write("<input type='submit' value='登录'>");
writer.write("</form>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
//因为是个小练习,所以前端展示的代码也写在这里了;
//但是会出现一个问题,展示的页面用的是get请求去获取,但是表单要用post去提交,所以我们在post请求的方法里面调用get方法的代码,这样就不会出现问题了
}
下面是处理登录逻辑的代码,我们要去做以下几件事:
- 判断用户是否登录成功 — 拿到用户名和密码,然后去比对
- 登录成功的话,判断是否勾选了记住用户名,如果勾选了,就要保存用户名到cookie中;没有勾选,那么我们就把cookie删除,以防使用前一次记录下的cookie
- 登录不成功,我们让它跳转回登录页面
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer = resp.getWriter();
String userName = req.getParameter("userName");
String pwd = req.getParameter("pwd");
String remember = req.getParameter("remember");
Cookie cookie = new Cookie("userName",userName);
cookie.setPath("/");
if("tom".equalsIgnoreCase(userName)&&"123456".equalsIgnoreCase(pwd)){
if(remember!=null){
cookie.setMaxAge(Integer.MAX_VALUE);
}else {
cookie.setMaxAge(0);
}
resp.addCookie(cookie);
writer.print("登录成功");
}else{
writer.print("登录失败");
resp.addHeader("refresh", "3;url=/java_web_day01/cookie/demo2");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
我们查看一下浏览器中保存的cookie:
总结
本文主要介绍了cookie的一些用法以及记住用户名的小案例。下次我们将介绍另一种保存会话的技术:session。