javaWeb 学习日记(8) -------- Cookie

孤人 提交于 2020-02-16 14:33:29

提出问题:
Http 是一种无状态的协议,web 服务器本身不能识别那些请求是同一个浏览器发出的,浏览器每一次请求都是孤立的。

怎么实现购物车呢?某个用户从网站的登录页面登入后,再进入购物页面购物时,负责处理购物请求的服务器程序必须知道处理上-次请求的程序所得到的用户信息。

在 servlet 中,常用以下两种机制完成会话跟踪:

  • Cookie
  • session


Cookie

  • cookie机制采用的是在客户端保持HTTP状态信息的方案
  • Cookie是 在浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP响应消息头中附带传送给浏览器的一个小文本文件
  • 一旦WEB浏览器保存了某个Cookie ,那么它在以后每次访问该WEB服务器时都会在HTTP请求头中将这个Cookie回传给WEB服务器
  • 底层的实现原理: WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器。
  • 一个Cookie只能标识一种信息,它至少含有-一个标识该信息的名称( NAME )和设置值( VALUE )
  • 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
  • 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
    在这里插入图片描述

实现Cookie 登陆

Sigin.jsp

<form action="index.jsp" method="post">
 Name:<input type="text" name="name">
 <input type="submit" name="submit" value="Submit">
</form>

index.jsp

<body>
 <%
 //得到登陆名
  String name = request.getParameter("name");
  //登录名存在且不为空 则创建一个Cookie
  if(name != null && !name.trim().equals("")){
   //创建一个Cookie name = "name",value = name
   Cookie cookie = new Cookie("name",name);
   //设置这cookie的存活的最大失效 30秒
   cookie.setMaxAge(30);
   //回传cookie
   response.addCookie(cookie);
  }else{
   //用户名为空或者 不存在 检查是否有可用的cookie
   Cookie[]  cookies = request.getCookies();
   //当数组不为空且长度大于0 是有cookie
   if(cookies != null && cookies.length > 0){
    for(Cookie c : cookies){
     //得到cookieName
     String cookieName = c.getName();
     //判断cookie 的名字是不是 “name” 是的话则是一个存好的用户
     if("name".equals(cookieName)){
      String val = c.getValue();
      name = val;
     }
    }
   }
  }
  //有用户 时 打印信息
  if(name != null && !name.trim().equals("")){
   out.print("Hello :" + name);
  }else{
   //没有是回传给sigIn.jsp
   response.sendRedirect("SigIn.jsp");
  }
 %>
 </body>

实例二: 书籍信息记录
Books中

<body>
 <h4>Books Page</h4>
 <a href="book.jsp?book=javaWeb">java Web</a><br><br>
 <a href="book.jsp?book=java">java</a><br><br>
 <a href="book.jsp?book=Oracle">Oracle</a><br><br>
 <a href="book.jsp?book=Ajax">Ajax</a><br><br>
 <a href="book.jsp?book=JavaScript">javaScript</a><br><br>
 <a href="book.jsp?book=Android">Android</a><br><br>
 <a href="book.jsp?book=Jbmp">Jbmp</a><br><br>
 <a href="book.jsp?book=Struts">Struts</a><br><br>
 <a href="book.jsp?book=Hibrnate">Hibrnate</a><br><br>
 <a href="book.jsp?book=Spring">Spring</a><br><br>
 <br><br>
 <%
  Cookie[] cookies = request.getCookies();
  //遍历打印 符合条件的cookie 
  if(cookies != null && cookies.length > 0){
   for(Cookie cookie:cookies){
    if(cookie.getName().startsWith("A_")){
     out.println(cookie.getValue());
    }
    
   }
  }
 %>
</body>

book.jsp

<body>
 Book:<%= request.getParameter("book") %>
 <br><br>
 <a href="Books.jsp">Return...</a>
 <%
  //得到书名
  String name = request.getParameter("book");
  //得到所有的cookie
  Cookie[] cookies = request.getCookies();
  //创建一个临时的 cookie
  Cookie tempCookie = null;
  //用一个 cookie 的数组保存cookie
  List<Cookie> lists = new ArrayList<Cookie>();
  //cookie 中有cookie 
  if(cookies != null && cookies.length > 0){
   //遍历cookie
   for(Cookie cookie: cookies){
    //得到当前 cookie 的名字
    String cookieName = cookie.getName();
    //判断 cookie 是否 以A_开头 开头则book 的cookie 
    if(cookieName.startsWith("A_")){
     //将 当前cookie 放入 list 数组
     lists.add(cookie);
     //判断是否有和当前选中的一样的 cookie
     if(cookie.getValue().equals(name)){
      tempCookie = cookie;
     }
    }
    
   }
  }
  //判断 lists 中的cookie 大于五个且 tempCookie 为 Null的话,则删除第一个cookie
  if(lists.size() >= 5 && tempCookie == null){
   tempCookie = lists.get(0);
  }
  //若tempCookie 不为空则删除
  if(tempCookie != null){
   tempCookie.setMaxAge(0);
   //回传
   response.addCookie(tempCookie);
  }
  //添加当前 cookie 
  Cookie cookie = new Cookie("A_"+name,name);
  response.addCookie(cookie);
 %>
</body>

实现效果:
在这里插入图片描述超链接选择,显示最近五条记录

Cookie 常用方法

  1. 创建一个Cookie
Cookie cookie = new Cookie("cookieName",cookieValue);
  1. 设置cookie 的最大时效
cookie.setMaxAge(time);

以秒为单位,当time 为0 时删除这个cookie

  1. 设置 cookie 的作用范围:可以用于当前目录和当前目录的子目录,但不能作用域当前目录的上一级目录
cookie.setPath(request.getContextPath())

4.调用response 把一个cookie 传到客户端

response.addCookie(cookie)
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!