[Java] Servlet工作原理之二:Session与Cookie
(未完成)
一、Cookie与Session的使用简介
1 Cookie
Cookie 用于记录用户在一段时间内的行为,它有两个版本:Version 0 和 Version 1,分别对应两种响应头 Set-Cookie 和 Set-Cookie2,但是 Servlet 规范中不支持 Set-Cookie2 响应头,在实际中 Set-Cookie2 的属性可以设置在 Set-Cookie 中。
Version 0 的属性如下

Version 1 的属性如下

当访问某个 URL 时,浏览器会根据 URL 将符合条件的 Cookie 放入请求头中,在服务器中通过 HttpServletResquest 的 getCookies() 方法可以获取到客户端发送来的 Cookie 对象的数组,Cookie 的方法如下:
- public void setValue(String newValue) // 设置 Cookie 的值
- public void setComment(String purpose) // 用来描述cookie的用途
- public void setDomain(String pattern) // 指定cookie的域
- public void setPath(String uri) // 指定的目录中的所有页面以及该目录的子目录中的所有页面都可以看到该cookie
- public void setMaxAge(int expiry) // 设置最大过期时间,负值则储存在内存中,浏览器关闭时就过期
- public void setVersion(int v) // 设置 Cookies 版本,0或1
- public void setSecure(boolean flag) // cookie 是否仅使用安全协议发送,如HTTPS或SSL
- public String getName()
- public String getValue()
- public String getComment()
- public String getDomain()
- public String getPath()
- public int getMaxAge()
- public int getVersion()
- public boolean getSecure()
- public Object clone()
如果需要创建一个 Cookie 对象,只需要 Cookie cookie = new Cookie("username", "tengyunhao") 即可创建,但是自己创建的 Cookie 的 name 不能和它自带属性值的名称一样,否则会抛出异常。当 Cookie 的属性中出现 Version 1 的属性时,则响应头会将 Version 值设为1,属性中出现 TOKEN 字符时(如“\”、“,”等)也会设 Version 值为 1。
2 Session
Cookie 可以用来记录客户端的访问信息,但它储存在客户端中,每次请求时客户端都需要传输这些 Cookie,如果 Cookie 很多就增加了传输的负担,而使用 Session 可以解决这个问题。Session 储存在服务器中,每次客户端只需要传输一个 Session 的 ID,通过这个 ID 来找到客户端对应的 Session,这个 ID 通常以 JSESIONID 为名储存在 Cookie 中,这个 Cookie 储存在内存中,浏览器关闭则过期。
当收到请求时,如果从 Cookie(或请求参数)中能获取 JSESIONID 值,则根据这个值查找 session 对象,如果获取不到 JSESIONID 值或 session 对象已经过期,则创建一个新的 session 对象,并 JSESIONID 值设置到响应头中。HttpSession 是一个接口,它的方法如下:
- public String getId();
- public long getCreationTime(); // 返回 session 创建时间
- public long getLastAccessedTime(); // 客户端最后请求时间
- public void setMaxInactiveInterval(int interval); // 设置超时时间,单位为秒
- public int getMaxInactiveInterval();
- public ServletContext getServletContext();
- public Enumeration getAttributeNames();
- public Object getAttribute(String name);
- public void setAttribute(String name, Object value);
- public void removeAttribute(String name);
- public void invalidate(); // 销毁当前 session
- public boolean isNew();
二、分布式的 Session 框架
从上面可以知道 Session 和 Cookie 各自优点和缺点,在大型的互联网系统中,单独使用两者都不可行。
[Java] Servlet工作原理之二:Session与Cookie的更多相关文章
- Java Servlet 工作原理问答
导读 本文来自stackoverflow的问答,讨论了Java Servlet的工作机制,如何进行实例化.共享变量和多线程处理. 问题:Servlet是如何工作的?Servlet 如何实例化.共享变量 ...
- 【译】Stackoverflow:Java Servlet 工作原理问答
导读 本文来自stackoverflow的问答,讨论了Java Servlet的工作机制,如何进行实例化.共享变量和多线程处理. 问题:Servlet 是如何工作的?Servlet 如何实例化.共享变 ...
- [Java] Servlet工作原理之一:体系结构及其容器
一.Servlet体系结构 在 servlet-api.jar (2.5) 中有两个包:javax.servlet 和 javax.servlet.http 1 Servlet ...
- [Java] SpringMVC工作原理之二:HandlerMapping和HandlerAdapter
一.HandlerMapping 作用是根据当前请求的找到对应的 Handler,并将 Handler(执行程序)与一堆 HandlerInterceptor(拦截器)封装到 HandlerExecu ...
- [Java] SpringMVC工作原理之一:DispatcherServlet
一.DispatcherServlet 处理流程 在整个 Spring MVC 框架中,DispatcherServlet 处于核心位置,它负责协调和组织不同组件完成请求处理并返回响应工作.在看 Di ...
- HTTP协议 Servlet入门 Servlet工作原理和生命周期 Servlet细节 ServletConfig对象
1 HTTP协议特点 1)客户端->服务端(请求request)有三部份 a)请求行--请求行用于描述客户端的请求方式.请求的资源名称,以及使用的HTTP协议版本号 请求行中的GET ...
- JSP+JavaBean+Servlet工作原理实例…
JSP+JavaBean+Servlet工作原理实例讲解 首先,JavaBean和Servlet虽都是Java程序,但是是完全不同的两个概念.引用mz3226960提出的MVC的概念,即M-model ...
- Java虚拟机工作原理详解 (一)
一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘当中.然后你在命令行中输入 javac YourClassNam ...
- Java虚拟机工作原理详解
原文地址:http://blog.csdn.net/bingduanlbd/article/details/8363734 一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了 ...
随机推荐
- 浅谈android Service和BroadCastReceiver
1.题记 Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序. 广播接收者(BroadcastRece ...
- linux centos 中Tomcat的安装和自启动配置
Tomcat的安装和自启动配置将tomcat添加为linux系统服务,网上找到了很多方法,其中比较简单的如下:方法一:(亲测有效)1. 首先需要将$Tomcat_HOME/bin目录下的catalin ...
- Docker-安装(CentOS7)
1.安装需要的软件包:yum-util提供yum-config-manager功能 yum install -y yum-utils device-mapper-persistent-data lvm ...
- NO.3:自学tensorflow之路------MNIST识别,神经网络拓展
引言 最近自学GRU神经网络,感觉真的不简单.为了能够快速跑完程序,给我的渣渣笔记本(GT650M)也安装了一个GPU版的tensorflow.顺便也更新了版本到了tensorflow-gpu 1.7 ...
- 区块链学习:Windows下搭建以太坊私有链环境
一:安装geth客户端 Windows要求必须是64位系统,从官方网站下载编译好的win64客户端,下载解压后只有一个Geth.exe问价,运行安装即可,下载地址如下: https://github. ...
- 12.18daily_scrum
本软件中的最后一个界面——“关于”界面的设计已经开始进行,数据传输的内容也差不多进行过半,最主要的任务依旧在测试过程中,我们组接下来还是要大力加强测试的强度和数量,注意边际数据和错误数据的测试处理: ...
- 【Alpha】第三次Scrum meeting
今日任务一览: 导航栏诞生 前期准备的Latex文本将撰写完毕 生成燃尽图的问题已经解决 姓名 今日完成任务 所耗时间 刘乾 用Github成功生成了燃尽图(真是不容易啊...),与架构师继续每日面基 ...
- 【Alpha】第八次Scrum meeting
今日任务一览: 姓名 今日完成任务 所耗时间 刘乾 学习js并学会使用js读写xml文件.学习python读取xml的方式... 然后上午满课,下午从1点到10点当计组助教去沙河教了一下午+一晚上,所 ...
- OpenState安装及 Port Knocking 实验
OpenState安装及 Port Knocking 实验 目录 OpenState安装 Port Knocking 实验 OpenState安装及 Port Knocking 实验 OpenStat ...
- 第二个spring冲刺第5天
针对与昨天的讨论内容,今天进行了开会研讨给意见. 在今天中有了点进展,各方面都有改善,离程序的完成度又前进了一大步.