• JavaWeb:Cookie


    问题?

    HTTP 协议是一种无状态的协议,WEB 服务器本身不能识别出哪些请求是同一个浏览器发出的,浏览器的每一次请求都是完全孤立的。

    作为WEB 服务器必须能够采用一种机制来唯一的标识一个用户,同时记录该用户的状态。

    解决:

    在Servlet 规范中,常用 Cookie 和 Session 这两种机制来完成会话跟踪。

    这里先记录Cookie 的学习内容。

    Cookie :

    1)、完成会话跟踪的一种机制。是在客户端保持 HTTP 状态信息的。

    2)、一旦浏览器保存了某个 Cookie,那么它在以后每次访问该WEB 服务器时,都会在HTTP请求头中将这个Cookie回传给WEB服务器。

    3)相关的一些方法:

    --创建一个Cookie 对象

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

    --setMaxAge:设置Cookie 最大时效,以秒为单位,

    若为0,表示立即删除该Cookie;若为负数,表示不存储该Cookie;若为正数,表示该Cookie 的时效时间。

    cookie.setMaxAge(30);

    --设置 Cookie 的作用范围:因为默认可以作用当前目录和当前目录的子目录,但不能作用于当前目录的上一级目录。

    cookie.setPath(request.getContextPath());

    --调用 response 的一个方法把 Cookie 传给客户端

    response.addCookie(cookie);

    --从浏览器读取 Cookie

    1                 Cookie[] cookies = request.getCookies();
    2                 if(cookies != null && cookies.length > 0){
    3                     //遍历得到我想要的那个Cookie 
    4                     for(Cookie cookie : cookies){
    5                       //获取Cookie 的 name 和 value
    6                         String name = cookie.getName();
    7                         String val = cookie.getValue();
    8                    }        

    4)、如果不设置过期时间,默认情况下Cookie 的生命周期是浏览器会话期间,只要浏览器关闭了,Cookie 就失效了,这样的Cookie 是会话Cookie。设置了过期时间,关闭后再打开浏览器,这个Cookie 依然有效直到超过设定的过期时间。

    5)、应用:

    显示最近浏览过的5本书的信息:在booklist.jsp 页面选择你想浏览的一本书。点击就会进入这本书的页面book.jsp ,会显示这本书的信息且点击return 就回退,并且会把浏览过的书籍的信息以Cookie 的方式传给浏览器。但是只保留显示最新的几条浏览记录。

    用了两个JSP 页面,简单的实现了一下。

    booklist.jsp:

     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     7 <title>Insert title here</title>
     8 </head>
     9 <body>
    10     <h4>Books Page:</h4>
    11     <!-- ?后面的book 是要作为 Cookie的 value 的 -->
    12     <a href="book.jsp?book=Javaweb">Javaweb</a> 
    13     <br><br>
    14     <a href="book.jsp?book=Java">Java</a>
    15     <br><br>
    16     <a href="book.jsp?book=MySql">MySql</a>
    17     <br><br>
    18     <a href="book.jsp?book=Oracle">Oracle</a>
    19     <br><br>
    20     <a href="book.jsp?book=JavaScript">JavaScript</a>
    21     <br><br>
    22     <a href="book.jsp?book=jQuery">jQuery</a>
    23     <br><br>
    24     <a href="book.jsp?book=Android">Android</a>
    25     <br><br>
    26     <a href="book.jsp?book=Ajax">Ajax</a>
    27     <br><br>
    28     
    29     <%
    30         //1、获取所有的 Cookie
    31         //2、从中筛选出 book  的 Cookie 如果 cookieName 为 hnust_book 开头的即符合条件
    32         //3、显示 cookieValue 
    33         Cookie[] cookies = request.getCookies();
    34         if(cookies != null && cookies.length > 0){
    35             for(Cookie c : cookies){
    36                 String cName = c.getName();
    37                 if(cName.startsWith("hnust_book_")){
    38                     out.print(c.getValue() + "   "); 
    39                     //out.print("<br>");
    40                 }
    41             }
    42         }
    43     %>
    44 </body>
    45 </html>

    book.jsp:

     1 <%@page import="java.util.List"%>
     2 <%@page import="java.util.ArrayList"%>
     3 <%@ page language="java" contentType="text/html; charset=UTF-8"
     4     pageEncoding="UTF-8"%>
     5 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     6 <html>
     7 <head>
     8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     9 <title>Insert title here</title>
    10 </head>
    11 <body>
    12     <h4>Book Detals Page</h4>
    13     book: <%= request.getParameter("book") %>
    14     <br><br>
    15     <a href="booklist.jsp">Return</a>
    16     <br>
    17     
    18     <%
    19         //把从booklist.jsp 页面传过来的 book 作为一个 Cookie 返回。 
    20         String book = request.getParameter("book");
    21     
    22         //删除一个Cookie,前提是:以hnust_book_ 开头的 这个Cookie 且它的数量大于等于5 
    23         //获取所有的Cookie 
    24         Cookie[] cookies = request.getCookies();
    25         //保存所有 以hnust_book_ 开头的 这个Cookie 
    26         List<Cookie> bookList = new ArrayList<Cookie>();
    27         //保存和 从 booklist.jsp 传过来的 book 匹配的 book  
    28         Cookie tempBook = null;
    29         if(cookies != null && cookies.length > 0){
    30             //遍历 
    31             for(Cookie c : cookies){
    32                 //获取Cookie 的 name , 选取 以hnust_book_ 开头的,放入数组中 
    33                 String name = c.getName();
    34                 if(name.startsWith("hnust_book_")){
    35                     //选取 以hnust_book_ 开头的 Cookie,放入数组中 
    36                     bookList.add(c);
    37                     //保存和 booklist.jsp 传过来的 book 匹配的Cookie 的book 
    38                     if(c.getValue().equals(book)){
    39                         tempBook = c;
    40                     }            
    41                 }
    42             }
    43         }
    44         //①、如果从booklist.jsp 传过来的 book,在Cookie 中没有,就删除 这个数组的第一个
    45         if(bookList.size() >= 5 && tempBook == null){
    46             tempBook = bookList.get(0);
    47         }
    48         //②、如果在Cookie 中存在,就删除存在的这个Cookie。 
    49         if(tempBook != null){
    50             tempBook.setMaxAge(0);
    51             response.addCookie(tempBook);
    52         }
    53         
    54         //给这个 book Cookie 一个标识符hnust_book_ 
    55         //注意:(这段代码,如果放在了前面,那么②步删除Cookie后,新的Cookie并不会返回到 booklist.jsp 页面)   
    56         Cookie cookie = new Cookie("hnust_book_" + book, book);
    57         response.addCookie(cookie);
    58     %>
    59 </body>
    60 </html>

    结果:

    over。

  • 相关阅读:
    文件预览
    Intellij IDEA 配置热部署
    Spring AOP
    Spring配置Bean
    Zookeeper浅谈
    Select 可编辑下拉框
    String常见问题
    Character类--字符操作
    Android Environment FAQ (Frequently Asked Question)
    Unity Texture 2D Compress
  • 原文地址:https://www.cnblogs.com/daoxiaobai/p/6275446.html
Copyright © 2020-2023  润新知