zoukankan      html  css  js  c++  java
  • Cookie技术

    u  常用的API

    创建Cookie对象

    Cookie(String name, String value)    ->以指定数据创建Cookie对象

    设置Cookie对象

    void setMaxAge(int expiry)                ->设置Cookie的最大有效时间

    void setPath(String uri)                             ->设置Cookie的有效路径

    void setDomain(String pattern)            ->设置Cookie的有效域

    发送Cookie对象

    void addCookie(Cookie cookie)           ->发送Cookie对象

    获取Cookie对象

    Cookie[] getCookies()                         ->获取用户请求中的Cookie数组

    获取Cookie中携带信息

    int getMaxAge()                                ->获取Cookie的最大有效时间

    String getName()                               ->获取Cookie的名字

    String getValue()                               ->获取Cookie存储的值

    String getDomain()                            ->获取Cookie的有效域

    String getPath()                                 ->获取Cookie的有效路径

      读和写多个Cookie

    如果给客户端输出多个Cookie对象,那么服务器会创建多个

    Set-Cookie: name=jack; Expires=Wed, 16-Jan-2013 07:02:01 GMT

    Set-Cookie: password=root; Expires=Wed, 16-Jan-2013 07:02:01 GMT头字段进行Cookie的发送。

    多个Cookie在浏览器缓存中以一个文件的形式进行存储。

    浏览器使用一个Cookie: name=jack; password=root带多个Cookie数据。

     Cookie有效路径

    以上的代码在第一次写回Cookie后,如果后面继续请求该网站的其他资源,那么还会继续携带Cookie对象直到Cookie过期。但是如果访问不同网站那么不带该Cookie。

    cookie2.setPath("/day08/read");

    Set-Cookie: password=root; Expires=Wed, 16-Jan-2013 07:25:06 GMT; Path=/day08/read

    存储的时候由于两个Cookie的有效路径不同,因此存储在不同的Cookie文件中。

    但是指定有效路径的Cookie文件中多了有效路径的值。

    password

    root

    localhost/day08/read

    但是如果现在需要在不同的网站中传递Cookie对象,那么如何指定有效路径。

    cookie2.setPath("/");   à 指定Cookie的有效路径是tomcat的webapps目录

      Cookie的跨域

    假定A服务器上发布一个网站叫CMS系统,域名www.sina.com.cn

    在CMS系统中可以直接编写一个写Cookie的Servlet。但是要设置该Cookie的有效域。

    cookie.setDomain(“.163.com”);

    假定B服务器上发布一个网站叫IT系统,域名www.163.com

    编写一个获取Cookie数据的Servlet进行Cookie的数据读取。

    总结:

    1. 可以实现自动登录。用户名和密码默认是明码的。开发者需要自定义加密。Md5 Base64
    2. 购物车的商品ID信息
    3. 存储用户上次的登录时间

    使用Cookie实现显示用户的上次访问时间

     1 public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
     2          // 页面输出
     3          response.setCharacterEncoding("utf-8");
     4          response.setContentType("text/html;charset=utf-8");
     5          request.setCharacterEncoding("utf-8");
     6          // 获取字符输出流对象
     7          PrintWriter out = response.getWriter();
     8          // 获取Cookie数组对象
     9          Cookie [] cookies = request.getCookies();
    10          // 定义一个时间的字符串变量
    11          String date = null;
    12          // 定义一个变量存储系统当前日期
    13          Date current_date = new Date();
    14          SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    15          // 判断是否是第一次登陆
    16          if(cookies != null){
    17              // 直接循环
    18              for(Cookie cookie : cookies){
    19                  // 获取Cookie
    20                  if("lasttime".equals(cookie.getName())){
    21                      // 获取上次访问的时间
    22                      date = cookie.getValue(); 
    23                      break;
    24                  }else{
    25                      // 获取系统时间
    26                      date = format.format(current_date);
    27                  }
    28              }
    29          }else{
    30              // 获取系统时间
    31              date = format.format(current_date);
    32          }
    33          // 显示时间
    34          out.println(date);
    35          // 将这次访问的时间写入Cookie
    36          Cookie new_cookie = new Cookie("lasttime",
    37 format.format(new Date())); 
    38          new_cookie.setMaxAge(5*60);
    39          new_cookie.setPath("/day08/showtime");
    40          // 发送
    41          response.addCookie(new_cookie);
    42     }

     如果cookie没有调用setMaxAge方法,这个cookie没被放在文件里,而是放在客户端浏览器的内存中。

    Cookie细节

    1. 一个Cookie只能存储一种信息。
    2. 一个网站可以发送多个Cookie,浏览器可以同时携带多个Cookie。
    3. 同一个网站最多发送20个Cookie,浏览器最多存储300个Cookie,一个Cookie最多存储数据在4K以内。
    4. 如果创建了Cookie对象没有指定最大有效时间那么不会存储在浏览器的缓存中。
  • 相关阅读:
    .net core读取appsettings.config中文乱码问题
    vs2017错误:当前页面的脚本发生错误
    VS Code中无法识别npm命令
    Visual Studio报错/plugin.vs.js,行:1074,错误:缺少标识符、字符串或数字
    记录一次在生成数据库服务器上出现The timeout period elapsed prior to completion of the operation or the server is not responding.和Exception has been thrown by the target of an invocation的解决办法
    Java集合框架
    java hash表
    Java Dictionary 类存储键值
    java数据结构 栈stack
    java封装
  • 原文地址:https://www.cnblogs.com/friends-wf/p/3732195.html
Copyright © 2011-2022 走看看