【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
  • 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对象...
时间: 2024-11-14 23:50:49

【Head First Servlets and JSP】笔记11:cookie的相关文章

JSP笔记:cookie、session

JSP要点:1.为了解决Servlet编写HTML的麻烦. 2.是放在服务器中的,客户端请求JSP时候,服务器会先进行翻译(也就是说访问JSP是经过服务器的),然后将翻译过(类似于Servlet)的返回给客户端. JSP的标签 <%! %> :定义类.变量.方法,生成的是全局变量----不常用. <%= %> :输出语句 ; <%  %> :定义变量.语句,语句最终是以局部变量的形式或者在一个--jspserver方法内部的代码. 参考:ET表达式

【Head First Servlets and JSP】笔记23:Expression Language(EL) 完全攻略

基本上是<Head First Servlets and JSP>内容的整理.扩充.顺便推荐一个供参考的JSP教程:JSP Tutorial内容很全面,还有一些有趣的实例. 完整代码参考 EL隐式对象汇总 pageContext使用参考 EL表达式的基本规则 关于EL的一些细节 通过EL获得request参数 从request得到更多信息 获得Request Method? xxxxScope有意义吗? 通过EL调用函数 EL与数学运算 1.EL隐式对象汇总.如下所示: 更详细的内容可以参考 

《C++ Primer Plus》学习笔记11

<C++ Primer Plus>学习笔记11 第17章 输入.输出和文件 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

JSP总结(二)——Cookie(汇总)

注:后缀为汇总的基本上是整理一些网上的. 1.   什么是Cookie     Cookie是Web服务器保存在用户硬盘上的一段文本.Cookie允许一个Web站点在用户电脑上保存信息并且随后再取回它.     举例来说,一个Web站点可能会为每一个访问者产生一个唯一的ID,然后以Cookie文件的形式保存在每个用户的机器上.     如果用户使用IE浏览器访问Web,用户就会看到所有保存在自己硬盘上的Cookie.它们最常存放的地方是:C:/Windows/Cookies.Cookie是以“关

[Aaronyang] 写给自己的WPF4.5 笔记11[自定义控件-AyImageButton篇 1/4]

我的文章一定要对读者负责-否则不是好文章  ----       www.ayjs.net  aaronyang技术分享 文章导航: 介绍vs2013 WPF开发,属性代码相关技巧 实战AyImageButton 1.0细用慢讲,学会用户控件,依赖属性,属性回调事件 诞生AyImageButton 1.1 支持 控件简单写法,支持自定义AyImageButton写法,提供详细的API 效果图: AyImageButton记录 源码下载:http://pan.baidu.com/s/1eQlHly

sqlite学习笔记11:C语言中使用sqlite之删除记录

最后一节,这里记录下如何删除数据. 前面所有的代码都继承在这里了,在Ubuntu14.04和Mac10.9上亲测通过. #include <stdio.h> #include <stdlib.h> #include "sqlite/sqlite3.h" #define DB_NANE "sqlite/test.db" sqlite3 *db = NULL; char* sql = NULL; char *zErrMsg = NULL; con

lua学习笔记11:lua中的小技巧

lua中的小技巧,即基础lua语言本身的特种,进行一个些简化的操作 一 巧用or x = x or v 等价于: if not x then x = v end 如果x为nil或false,就给他赋值为 二 三元运算符实现 a and b or c 类似C语言: a ? b : c and 的运算由优先级高于or lua学习笔记11:lua中的小技巧,布布扣,bubuko.com

mybatis学习笔记(11)-多对多查询

mybatis学习笔记(11)-多对多查询 mybatis学习笔记11-多对多查询 示例 多对多查询总结 resultMap总结 本文实现多对多查询,查询用户及用户购买商品信息. 示例 查询主表是:用户表 关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关联表:orders.orderdetail.items sql SELECT orders.*, user.username, user.sex, user.address, orderdetail.id orderdeta

mybatis学习笔记(11)-一对多查询

mybatis学习笔记(11)-一对多查询 mybatis学习笔记11-一对多查询 示例 小结 本文实现一对多查询,查询订单及订单明细的信息 示例 sql 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一查询基础上添加订单明细表关联即可. SELECT orders.*, user.username, user.sex, user.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.item

学习笔记11

目前正在专修CSS这一块,现在对内联元素和块元素进行深入的学习一下: 内联元素(inline element)一般都是基于语义级(semantic)的基本元素.内联元素只能容纳文本或者其他内联元素,常见内联元素"a". 块元素(block element)和内联元素(inline element)都是html规范中的概念.块元素和内联元素的基本差异是块元素一般都从新行开始.而当加入了css控制以后,块元素和内联元素的这种属性差异就不成为差异 了.比如,我们完全可以把内联元素cite加上