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页面的作用是相同的,显示数据和获取数据. ...
随机推荐
- python signal(信号)
信号的概念 信号(signal)-- 进程之间通讯的方式,是一种软件中断.一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号. 几个常用信号: SIGINT 终止进程 中断进 ...
- Struct2
1.MVC思想概述 Servlet作为前端控制器,负责接收客户端发送的请求,在Servlet中只包含控制逻辑和简单的前端处理:然后调用后端javabean来完成实际的逻辑处理: 最后转发到相应的jsp ...
- android 查找某个特定文件后缀名
private void queryFiles(){ String[] projection = new String[] { MediaStore.Files.FileColumns._ID, Me ...
- sql2000新建登陆用户错误“21002:[SQL-DMO] 用户***已经存在”的原因和解决方法【孤立用户解决方法】
错误症状: 在SQL Server200中用附加数据库导入数据后,在新建登录时出现会出现错误21002:[SQL-DMO] 用户***已经存在.然后发现没建成的用户已经在登录列表里了.删除重建,问题依 ...
- Monkey测试4——Monkey命令行可用的全部选项
Monkey命令行可用的全部选项 常规 --help 列出简单的用法. -v 命令行的每一个-v将增加反馈信息的级别. Level 0(缺省值)除启动提示.测试完成和最终结果之外,提供较少信息. Le ...
- 通过C#来加载X509格式证书文件并生成RSA对象
private static RSACryptoServiceProvider GetPrivateKey(string priKeyFile, string keyPwd) { var pc = n ...
- 2015年免费的25款 WordPress 网站模板
2015年 WordPress 插件和主题的数量继续在增长.这一年,我们可以期待WP主题引入一些新的技术,从背景,自适应响应式图像到从背景图片中提取主色. 本文包含25款最近发布的 WordPress ...
- (转)JavaScript-性能优化之函数节流(throttle)与函数去抖(debounce)
JavaScript-性能优化之函数节流(throttle)与函数去抖(debounce) 函数节流,简单地讲,就是让一个函数无法在很短的时间间隔内连续调用,只有当上一次函数执行后过 ...
- css引入方式优先级以及不同选择器的优先级区别
我们都知道css有3种基本设置方式即 1.行内也叫嵌入式 例如: <div style='background:red'></div> 2.内联式,在html文件中用style ...
- 总结CSS3新特性(Transform篇)
概述: CSS3新添加的Transform可以改变元素在可视化区域的坐标(这种改变不会引起文档的重排,只有重排),以及形状,还有些3D形变.结合 Animation(这里以后会有个链接的) 能实现酷炫 ...