一. 问题?

  HTTP协议是一种无状态协议,服务器本身无法识别出哪些请求是同一个浏览器发出的,浏览器的每一次请求都是独立的。现实业务中服务器有时候需要识别来自同一个浏览器的一系列请求,例如购物车,登录状态记录;所以 WEB 服务器必须能够采用一种机制来唯一的标识一个用户,并且记录该用户的状态。

二. 会话和会话状态

1.WEB 应用中的会话是指一个客户端浏览器与 WEB 服务器之间连续发生的一系列请求和响应过程

2.WEB 应用的会话状态是指 WEB 服务器与浏览器在会话过程中产生的状态信息,借助会话状态,WEB 服务器能够把属于同一个会话的一系列请求和响应过程关联起来

在 Servlet 规范中,常用以下两种机制完成会话跟踪:cookie 和 session

三. cookie机制

1. cookie 机制采用的是在客户端保持 HTTP 状态信息的方案。cookie 是在浏览器访问 WEB 服务器的某个资源时,由 WEB 服务器在 HTTP 响应消息头中附带传送给浏览器的一个小文本文件。一旦浏览器保存了某个 cookie,那么它在以后每次访问服务器时,都会在 HTTP 请求头中将这个 cookie 回传给服务器,供服务器识别本次会话状态。

2.底层实现原理

  WEB 服务器通过在 HTTP 响应消息中增加 Set-Cookie 响应头字段将 cookie 信息发送给浏览器;浏览器则通过在 HTTP 请求头中增加 Cookie 字段回传给 WEB 服务器。

3.cookie的特性

  a. 一个 cookie 只能标识一种信息,至少包含一个标识信息的名称(name)和设置值(value)

  b. 一个服务器可以给一个浏览器发送多个 cookie, 一个浏览器可以存储多个服务器提供的 cookie。

  c. 浏览器一般允许存放300个 cookie, 每个站点最多存放20个 cookie,每个 cookie 的大小限制为4KB

4. cookie相关的类和方法

  ① Servlet中提供了一个 javax.servlet.http.Cookie类来封装 cookie 信息,它包含有生成 cookie 信息和提取 cookie 信息各个属性的方法。

    Cookie类的方法:

      public Cookie(String name, String value)  构造方法

      getName()

      setValue(String value) 和 getValue()

      setMaxAge 和 getMaxAge(int ms)

      setPath 和 getPath

  ② HttpServletResponse接口中定义了一个 addCookie 方法,它用于在发送给浏览器的 HTTP 响应信息中增加一个 Set-Cookie 的响应头字段

  ③ HttpServletRequest 接口中定义了一个 getCookies 方法, 它用于从 HTTP 请求信息的 cookie 请求头字段中读取所有的 cookie 信息。

5. 代码示例

  ① cookie 的发送

    发送 cookie 需要使用 HttpServletResponse接口的 addCookie 方法,将 cookie 插入到Set-Cookie 的 HTTP响应头中。由于这个方法并不修改之前的任何 cookie, 而是创建新的 cookie,因此此方法是 addCookie。

  ② cookie 的读取

    使用 HttpServletRequest 接口的 getCookies 方法获取一个 Cookie 数组,然后对数组进行遍历,调用 Cookie 的 getName() 和 getValue() 方法

  浏览器第一次请求,无cookie,第二请求显示cookie

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page session="false" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> <%
// 在Servlet规范中使用Cookie类代表cookie //3.从request中获取Cookie
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (Cookie c : cookies) {
out.println(c.getName() + ": " + c.getValue());
out.println("<br>");
}
} else {
out.println("No cookie,now creating...");
//1.创建一个Cookie对象
Cookie cookie = new Cookie("name", "byron"); //2.调用response的方法把Cookie传递给客户端
response.addCookie(cookie);
} %>
</body>
</html>

6. 会话 cookie 和 持久 cookie

  1.如果创建了一个 cookie, 并将其发送到浏览器,默认情况下它是一个会话级别的 cookie;存储在浏览器的内存中,用户退出浏览器之后被删除。

  2.若希望浏览器将该 cookie 存储在硬盘上,则需要设置MaxAge最大时效(单位为秒的时间值),此为持久 cookie。

  ① 将最大时效设为0则是命令浏览器删除该 cookie。

  ② 如果设置了过期时间,浏览器就会把 cookie 保存到硬盘上,关闭浏览器后再次打开,cookie 依然有效直到设定的超时时间

  ③ 持久 cookie可以在不同的浏览器进程间共享。

7. cookie 的作用范围

  cookie 可以作用于当前目录及其子目录,但不能作用于当前目录的上一级目录。

  例:假设在 WebContent 目录下有文件 cookieWrite.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> <%
// cookie 可以作用于当前目录及其子目录,但不能作用于当前目录的上一级目录。
Cookie cookie = new Cookie("cPath", "value");
response.addCookie(cookie);
%> <a href="path/cookieRead.jsp">To Read Cookie Page</a>
</body>
</html>

       WebContent下有 path/cookieRead.jsp子目录及文件

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> <%
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (Cookie c : cookies) {
if ("cPath".equals(c.getName())) {
out.println(c.getValue());
}
}
}
%> </body>
</html>

则cookieRead.jsp页面上是可以显示cookie的值。

若将 cookieWrite.jsp 和 cookieRead.jsp 的路径互换,且cookieWrite.jsp内修改如下,则无法显示cookie的值。

<a href="../cookieRead.jsp">To Read Cookie Page</a>

  解决方法:设置cookie的作用范围

<%
Cookie cookie = new Cookie("cPath", "value");
// 设置作用范围
cookie.setPath(request.getContextPath());
response.addCookie(cookie);
%>

Servlet/JSP-05 Cookie的更多相关文章

  1. jsp 入门 cookie session

    Java Server Page ==> 服务器端的动态页面资源.用来做显示的功能. JSP构成 ==> HTML 脚本代码 标签构成. JSP 原理 ==> 实际上就是 servl ...

  2. servlet&jsp高级:第三部分

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  3. Servlet&jsp基础:第四部分

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  4. Servlet&JSP基础

    Servlet     JSP     JSP四种基本语法:     JSP注释<%--注释内容-->     JSP声明<%!变量.函数%>     JSP表达式<%= ...

  5. Servlet&JSP中的知识点

    先sun提出的是Servlet体系,这个体系使得使用JAVA的程序员也能开发基于B/S架构的WEB应用程序,使用Servlet类将HTTP请求和响应封装在标准JAVA类中来实现各种WEB应用方案.随着 ...

  6. 马士兵Servlet&Jsp学习

    Servlet&JSP 1>http常见错误信息:  404--url地址找不找,  403--禁止访问  500--服务器内部错误  2>Servlet的生命周期:  *生命全过 ...

  7. ④品茶看<Servlet&JSP>-EL表达式

    前言 今早,概率课偷了下小懒写的: 泡一杯红茶,ACM集训前,写篇博客记录记录EL表达式. #EL介绍 ①EL 语法 ②访问JavaBean等 ③EL隐式对象 ④EL运算符 EL介绍 EL 全名为Ex ...

  8. 小峰servlet/jsp(1)

    一.scriptlet标签: 通过scriptlet标签我们可以可以在jsp理嵌入java代码: 第一种:<%! %>  可以在里面定义全局变量.方法.类: 第二种:<% %> ...

  9. 超全面的JavaWeb笔记day11<JSP&Session&Cookie&HttpSession>

    1.JSP 2.回话跟踪技术 3.Cookie 4.HttpSession JSP入门 1 JSP概述 1.1 什么是JSP JSP(Java Server Pages)是JavaWeb服务器端的动态 ...

  10. day11(jsp入门&Cookie&HttpSession&一次性图片校验码)

    day11 JSP入门   1 JSP概述 1.1 什么是JSP JSP(Java Server Pages)是JavaWeb服务器端的动态资源.它与html页面的作用是相同的,显示数据和获取数据. ...

随机推荐

  1. Linux命令详解之—less命令

    Linux下还有一个与more命令非常类似的命令--less命令,相比于more命令,less命令更加灵活强大一些,今天就给大家介绍下Linux下的less命令. 更多Linux命令详情请看:Linu ...

  2. Struct2

    1.MVC思想概述 Servlet作为前端控制器,负责接收客户端发送的请求,在Servlet中只包含控制逻辑和简单的前端处理:然后调用后端javabean来完成实际的逻辑处理: 最后转发到相应的jsp ...

  3. 修改thinkphp路由模式,去掉Home

    第一步:入口文件增加 define('BIND_MODULE', 'Home'); 第二步:修改config文件,我这里路由模式设置为2 效果展示:

  4. lodash常用方法1--查询

    1.find var _ = require('lodash'); var user1 = { name: 'zhangsan', height: 180, weight: 120 }; var us ...

  5. 两个与spring事务相关的问题

    有些spring相关的知识点之前一直没有仔细研究:比如spring的事务,并不是没有使用,也曾经简单的在某些需要事务处理的方法上通过增加事务注解来实现事务功能,仅仅是跟随使用(甚至并未测试过事务的正确 ...

  6. 每天一命令 git stash

    git stash  命令是用于保存当前进度的命令.该命令会保存当前工作区的改动.保存的改动是已经跟踪的文件的改动,对于未跟踪的改动stash是不会保存的. git stash 命令常用于分支切换的 ...

  7. 小伙伴们惊呆了!10行 JavaScript 实现文本编辑器

    最近,我需要做一个非常基本的网页内容编辑功能.我不想使用 iframe ,我也不想要一个功能特别多的复杂编辑器,只需要很基本的内容编辑功能,例如粗体,斜体,列表,对齐等等. 您可能感兴趣的相关文章 分 ...

  8. java--POI解析excel兼容性问题

    近日,使用POI解析excel,发现2003版本的excel解析与2007版本的excel解析存在问题.特此总结: 1.所需jar包 : 2.java类代码(读取excel文件): public vo ...

  9. 如何在SharePoint2010中创建自定义电子邮件警报处理程序

    字段,如项目名称字段中,将被截断到的电子邮件通知中的 70 个字符.要解决 70 个字符的限制,请使用"更多信息"一节中的介绍的方法. 要嵌入电子邮件通知中的其他内容. 您想要更改 ...

  10. ARP投毒及其防御方法

    1.攻击原理 ARP欺骗就是中间人欺骗pc机,告诉pc机它是服务器.再欺骗服务器,告诉服务器它就是pc机.以致获取服务器与pc机的会话信息. 中间人欺骗服务器时,会给服务器发一个报文,发之前把报文中的 ...