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

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;
//清除指定的cookie
public class ClearTimeServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//如何唯一定位要删除的cookie:domain+path+name
				Cookie 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的path
public 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());// 把路径改为 /day09
				c.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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值