zoukankan      html  css  js  c++  java
  • Cookie机制

    一:核心原理介绍

    1.介绍(包括核心机制)

      是客户端保持http状态信息的方案

      由WEB服务器在http响应消息头请求中附带的传递给浏览器的一个小文本文件

      一旦浏览器保存了某个cookie,那么在以后每次的访问服务器时,都会在http请求头将这个cookie回传给服务器

      cookie只能标识一种信息,一个name和value

      cookie存储在浏览器的内存中,浏览器被关掉后,浏览器端的cookie被删除

     

    2.程序(产生与获取cookie)

      读取只能读取到的是数组,通过遍历找到需要的cookie。

     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=ISO-8859-1">
     7 <title>Insert title here</title>
     8 </head>
     9 <body>
    10     <%
    11         //获取cookie
    12         Cookie[] cookies=request.getCookies();
    13         if(cookies!=null&&cookies.length>0){
    14             for(Cookie cook:cookies){
    15                 out.println(cook.getName()+":"+cook.getValue());
    16             }
    17         }else{
    18             out.println("没有cookie,正在创建并返回");
    19             //创建一个cookie
    20             Cookie cookie=new Cookie("name","abcd");
    21             //将cookie传递给客户端
    22             response.addCookie(cookie);
    23         }
    24     %>
    25 </body>
    26 </html>

    3.效果

      

    4.会话Cookie的发送

      发送cookie需要HttpServletResponse的addCookie方法,将cookie插入到一个Set-Cookie响应包头中,这个方式不修改之前的报头,而是创建新的报头,因此,称之为addCookie,而不是setCookie。

      

    5.持久cookie

      如果设置了时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效。

      存储在硬盘上的cookie可以在不同的浏览器上进行共享

      cookie.setMaxAge(30)方式来设置,以秒为单位,如果为0表示立刻删除,如果是负数,表示不存储,为正数,表示cookie存储的时间。

    6.程序

     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=ISO-8859-1">
     7 <title>Insert title here</title>
     8 </head>
     9 <body>
    10     <%
    11         //获取cookie
    12         Cookie[] cookies=request.getCookies();
    13         if(cookies!=null&&cookies.length>0){
    14             for(Cookie cook:cookies){
    15                 out.println(cook.getName()+":"+cook.getValue());
    16             }
    17         }else{
    18             out.println("没有cookie,正在创建并返回");
    19             //创建一个cookie
    20             Cookie cookie=new Cookie("name","abcd");
    21             cookie.setMaxAge(30);
    22             //将cookie传递给客户端
    23             response.addCookie(cookie);
    24         }
    25     %>
    26 </body>
    27 </html>

    7.效果

      再次打开浏览器,cookie依然存在。

    二:自动登录

    1.login.jsp

     1 <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
     2     pageEncoding="ISO-8859-1"%>
     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=ISO-8859-1">
     7 <title>Insert title here</title>
     8 </head>
     9 <body>
    10     <form action="index.jsp" method="post">
    11         Name:<input type="text" name="userName"/>
    12         <input type="submit" value="Submit"/> 
    13     </form>
    14 </body>
    15 </html>

    2.index.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=ISO-8859-1">
     7 <title>Insert title here</title>
     8 </head>
     9 <body>
    10     <!-- 如果没有请求参数,也没有cookie中寻找到合适的参数,就返回去登录,因此
    11     只要有其中一个就可实现自动登录 -->
    12     <%
    13         String name=request.getParameter("userName");
    14         if(name!=null&&!name.trim().equals("")){
    15             //
    16             Cookie cookie=new Cookie("userName",name);
    17             cookie.setMaxAge(50);
    18             response.addCookie(cookie);
    19         }else{
    20             Cookie[] cookies=request.getCookies();
    21             if(cookies!=null&&cookies.length>0){
    22                 for(Cookie cook:cookies){
    23                     String cookieName=cook.getName();
    24                     if("userName".equals(cookieName)){
    25                         String val=cook.getValue();
    26                         name=val;
    27                     }
    28                 }
    29             }
    30         }
    31         if(name!=null&&!name.trim().equals("")){
    32             out.print("hello"+name);
    33         }else{
    34             response.sendRedirect("login.jsp");
    35         }
    36     %>
    37 </body>
    38 </html>

    3.效果

      

      在一定的时间内,不需要到login.jsp登录,打开浏览器就可以直接进这个页面。

    三:显示最近浏览的物品

    1.books.jsp

     1 <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
     2     pageEncoding="ISO-8859-1"%>
     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=ISO-8859-1">
     7 <title>Insert title here</title>
     8 </head>
     9 <body>
    10     <h2>Books Page</h2><br/><br/>
    11     <a href="book.jsp?book=JavaWeb">JavaWeb</a><br/>
    12     <a href="book.jsp?book=Java">Java</a><br/>
    13     <a href="book.jsp?book=Oracle">Oracle</a><br/>
    14     <a href="book.jsp?book=H5">H5</a><br/>
    15     <a href="book.jsp?book=AJax">AJax</a><br/>
    16     <a href="book.jsp?book=JDBC">JDBC</a><br/>
    17     <a href="book.jsp?book=Spring">Spring</a><br/><br/><br/>
    18     
    19     <!--  -->
    20     <%
    21         Cookie[] cookies=request.getCookies();
    22     
    23         if(cookies!=null&&cookies.length>0){
    24             for(Cookie cook:cookies){
    25                 String name=cook.getName();
    26                 if(name.startsWith("AT_TOP")){
    27                     out.println(cook.getValue());
    28                     out.println("<br>");
    29                 }
    30             }
    31         }
    32     %>
    33 </body>
    34 </html>

    2.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=ISO-8859-1">
     9 <title>Insert title here</title>
    10 </head>
    11 <body>
    12     <h2>Book Details</h2>
    13     Book:<%=request.getParameter("book") %><br><br>
    14     
    15     <a href="books.jsp">Return</a>
    16     
    17     <% 
    18         //获取request传进来的book
    19         String book=request.getParameter("book");
    20         /*
    21             确定要删除的Cookie
    22         */
    23         Cookie[] cookies=request.getCookies();
    24         List<Cookie> bookCookies=new ArrayList<>();
    25         Cookie tmpCookie=null;//存放和book.jsp传入的book匹配的那个cookie
    26         if(cookies!=null&&cookies.length>0){
    27             for(Cookie cook:cookies){
    28                 String name=cook.getName();
    29                 if(name.startsWith("AT_TOP")){
    30                     bookCookies.add(cook);
    31                     if(cook.getValue().equals(book)){
    32                         tmpCookie=cook;
    33                     }
    34                 }
    35             }
    36         }
    37         if(bookCookies.size()>=5&&tmpCookie==null){
    38             tmpCookie=bookCookies.get(0);
    39         }
    40         if(tmpCookie!=null){
    41             tmpCookie.setMaxAge(0);
    42             response.addCookie(tmpCookie);
    43         }
    44         /*
    45             将book.jsp获得的book作为cookie进行回传
    46         */
    47         Cookie cookie=new Cookie("AT_TOP"+book,book);
    48         response.addCookie(cookie);
    49     %>    
    50 </body>
    51 </html>

    3.效果

      

    四:Cookie路径

    1.结论

      作用范围:可以作用当前目录与当前目录的子目录,但是,不能作用与当前目录的上一级目录。

      

    2.解决上面的问题

      设置cookie的作用范围:

        cookie.setPath(request.getContextPath());

        然后:

        response.addCookie(cookie);

        就可以在上一级获取到在此处增加的cookie。

      其中:

        / 表示站点

        request.getContextPath()表示应用的根目录。

  • 相关阅读:
    nginx 启用php解析及解决无法访问报错Primary script unknown的过程
    百度云服务器连接码云的坑
    async函数测试
    centos6.8安装mysql5.7及用navicat远程连接
    JavaScript模块知识理解
    为什么if else 语句里不能用函数声明定义函数,而可以用函数表达式定义函数
    Java8-对map过滤
    git cherry-pick 的使用
    Java8-对map排序
    Java8过滤器(Filter)
  • 原文地址:https://www.cnblogs.com/juncaoit/p/7441208.html
Copyright © 2011-2022 走看看