容器如何知道客户是谁?(这并不是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对象...

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

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

    基本上是<Head First Servlets and JSP>内容的整理.扩充.顺便推荐一个供参考的JSP教程:JSP Tutorial内容很全面,还有一些有趣的实例. 完整代码参考 ...

  2. Python3+Selenium3+webdriver学习笔记11(cookie处理)

    #!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记11(cookie处理)'''from selenium im ...

  3. Spring MVC 学习笔记11 —— 后端返回json格式数据

    Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...

  4. 机器学习实战 - 读书笔记(11) - 使用Apriori算法进行关联分析

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第11章 - 使用Apriori算法进行关联分析. 基本概念 关联分析(associat ...

  5. Ext.Net学习笔记11:Ext.Net GridPanel的用法

    Ext.Net学习笔记11:Ext.Net GridPanel的用法 GridPanel是用来显示数据的表格,与ASP.NET中的GridView类似. GridPanel用法 直接看代码: < ...

  6. SQL反模式学习笔记11 限定列的有效值

    目标:限定列的有效值,将一列的有效字段值约束在一个固定的集合中.类似于数据字典. 反模式:在列定义上指定可选值 1. 对某一列定义一个检查约束项,这个约束不允许往列中插入或者更新任何会导致约束失败的值 ...

  7. JAVA自学笔记11

    JAVA自学笔记11 1:Eclipse的安装 2:用Eclipse写一个HelloWorld案例,最终在控制台输出你的名字 A:创建项目 B:在src目录下创建包.cn.itcast C:在cn.i ...

  8. golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好

    golang学习笔记11   golang要用jetbrain的golang这个IDE工具开发才好  jetbrain家的全套ide都很好用,一定要dark背景风格才装B   从File-->s ...

  9. Python标准库笔记(11) — Operator模块

    Operator--标准功能性操作符接口. 代码中使用迭代器时,有时必须要为一个简单表达式创建函数.有些情况这些函数可以用一个lambda函数实现,但是对于某些操作,根本没必要去写一个新的函数.因此o ...

  10. 强化学习读书笔记 - 11 - off-policy的近似方法

    强化学习读书笔记 - 11 - off-policy的近似方法 学习笔记: Reinforcement Learning: An Introduction, Richard S. Sutton and ...

随机推荐

  1. VLC WebPlugin中文

    Documentation:WebPlugin 这篇文档讲述的是 VLC media player Web plugins 和怎样在网页使用它 Contents 1 介绍: 构建包含video的Web ...

  2. Linux 实用工具vi

    vi有输入和命令两种工作模式.命令模式是用来运行一些编排文件.存档以及离开vi等操作命令. 当执行vi后,首先进入命令模式,此时输入的人数字符都被视为命令. 在命令模式下,可以使用如下两个键进入文本输 ...

  3. 解决pip安装模块报错Cannot fetch index base URL http://pypi.python.org/simple/

    产生这个问题的原因呢和github一样,因为他们用的cdn被墙.经小伙伴反馈,解决办法如下. 通过指定国内镜像源来安装: pip --trusted-host 镜像源 install 模块名 -i 镜 ...

  4. Xcode中授权普通成员

    问题: 在普通用户账户下使用系统的Xcode在编译通过时候会提示” Developer Tools Access“需控制另一进程,需要输入“Developer Tools”组用户名密码才能继续调试 解 ...

  5. 猜数字游戏-python

    题目: 用python写一个猜数字的游戏,游戏规则如下: 1.由一个人随机写一个整数1-99(如:21) 2.一群小伙伴轮流猜数字,如第一个人猜一个数(如:48),则缩小范围至(1-48) 3.如第二 ...

  6. scrapy初体验 - 安装遇到的坑及第一个范例

    scrapy,python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.scrapy用途广泛,可以用于数据挖掘.监测和自动化测试.scrapy的安装稍 ...

  7. LUA速成教程

    說明: 1.該教程適合對編程有一定了解的人員. 2.該教程在WINDOWS下實驗. 切入正題, 1.首先下載Notepad++,工欲善其事,必先利其器,然後安裝NotePad++的插件NppExec. ...

  8. python学习【第七篇】python文件操作

    一.文件操作过程 1. 打开文件,得到文件句柄并赋值给一个变量2. 通过句柄对文件进行操作3. 关闭文件 # 1.打开文件,得到文件句柄 f_handle = open('aa.txt', 'r', ...

  9. 【BZOJ3325】[Scoi2013]密码 Manacher

    [BZOJ3325][Scoi2013]密码 Description Fish是一条生活在海里的鱼.有一天他很无聊,就到处去寻宝.他找到了位于海底深处的宫殿,但是一扇带有密码锁的大门却阻止了他的前进. ...

  10. knockoutJs在移动设备上有时无法更新控件值

    最近在用cordova(phonegap)写一个移动app,表单比较复杂,用了knockoutJs作为前端的MVVM框架进行数据绑定. 但是发现有时候(其实是每次)如果最后在input中编辑一个值,然 ...