zoukankan      html  css  js  c++  java
  • 【Head First Servlets and JSP】笔记11:cookie

    容器如何知道客户是谁?(这并不是HTTP能实现的!IP地址不能唯一的标识用户,另外,非必要不采用HTTPS

    继续mark孤傲苍狼的博客,百科全书

    cookie——Header——字典——键值对——

    延长cookie的保质期

    容器会做cookie的所有工作!

    1、先搭建一个简单的测试程序——使用cookie记录用户上一次访问的时间(tomcat+web.xml+servlet

    <?xml version="1.0" encoding="ISO-8859-1" ?>
    
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
             version="2.4">
    
        <servlet>
            <servlet-name>test cookie</servlet-name>
            <servlet-class>com.example.web.TestCookie</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>test cookie</servlet-name>
            <url-pattern>/testCookie.do</url-pattern>
        </servlet-mapping>
    
    </web-app>
    package com.example.web;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.*;
    import java.io.*;
    import java.util.Date;
    
    public class TestCookie extends HttpServlet {
        @Override
        public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setCharacterEncoding("UTF-8"); // 不加这句输出中文会乱码!
            resp.setContentType("text/html");
    
            PrintWriter out = resp.getWriter();
    
            Cookie[] cookies = req.getCookies(); // 获取浏览器访问服务器时传递过来的cookie数组
    
            // 如果用户是第一次访问,那么得到的cookies将是null
            if (cookies != null) {
                out.write("您上次访问的时间是:");
    
                for (int i = 0; i < cookies.length; ++i) {
                    Cookie cookie = cookies[i];
                    if (cookie.getName().equals("lastAccessTime")) {
                        Long lastAccessTime = Long.parseLong(cookie.getValue());
                        Date date = new Date(lastAccessTime);
                        out.write(date.toString());
                    }
                }
            }else {
                out.write("这是您第一次访问本站!");
            }
    
            // 用户访问过之后重新设置用户的访问时间,存储到cookie中,然后发送到客户端浏览器
            Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+""); // 创建一个cookie,cookie的名字是lastAccessTime
            resp.addCookie(cookie); // 将cookie对象添加到response对象中,这样服务器在输出response对象中的内容时就会把cookie也输出到客户端浏览器
        }
    
        @Override
        public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doPost(req, resp);
        }
    }

    不管怎样,先把程序跑起来,初次体验一下被自己写的servlet“记住”的感觉,不过糟糕的是,重启浏览器后,它就会把你“忘”了。

    好吧,事实上服务器并不记得你,不过是根据客户端发来的cookie做出一系列响应罢了。

    2、什么是cookie?

    小时候,经常遇到玩网页游戏打不开页面的情况,这个时候会打开“浏览器工具箱”清除一下cookie...

    曾经有一位前辈是这样告诉我的,cookie就是“字典”(一头雾水,看过书之后,我更新了这个认识。

    那么,到底什么是cookie呢?

    cookie就是一个Header,

    结合1中的小程序,在响应中它大概长这个样子:

    Set-Cookie:lastAccessTime=1496524276849
    而在请求中它是这个样子的:
    Cookie:lastAccessTime=1496524103876,
    关掉浏览器重启后他在请求首部的集合中根本不存在!
    这样的话,我们可以推断,
    • cookie是需要服务端来设置的,不设置就没有!难怪响应中叫Set-Cookie,(后来发现可以直接在request中添加cookie)
    • cookie可以保存在客户端的浏览器中,并且默认情况下,有效期仅限于“一个浏览器周期”。(浏览器开启到关闭的时期)

    既然cookie存在本地,那我们有没方法可以查看呢?显然是可以的。

    3、容器如何知道客户是谁?

    cookie——“号码牌”

    容器必须以某种方式把会话ID作为响应的一部分交给客户,

    而客户必须把会话ID作为请求的一部分发回,

    最简单、最常用的是通过cookie交换这个会话信息。

    4、延长cookie的“保质期”

     这是一项很容易的工作,只要把cookie保存的本地就可以了!

    参考apache的api,要完成这件事情,需要借助setMaxAge(int expiry) 修改1中的代码:

            Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+""); // 创建一个cookie,cookie的名字是lastAccessTime
    
            cookie.setMaxAge(60); // 给cookie加个期限,单位是秒
    
            resp.addCookie(cookie); // 将cookie对象...
  • 相关阅读:
    深入理解.NET(第2版.英文影印版)书评
    揭示同步块索引(上):从lock开始
    【读书笔记】.NET本质论第一章 The CLR as a Better COM
    【翻译】TestAfter Development is not TestDriven Development
    【读书笔记】.NET本质论第二章Components(Part One)
    Python和Ruby:流行动态脚本语言之特点对比
    C++ Unit Testing Framework: A Boost Test Tutorial——part2:Using Boost Test
    组态软件开发(zz)
    用于实现拖入操作的通用类
    找到一个脚本引擎
  • 原文地址:https://www.cnblogs.com/xkxf/p/6939767.html
Copyright © 2011-2022 走看看