Servlet/JSP-05 Cookie
一. 问题?
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的更多相关文章
- jsp 入门 cookie session
Java Server Page ==> 服务器端的动态页面资源.用来做显示的功能. JSP构成 ==> HTML 脚本代码 标签构成. JSP 原理 ==> 实际上就是 servl ...
- servlet&jsp高级:第三部分
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Servlet&jsp基础:第四部分
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Servlet&JSP基础
Servlet JSP JSP四种基本语法: JSP注释<%--注释内容--> JSP声明<%!变量.函数%> JSP表达式<%= ...
- Servlet&JSP中的知识点
先sun提出的是Servlet体系,这个体系使得使用JAVA的程序员也能开发基于B/S架构的WEB应用程序,使用Servlet类将HTTP请求和响应封装在标准JAVA类中来实现各种WEB应用方案.随着 ...
- 马士兵Servlet&Jsp学习
Servlet&JSP 1>http常见错误信息: 404--url地址找不找, 403--禁止访问 500--服务器内部错误 2>Servlet的生命周期: *生命全过 ...
- ④品茶看<Servlet&JSP>-EL表达式
前言 今早,概率课偷了下小懒写的: 泡一杯红茶,ACM集训前,写篇博客记录记录EL表达式. #EL介绍 ①EL 语法 ②访问JavaBean等 ③EL隐式对象 ④EL运算符 EL介绍 EL 全名为Ex ...
- 小峰servlet/jsp(1)
一.scriptlet标签: 通过scriptlet标签我们可以可以在jsp理嵌入java代码: 第一种:<%! %> 可以在里面定义全局变量.方法.类: 第二种:<% %> ...
- 超全面的JavaWeb笔记day11<JSP&Session&Cookie&HttpSession>
1.JSP 2.回话跟踪技术 3.Cookie 4.HttpSession JSP入门 1 JSP概述 1.1 什么是JSP JSP(Java Server Pages)是JavaWeb服务器端的动态 ...
- day11(jsp入门&Cookie&HttpSession&一次性图片校验码)
day11 JSP入门 1 JSP概述 1.1 什么是JSP JSP(Java Server Pages)是JavaWeb服务器端的动态资源.它与html页面的作用是相同的,显示数据和获取数据. ...
随机推荐
- springmvc(1)DispatcherServlet源码简单解析
springmvc的简单配置 1.首先需要在web.xml中配置DispatcherServlet,这个类是springmvc的核心类,所以的操作都是由这里开始,并且大部分都是在这里面实现的,比如各种 ...
- Gym 100703G---Game of numbers(DP)
题目链接 http://vjudge.net/contest/132391#problem/G Description standard input/outputStatements — It' s ...
- Node.JS模块系统
1.什么是模块? 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js ...
- CMS
一.任务简介: 开发简单的CMS.在数据库中创建新闻数据库表news,包含(题目.作者.日期.正文等字段):创建HTML模板文件:读取数据库所有数据的信息,并使用新闻信息 替换模板文件中的占位符,从而 ...
- jQuery Danmmu Player 弹幕视频
Danmmu Player是基于jQuery的弹幕视频插件.当在看视频的时候,同时发表自己的观点,这样很好的提高用户互动效果.其实也就是在视频界面上做一个滚动展示动画效果,这样的聊天互动视频效果我们叫 ...
- 自定义easyui整数或者数字、字母或者下划线验证方法
$.extend($.fn.validatebox.defaults.rules, { intOrFloat: {// 验证整数或小数 validator: function (value) { re ...
- JavaScript学习笔记-实现枚举类型,扑克牌应用
//实现枚举类型,扑克牌应用 function creatEnum(p){ //构造函数 var Enumeration = function(){throw 'can not Ins ...
- python之socket开发
socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Un ...
- Eclipse开发STM32出现找不到函数的情况的解决方法
问题表现: 在明明引用了头文件的情况下,出现“undefined reference to `…'”的情况,例如下图: 解决方法: 在左边的数据目录定位到“system\src\stm32f0-st ...
- DevExpress免费线上公开课17日开课
小伙伴们,前几日DevExpress 正式发布了2015的第二次重大版本v15.2.3(更新说明),对于新版本中新增的一些功能和控件,你一定会有一些疑问,比如哪些功能是值得我们关注的,哪些控件有比较重 ...