Cookie学习小结以及一个小案例(返回上次访问的时间,如果是第一次,则返回你好)

0、什么是Cookie?它有什么用?

Cookie就是一个小型文本文件,里面是一些信息片段,它可以以自动地在浏览器和Web服务器之间进行交互,因此Cookie可以存储在多个页面间传递的信息。通俗的讲,你可以理解是在客户端本地存储的一些数据。Cookie作为HTTP header的一部分,它的传输始终受HTTP协议控制。HTTP是一种无状态协议,故Cookie也是无状态的。
Cookie是由服务器创建的,但是它不会保存在服务器里,创建好之后,发送给浏览器,浏览器保存在用户本地,下一次访问网站的时候,就会把该cookie发送给服务器。浏览器在访问同一Web服务器的时候,会将之前收到的cookie一并发送。

1、怎么用Cookie?

我们可以通过传一个name和value给Cookie来创建一个Cookie对象:

Cookie cookie = new Cookie("name", "value");

这就创建了一个cookie对象,我们可以调用cookie的相关方法来进行一系列操作:

  • cookie.setMaxAge(int seconds); 这个方法用于设定cookie的生命周期,传入的值为秒。如果传入的是正数,则表示在本地存储一个cookie,并且它的周期是这个数字秒;如果为负数,则表示为默认周期(浏览器关闭,cookie被销毁);如果是0,则一般用做删除cookie。
  • cookie.setPath(String path); 这个方法用于设置cookie的路径,一般在cookie共享的时候使用。cookie是不共享的,在tomcat里部署多个web项目,cookie是不能共用的,不过你在这个setPath的方法中传入的path为"/",就可以实现多个是项目cookie共享。
  • cookie.setDomain(String path); 这个方法也是设置路径,与上面不同的是,该方法是设置一级域名相同,这样就可以实现多个服务器之间cookie共享。
  • response.addcookie(Cookie cookie); 用于添加一个cookie到服务器端,一旦执行,服务器端会发set-cookie响应头到浏览器,set-cookie是自动带键值对的,这样使的cookie可以保存在浏览器上。
  • request.getCookie(); 对应上面的,用于获取cookie

2.如何删除cookie

并没有直接的方法(类似于remove)去删除一个cookie,我们可以创建一个同名的cookie,然后调用setMaxAge方法传入参数为0,并且添加到HttpServletResponse接口中:

Cookie cookie = new Cookie("name", "value");
cookie.setMaxAge(0);
response.addCookie(cookie);

3.Cookie的一些其他小知识

  1. Cookie存储数据在客户端浏览器是受限制的,浏览器对於单个Cookie的大小限制在4kb,对用一个域名下的总cookie数量也限制在20个。
  2. 在Cookie中一般存放少量不太敏感的数据,Cookie可以在不登录的情况下,完成服务器最客户端的身份识别。
  3. 一次可以发送多个Cookie对象,也就是多创建,使用response多次发送即可。

4.一个小实例

要求:如果我第一次访问页面,则它对我说“你好”,如果我后来访问页面,它就告诉我我上次访问页面的时间是什么时候。
分析:我们可以把上次访问时间的信息放在cookie里面,给cookie设置一个很久的时间,这样我们就可以实现要求了。当然我们也要做一个判断是不是第一次访问的工作。

package Download;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.crypto.Data;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CopyOnWriteArrayList;

@WebServlet("/CookieTestServlet")
public class CookieTestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应的消息的数据格式以及编码
        response.setContentType("text/html;charset=utf-8");
        //1.获取所有的Cookie,判断名字是否非last
        Cookie[] cookies = request.getCookie();
        boolean flag = false;
        //2.遍历cookie
        if(cookies != null && cookies.lenth > 0){
            for(Cookie cookie : cookies){
                if("lastTime".equals(cookie.getName())){
                    flag = true;
                    //有cookie不是第一次访问
                    //设置cookie的value,获取当前时间的字符串,重新设置cookie的值,重新发送
                   String value = request.getValue();
                   //将文件转码输出
                   value = URLDecoder.decode(value, "utf-8");
                   response.getWirter().write("您上次访问的时间是:" + value);
                   Date date = new Date();
                   //简化年月日
                   SimpleDateDormat sdf = new SimpleDataDormat("yyyy年MM月dd日 HH:mm:ss");
                   String str_date = sdf.format(date);
                   //需要转码年月日,因为cookie不识别一些特殊字符
                   str_date = URLEncoder.encode(str_date, "utf-8");
                   //将完整的时间写进cookie
                   cookie.setValue(str_date);
                   cookie.setMaxAge(60 * 60 * 24 * 30);
                   response.addCookie(cookie);
                   break;
                }
            }
        }
        if(cookies == null || cookies.length == 0 || !flag){
            //没有,表示第一次访问
            Date date1 = new Date();
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            String strdate = sdf1.format(date1);
            //编码操作
            strdate = URLEncoder.encode(strdate, "utf-8");
            //将名字设置为lastTime,标志着下一次访问就该是显示上次访问时间了。
            Cookie cookie = new Cookie("lastTime", strdate);
            //将第一次访问的时间写入cookie中
            response.addCookie(cookie);
            response.getWriter().write("您好");

        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

到此就告一段落了,看看运行结果吧:
我第一次访问的时候是21点43分,然后大概44分多关的浏览器
在这里插入图片描述然后我再一次登上去:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章