Cookie的使用

Cookie的使用

1.什么是Cookie

  • Cookie是在浏览器访问Web服务器的某个资源时,由Web服务器在HTTP响应中附带传递给浏览器的一小段数据
  • 一旦Web浏览器保存了某个Cookie,那么它以后每次访问该web服务器时,都应该在Http请求中将这个Cookie回传给Web服务器
  • 一个Cookie主要由标识该信息的名称(name)和值(value)组成。

在这里插入图片描述
创建Cookie

@WebServlet("/cookie/save.do")
public class SaveCookie extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        //把用户输入的关键字保存到cookie
        String data = req.getParameter("keyWords");
        //创建Cookie
        Cookie ck = new Cookie("key_"+System.currentTimeMillis(),data);
        //设置属性
        //设置有效时间
        ck.setMaxAge(60*60*24*7);
        //写给浏览器
        resp.addCookie(ck);

        resp.getWriter().println("save ok");

    }
}

获取Cookie

//读取Cookie
@WebServlet("/cookie/read.do")
public class ReadCookie  extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        //读取Cookie
        Cookie[] cks = req.getCookies();
        if  (  cks!=null ){
            resp.getWriter().println("<h1 > 我的搜索记录 </h1>");
            resp.getWriter().println("<hr color='red'>");
            for( Cookie ck : cks){
                if(ck.getName().startsWith("key_")){
                    resp.getWriter().println("<p>"+ck.getValue()+"</p>");
                }

            }
        }

    }
}

移出Cookie

@WebServlet("/cookie/delete")
public class DeleteCookie  extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");


        Cookie[] cks = req.getCookies();
        if(cks !=null){
            for(Cookie ck:cks){
                if(ck.getName().startsWith("key_")){
                    System.out.println("-----------");
                    // 设置时间,为0 立即过期
                     ck.setMaxAge(-1);
                     resp.addCookie(ck);
                }
            }
        }
        resp.getWriter().println("clear ok");
    }
}

cookie的编码与解码

Cookie默认不支持中文,只能包含ASCLL字符,所以Cookie需要对Unicode字符进行编码,否则会出现乱码

  • 编码可以使用java.net.URLEncoding类的encode(String str,String encoding)方法
  • 解码使用java.net.URLDecoder类的
    decode(String str ,String encoding)方法

创建带中文的Cookie

//使用中文的Cookie.name 与 value 都是用UTF-8编码
Cookie cookie = new Cookie9
   URLEncoder.encode("姓名","UTF-8"),
   URLEncoder.encode("老邢","UTF-8"));
   //发送到客户端
   respone.addCookie(cookie);

读取带中文的Cookie

if(request.getCookies() != null){
  for(Cookie cc: request.getCookies()){
      String cookieNmae = URLEncoder.decode(cc.getName(),"UTF-8");
       String cookieNmae = URLEncoder.decode(cc.getValue(),"UTF-8");
  }
}else{
  out.println("Cookie以写入客户端,请刷新页面")
}

Cookie的优点和缺点

  • 优点
  • 可配置到期规则
  • 简单性:Cookie是一种基于文本的轻量结构,包含简单的键值对。
  • 数据持久性:Cookie默认在过期之前是可以一致存在客户端浏览器上的
  • 缺点
  • 大小受到限制:大多数浏览器对Cookie的大小有4K、8K字节的限制
  • 用户配置为禁用:有些用户禁止了浏览器或客户端设备接受Cookie的能力,因此限制了这一功能
  • 潜在的安全风险:Cookie可能会被篡改,会对安全性造成潜在风险或者导致依赖于Cookie的应用程序失败
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值