javaweb学习笔记系列之cookie简单认识

来源:互联网 发布:淘宝网店编辑岗位要求 编辑:程序博客网 时间:2024/05/16 08:41

1.会话



1、什么是会话?

打开浏览器,点击多次链接(发出多次请求和收到多次的响应),关闭浏览器,这个过程就是一次会话。

好比打电话,当对方接通之后,进行通话,当通话完毕之后挂掉了电话这就是一次会话。

2、解决的问题是什么?

共享多次请求中产生的数据。比如购物车。

假如购买了一件产品,这就是一次请求,但是你需要去付款,这也一次请求,是两个不同的请求,那么去付款的时候,所买的产品就不存在。那么请求转发将数据带过去可以的吗?这显然不是很方便。这时候就需要会话技术。

2.客户端技术:Cookie

2.1HTTP协议的消息头

请求消息头:Cookie 客户端向服务器端传递信息

响应消息头:Set-Cookie 服务器端向客户端传递信息

2.2cookie一些基本信息

Cookie详解:

l 属性:

nameCookie的名称,必要的属性

valueCookie的取值(不能为中文),必要的属性

-------------------以下为可选属性

pathCookie的路径

默认值就是写cookie的那个资源的访问路径

比如:http://localhost:8080/day09_00_cookie/servlet/CookieDemo1 path就是/day09_00_cookie/servlet/

 

注意:

如果一个存在浏览器缓存中的cookie的路径是/day09/servlet/

当访问http://localhost:8080/day09/CookiePathDemo1时,浏览器根本不带Cookie给服务器。浏览器比对的是cookie的路径和当前访问的资源的路径。

 

浏览器满足一下条件就会带cookie给服务器:

当前访问的地址的路径.startWith(已存cookie的路径)

即:如果一个Cookie的路径设置为了当前应用,说明访问该网站的任何资源时浏览器都带该cookie给服务器。(开发中经常做的)

 

maxAgeCookie的最大生存时间。默认是在浏览器的内存中。

domainCookie的域名(网站)。默认就是写cookie的那个资源所属的网站。

http://localhost:8080/day09_00_cookie/servlet/CookieDemo1域名就是localhost

 

version:版本号

comment:注释

 

u 把Cookie写给客户端:

HttpServletResponse.addCookie(Cookie c):实际上就是向客户端发送了一个响应消息头。

注意:客户端只能保存一个网站最多20Cookie数据,总共最多300个。每个Cookie的大小不能超过4kb

l 服务器端获取客户端带来的Cookie

Cookie [] HttpServletRequest.getCookies();

 

注意:domain+path+name唯一确定一个Cookie

2.3代码

import java.io.IOException;import java.io.PrintWriter;import java.text.SimpleDateFormat;import java.util.Date;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//演示cookie的基本使用public class CookieDemo1 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");//设置响应编码PrintWriter out = response.getWriter();//获取输出流,用于向浏览器输出信息out.write("您上次访问的时间是:");//获取指定名称的cookie:lastAccessTime = 毫秒值Cookie[] cs = request.getCookies();//有可能是第一次登陆,所以cookie不存在,需要判断是否为空for(int i = 0;cs != null && i< cs.length; i++){//判断cookie是否存在if("lastAccessTime".equals(cs[i].getName())){long time = Long.parseLong(cs[i].getValue());//out.write(new Date(time).toLocaleString());//转化为本地时间SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//转化为指定格式的时间out.write(sdf.format(new Date()));}}//把当前的时间写回去Cookie c =  new Cookie("lastAccessTime", System.currentTimeMillis()+"");//实例化Cookie对象,传入cooke名称和cookie的值c.setMaxAge(Integer.MAX_VALUE);// 设置cookie的生命周期 单位是秒response.addCookie(c);//将cookie写到本地}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request,response);}}

抓取的截图:

第一次打开浏览器,没有显示,是因为本地没有cookie
cookie默认的路径为默认在用户/xxx/AppData/Local/Microsoft/Windows/Temporary InternetFiles文件夹下

2.4清除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;//清除指定的cookiepublic class ClearTimeServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//如何唯一定位要删除的cookie:domain+path+nameCookie c = new Cookie("lastAccessTime", "");c.setMaxAge(0);response.addCookie(c);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request,response);}}

2.5cookie的path问题

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;//演示Cookie的pathpublic class CookiePathDemo1 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//path:/day09/servlet/Cookie c = new Cookie("demoCookie", "aaa");c.setPath(request.getContextPath());// 把路径改为 /day09c.setMaxAge(Integer.MAX_VALUE);//c.setDomain("itheima.com");//写了白写response.addCookie(c);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

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 CookiePathDemo2 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {Cookie cs[] = request.getCookies();for(int i=0;cs!=null&&i<cs.length;i++){if("demoCookie".equals(cs[i].getName())){//找到了response.getWriter().write(cs[i].getValue());}}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}




0 0