专业苏州网站建设,市场营销策划ppt,徐州建站,网络维护培训板块一 Servlet编程#xff1a;第五节 Cookie对象全解 一、什么是CookieCookie的源码 二、Cookie的具体操作#xff08;1#xff09;创建Cookie#xff08;2#xff09;获取Cookie#xff08;3#xff09;设置Cookie的到期时间#xff08;4#xff09;设置Cookie的路径… 板块一 Servlet编程第五节 Cookie对象全解 一、什么是CookieCookie的源码 二、Cookie的具体操作1创建Cookie2获取Cookie3设置Cookie的到期时间4设置Cookie的路径 三、Cookie的相关事项 在上一节中我们学完了Servlet的service()的两个形参也就是HttpServletRequest和HttpServletResponse两大对象的实例通过这两个对象可以实现Web交互在后端的请求响应功能。从这一节开始我们将详解Servlet传递、保存数据的功能Servlet的第三个对象Cookie 一、什么是Cookie
我们在网上冲浪时有时登录一个网站之前会跳出一个Cookie允许弹出在浏览器的设置中也有Cookie是否保存的开关保存登录密码就是用Cookie实现的那么这个Cookie究竟是什么在Web交互过程中起到了什么作用 这件事还要从 第一节 HTTP协议理论与服务器请求响应原理 说起在那一小节中我们说HTTP是无状态协议即协议对于事务处理没有记忆能力这样有利于HTTP协议的简单性但对于Servlet这就显得乏善可陈了因为这意味着我们每一个会话的数据传输量会增大。举个栗子就像我们下班回家的时候小区大门的保安大爷每天都要问你是几栋几单元哪户的才给你放行真是麻烦有一天你跑去物业那里办了一张门禁卡终于可以自由进出小区门了这张门禁卡就是Cookie
Cookie是浏览器提供的一种技术通过服务器的程序能将一些只须保存在客户端或把在客户端进行处理的数据放在本地的计算机上不需要通过网络传输进而提高网页处理的效率减少服务器的负载但是由于Cookie是服务器端保存在客户端的信息所以其安全性也是很差的。例如常见的记住密码功能则可以通过Cookie 来实现Servlet中有一个专门操作Cookie的类javax.servlet.http.Cookie随着服务器端的响应发送给客户端保存在浏览器。当下次再访问服务器时把Cookie再带回服务器
实例在开发者工具中查看Cookie是怎样保存的 还是以百度一下为例 可以在响应头键值对里看见一个名为Set-Cookie的键实际上当前 Cookie有两个版本分别对应两种设置响应头Set-Cookie和 Set-Cookie2 但在Servlet中并不支持Set-Cookie2所以我们来看看Set-Cookie的属性项
同样可以在请求头键值对里看见一个名为Cookie的键里储存着看不懂的值Cookie在请求头键值对里的格式键值对用链接多个键值对间通过;隔开 或者在应用中查看当前存储着的Cookie也能发现很多看不懂的键值对
Cookie的源码
我们来看看Cookie的部分源码使用注释详解
public class Cookie implements Cloneable, Serializable {// final修改字段不可重写private static final CookieNameValidator validation;private static final long serialVersionUID 1L;// 定义Cookie的名字变量private final String name;// 定义Cookie的值变量private String value;// 版本信息private int version 0;private String comment;// 域名private String domain;// 过期时间private int maxAge -1;private String path;private boolean secure;private boolean httpOnly;// Cookie的构造函数可以看出是带参构造必须要实现两个形参name和valuepublic Cookie(String name, String value) {validation.validate(name); // name的唯一校验this.name name;this.value value;}。。。再往下就是上面字段的get(),set()方法二、Cookie的具体操作
1创建Cookie
通过 new Cookie(key,value);来创建一个Cookie对象,要想将Cookie随响应发送到客户端,需要先添加到Response对象中Response.addCookie(cookie);此时该Cookie对象则随着响应发送至了客户端。在浏览器上可以被看见
实例 在satrt.java中导入javax.servlet.http.Cookie写入测试代码
package www.caijiyuan;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import javax.servlet.http.Cookie;WebServlet(/start)
public class start extends HttpServlet {Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 创建Cookie对象Cookie cookie new Cookie(Cooikename, Cookievalue);// 发送Cookie对象resp.addCookie(cookie);}
}启动服务器在浏览器中访问start在开发者工具中就可以获取到当前Cookie的键值了
2获取Cookie
Cookie的获取只能通过Cookie数组遍历来取得不能单独拎一个出来 通过Request对象的getCookies()方法调用获得Cookie数组然后用get()方法取得键值
Cookie[] cookies request.getCookies();
cookie.getName();
cookie.getValue();实例在after.java中获取start.java中存储的Cookie值 after.java中导入javax.servlet.http.Cookie写入测试代码
package www.caijiyuan;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import javax.servlet.http.Cookie;
WebServlet(/after)
public class after extends HttpServlet {Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取cookie数组Cookie[] cookies req.getCookies();//判断cookie是否为空if (cookies ! null cookies.length 0) {//遍历cookie数组for (Cookie cookie : cookies) {// 获取cookie的名称和值String Cookiename cookie.getName();String Cookievalue cookie.getValue();System.out.println(键 Cookiename ,值 Cookievalue);}}}
}启动服务器在浏览器中先后访问start和after即可在控制台得到 这就获取到了Cookie
3设置Cookie的到期时间
Cookie是浏览器的技术与服务器无关服务器的关闭、重启都不影响Cookie的值Cookie的死亡与我们设置的到期时间有关。可以通过手动设定Cookie的有效时间setMaxAge(int time);方法设定cookie的最大有效时间以秒为单位。默认为当前浏览器关闭即失效 到期时间的取值
负整数 若为负数表示不存储该Cookie。 Cookie的maxAge属性的默认值就是-1表示只在浏览器内存中存活一旦关闭浏览器窗口Cookie就会消失正整数 若大于0的整数表示存储的秒数。 此时浏览器会把Cookie保存到硬盘上就算关闭浏览器、重启客户端电脑Cookie也会存活相应的时间。若为0,表示删除该 Cookie。 如果原来浏览器已经保存了这个Cookie那么可以通过Cookie的setMaxAge(0)来删除这个Cookie。无论是在浏览器内存中还是在客户端硬盘上都会删除这个Cookie。
实例在start.java的代码段中为Cookie实例加入设置存活时间的方法setMaxAge()
// 创建Cookie对象
Cookie cookie new Cookie(Cooikename, Cookievalue);
// 设置存活时间
cookie.setMaxAge(30);
// 发送Cookie对象
resp.addCookie(cookie);启动服务器在浏览器中访问start即可中在开发者工具中查看当前Cookie的到期时间的时间戳
4设置Cookie的路径
Cookie的setPath设置cookie的路径,这个路径直接决定服务器的请求是否会从浏览器中加载某些cookie
情景一当前Tomcat服务器下任何项目站点的任意资源都可获取Cookie对象
Cookie cookie new Cookie(xxx, xxx);
// 设置路径为”/,表示在当前服务器下任何项目都可访问到cookie对象
cookie.setPath(/);
response.addcookie(cookie);情景二指定项目站点下的资源可获取Cookie对象(不设置Cookie的path时)
Cookie cookie new Cookie(xxx, xxx);
// 设置路径为/start”,表示当前项目可全部访问到cookie对象
cookie.setPath(/ www.caijiyuan);// 默认如此
cookie.setPath(/xxx);// 表示指定站点xxx下的资源可以获取Cookie对象
response.addcookie(cookie);例如当前站点就是 www.caijiyuan 一个Tomcat服务器下可能有很多个站点一个站点和里面的资源的结构就是这样
情景三指定项目站点下的某个资源可获取Cookie对象
Cookie cookie new Cookie(xxx, xxx);
// 设置路径为/www.caijiyuan/start,表示在/www.caijiyuan/start目录下才可访问到Cookie对象
cookie.setPath(/www.caijiyuan/start);
response.addcookie(cookie);如果我们设置path时当前访问的路径包含了Cookie的路径(当前访问路径要比Cookie的范围小)Cookie就会加载到Request对象之中。当访问的路径包含了Cookie的路径时则该请求将带上该Cookie如果访问路径不包含Cookie路径则请求不会携带该Cookie
三、Cookie的相关事项
Cookie保存在当前浏览器中 Cookie操作只是将信息保存在本机上换电脑或跨浏览器后以后这些信息就失效了Cookie存中文问题 Cookie 中不能出现中文,如果有中文则通过URLEncoder.encode()来进行编码,获取时通过URLDecoder.decode()来进行解码。
实例 保存时编码
String Cookiename姓名;
String Cookievalue汤米尼克;
// 通过 URLEncoder.encode()来进行编码
Cookiename URLEncoder.encode(Cookiename);
Cookievalue URLEncoder.encode(Cookievalue);
// 创建Cookie对象
Cookie cookie new Cookie(Cookiename,Cookievalue);
// 发送Cookie对象
response.addcookie(cookie);获取时解码
// 获取时通过 URLDecoder.decode()来进行解码
URLDecoder.decode(cookie.getName());
URLDecoder.decode(cookie.getValue());同名Cookie问题 如果服务器端发送重复的Cookie名称那么会覆盖原有的Cookie浏览器存储Cookie问题 不同的浏览器对Cookie有不同的存储上限一般大小上限4KB左右。Cookie是存储在客户端(浏览器)的由服务器端创建和设定。后期结合Session来实现回话跟踪。
以上就是本小节的所有内容但Cookie是有大小限制和数量限制的并且越来越多的Cookie代表客户端和服务器的传输量增加可不可以每次传的时候不传所有cookie值而只传一个唯一ID通过这个ID直接在服务器查找用户信息呢答案是有的这就是我们的session在下一节中我们来详解session