浏览器向服务器端发送请求,发送请求肯定是访问某一个资源servlet,当访问第一个servlet时,响应会有一个set-cookie2:name=洗衣机,当再次发送请求时,会把Cookie带过来,然后在servlet2中就可以得到这个信息。
package com.it.servlet.cookie;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Demo1Servlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//将商品信息记录到Cookie中。
Cookie cookie = new Cookie("phone","iphone9");
//要将Cookie带回到浏览器端
response.addCookie(cookie);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
首先编写Demo1Servlet,用到了Cookie类,根据API,Cookie类的构造方法为public Cookie(String name, String value),编写构造方法,给一个名字,给一个值。
知识点:
1. Cookie类的构造方法:Cookie cookie = new Cookie(String name, String value);
2. 要想将Cookie信息携带到浏览器端,需要使用response.addCookie(Cookie cookie);
浏览器端访问/demo1,通过抓包,发现第一次访问,响应里面有Set-Cookie:phone=iphone9,请求里面没有Cookie信息;第二次访问demo1,请求里面有:Cookie:phone=iPhone9,响应里面有:Set-Cookie:phone=iPhone9。
画图表示:
浏览器访问服务器端Demo1Servlet,Demo1Servlet创建Cookie,并将Cookie信息携带给浏览器,浏览器将Cookie信息存储到浏览器缓存中,然后
1. 要想在服务器端获取所有的Cookie,Cookie[] cookie = request.getCookies();
2. Cookie类中提供方法,getName()获取Cookie名称,getValue()获取Cookie值。
注意:
1.Cookie不能存中文。Cookie既可以缓存在浏览器中,也可以产生Cookie文件。但本身格式都不可以存中文。
package com.it.servlet.cookie;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ShowTimeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// 得到所有的Cookie
Cookie[] cookies = request.getCookies();
// 得到一个表示时间的Cookie
Cookie cookie = getCookie("time", cookies);
if (cookie == null) {
response.getWriter().write("第一次访问该网站");
Cookie newCookie = new Cookie("time", System.currentTimeMillis() + "");
response.addCookie(newCookie);
} else {
String time = cookie.getValue();
SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = dateformat.format(Long.parseLong(time)) + "";
response.getWriter().write(dateStr);
cookie.setValue(System.currentTimeMillis()+"");
response.addCookie(cookie);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
public Cookie getCookie(String name, Cookie[] cookies) {
if (null == cookies || cookies.length == 0) {
return null;
} else {
for (Cookie cookie : cookies) {
if ("time".equals(cookie.getName())) {
return cookie;
}
}
}
return null;
}
}
new Cookie(String name, String value);
getName(); //获取名称
getValue(); //获取
setValue(); // 设置值
setMaxAge // cookie信息存储在浏览器的内存里,临时访问,当浏览器关闭,Cookie信息随之消失。Cookie持久化保存就用到了maxAge。如果创建了一个Cookie,并将它发送到浏览器,默认情况下,他是一个会话级别的Cookie(即存储在浏览器的内存中),用户退出浏览器即被删除。若希望浏览器将Cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。删除持久Cookie,可以将Cookie最大失效设为0,注意,删除Cookie,path必须一致,否则不会删除。
cookie.setMaxAge(60*60*24*7); //让Cookie持久化保存,7天
getMaxAge
setPath 这个方法很重要,必须会。Cookie属于某一个工程,画Cookie图,为什么能携带Cookie,是因为它们的path一致。通过setPath,可以设置Cookie属于某一个站点或应用,当访问时,只要是这个站点下的Cookie就携带过来。
Cookie什么时候携带,取决于path值.
默认值:cookie.setPath("/day9_1") --- 实际开发中用
访问当前服务器下任何一个工程,都携带所有 Cookie : cookie.setPath("/")
API:指定客户端应该返回Cookie的路径。Cookie对于指定目录中的所有页面及该目录子目录中的所有页面都是可见的。Cookie的路径必须包括设置Cookie的servlet,例如/catalog,它使Cookie对于服务器上/catalog下的所有目录都是可见的。
用于设置Cookie在访问什么样的资源时会携带,就是设置Cookie的路径。
删除Cookie:设置setMaxAge,0 立即删除Cookie,-1 浏览器关闭后删除。
注意事项:删除Cookie,必须path一致。执行过的代码,设置Cookie的path值为"/",向删除Cookie,设置程序中的setMaxPath(0),并且要设置path一致,才可以删除。
setDomain设置Cookie的有效域名。
访问A网站,生成A网站的Cookie --- 第一方Cookie(安全Cookie)
访问A网站,生成B网站的Cookie --- 第三方Cookie(恶意Cookie)
现在的浏览器已经把第三方Cookie屏蔽掉了