Cookie

一.状态管理:
将客户端与服务器之间多次交互当做一个整体来看待,并且将多次交互中涉及的数据保存下来,提供给后续的交互进行数据的管理即状态管理。
这里的状态指的是当前的数据,管理指的是在这个多次交互的过程中对数据的存储、修改、删除。

二.状态管理两种常见模式
客户端状态管理技术:将状态保存在客户端,代表性的是Cookie技术
服务端状态管理技术:将状态保存在服务端,代表性的是Session技术

三.Cookie原理
1.第一次访问服务器时候通过 Request 对象下发Cookie
2.以后每次浏览器访问同一个网站时候将Cookie放在request中带回来
3.Cookie是在Http请求和响应的头部发送的

四.Cookie的过期时间
1.不设置时间,Cookie会保存到浏览器内存中,在浏览器关闭时候消失
2.设置为0则删除Cookie
3.设置为具体秒数,则Cookie会保存到浏览器端的硬盘上,在下次启动浏览器再次请求网站时候还会带回来Cookie 域名问题

五.Cookie域名问题
默认情况下, Cookie是属于当前网站域名的, 并且浏览器只会将当前域名下的Cookie发送会当前网站.
这样可以一定层面上保障Cookie的安全而问题.Cookie的路径问题

六.Cookie是有路径属性的, Cookie在通过response向服务器发送时候, 根据路径属性选择发送:
父目录Cookie发送给子目录
当前目录的Cookie发送给当前目录
子目录的Cookie不发送给父目录

七.Cookie 仿冒问题
Cookie 是可以被仿冒的!
Cookie 中不能保存”敏感信息”
敏感信息应该采用Session保存
不能保存敏感信息: 密码, 敏感的价格, …
实在需要保存敏感信息, 需要”摘要”或者”加密”
Cookie cookie = new Cookie("demo",URLEncoder.encode("Hello World","utf-8"));
Cookie[] cookies = request.getCookies();
System.out.println(cookie.getName()+":"+URLDecoder.decode(cookie.getValue(), "utf-8"));


发送状态码:

package cn.tedu.tstore.web;

import java.io.IOException;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 利用 Response 下发Cookie(会员卡)到浏览器端
 */
public class AddCookieServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//创建Cookie对象,其中demo是对象的key
		//Hello World 是对象的值
		Cookie cookie = new Cookie("demo",URLEncoder.encode("Hello World","utf-8"));
		//注意: Cookie是在Http头部传送的!只能
		//采用ISO8859-1编码!
		//在Response中可以添加多个Cookie
		Cookie cookie2 = new Cookie("test",URLEncoder.encode("Hello Kitty","utf-8"));
		response.addCookie(cookie);
		response.addCookie(cookie2);
		//简单响应
		response.setContentType("text/html");
		response.getWriter().print("OK");
	}
}

package cn.tedu.tstore.web;

import java.io.IOException;
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 AddCookie2Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Cookie c3 = new Cookie("c3", "6");
		Cookie c4 = new Cookie("c4", "6");
		Cookie c5 = new Cookie("c5", "6");
		//不设置属性,则属性就是当前请求路径
		String path = request.getRequestURI();
		System.out.println("当前目录:"+path);
		c3.setPath("/store");
		//c4设置为相对目录当前目录的子目录demo
		//c4.setPath("demo");
		//c5设置为绝对目录"/"就是网站根目录
		c5.setPath("/");
		response.addCookie(c3);
		response.addCookie(c4);
		response.addCookie(c5);
		//简单响应
		response.setContentType("text/html");
		response.getWriter().print("OK");
	}
}

删除状态码:


package cn.tedu.tstore.web;

import java.io.IOException;
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 DeleteCookieServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取所有Cookie,删除其中一个Cookie
		Cookie[] cookies = request.getCookies();
		if(cookies!=null) {
			for(Cookie cookie : cookies) {
				if(cookie.getName().equals("demo")){
					cookie.setMaxAge(0);
					response.addCookie(cookie);
				}
			}
		}
		//简单响应
		response.setContentType("text/html");
		response.getWriter().print("OK");
	}
}

读取状态码:

package cn.tedu.tstore.web;

import java.io.IOException;
import java.net.URLDecoder;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 从Request中读取浏览器发送来的Cookie
 */
public class ReadCookieServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//request提供了读取全部Cookie的方法
		Cookie[] cookies = request.getCookies();
		//如果没有cookie,则返回null
		if(cookies!=null) {
			for(Cookie cookie : cookies) {
				System.out.println(cookie.getName()+":"+cookie.getValue()+":"+cookie.getDomain());//getDomain()是获取该cookie的域名
				System.out.println(cookie.getName()+":"+URLDecoder.decode(cookie.getValue(), "utf-8"));
			}
		}
		//简单响应
		response.setContentType("text/html");
		response.getWriter().print("OK");
	}

}

状态码时间:

package cn.tedu.tstore.web;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class CookieAgeServlet
 */
public class CookieAgeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Cookie c1 = new Cookie("t1","5");
		Cookie c2 = new Cookie("t2","5");
		//设置Cookie的过期时间,其默认值是当前
		//浏览器打开期间有效
		c2.setMaxAge(60*60*24);
		response.addCookie(c1);
		response.addCookie(c2);
		//简单响应结果
		response.setContentType("text/html");
		response.getWriter().print("OK");
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linsa_pursuer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值