Cookie

Cookie


      Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key和value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。
      Cookies最典型的应用:1.判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入
     此网站时保留用户信息以便简化登录手续。
   2.另一个重要应用场合是“购物车”之类处理。用户可能会在一段时间内在同一家网站的不同页面中选择      不同的商品,这些信息都会写入Cookies,以便在最后付款时提取信息。
Cookie就自动地在Web服务器和浏览器之间来回传递的一小块信息。
Cookie适用于那些需要跨越许多页面的信息。Cookie是属于浏览器端的技术。
Cookie的原理:把共享数据存储在浏览器中,每次请求再把共享数据带到服务端。


1. 在服务器端创建一个Cookie
Cookie cookie = new Cookie("name",name);
2. 把Cookie交还给浏览器
response.addCookie(cookie);
3. 从Cookie中取值
//拿到所有的Cookies
Cookie[] cookies = req.getCookies();
//判断Cookies是否为空
if(cookies!=null){
//遍历Cookies,根据它的key(name),拿到相应的值
for (Cookie cookie : cookies) {
if("name".equals(cookie.getName())){
name = cookie.getValue();
}
}
}
4.解决Cookie不支持中文的问题
传过去的参数要先进行编码:URLEncoder.encode(name, "UTF-8");
从Cookie中拿到参数后要进行解码: URLDecoder.decode(name, "UTF-8");

5.修改Cookie
第一种方式:设置新的值
cookie.setValue("新的值"); 
第二种方式:创建一个新的Cookie,名称一样,进行覆盖
Cookie temp = new Cookie("name","xxxx");
resp.addCookie(cookie); //千万不要忘了修改后交还给浏览器

6.Cookie的生命周期
我们自己创建出来的
默认情况下:当浏览器关闭的时候,Cookie就没有了
我们也可以自己去设置 Cookie到底活多长时间 :cookie.setMaxAge(5); (单位是秒)
7.删除一个Cookie的数据:cookie.setMaxAge(0); 设置存活时间为0即是删除

8.Cookie的路径,cookie的位置是默认在创建它的那一个位置
但是很多时候,咱们整个项目都要使用Cookie.
我们就需要把它的路径设置在根目录下面:cookie.setPath("/");

使用cookie模拟邮箱登录
/**
 *  邮箱的主界面(第一页面)
 * */
@WebServlet("/cookie/main")
public class MainServlet extends HttpServlet{
	
	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html;Charset=UTF-8");
		
		//根据名称获取用户传过来的数据信息
		String name = req.getParameter("name");
		
		/**
		 * 	解决cookie不支持中文问题
		 * 步骤:1、先编码    URLEncoder.encode(String s,String enc)
		 * 		2.解码	
		 * */
		//URLEncoder.encode(name, "UTF-8")	这句代码表示把传过来的数据是编码之后的数据,解决了中文问题
		//在服务器端创建一个cookie
		Cookie cookie = new Cookie("name",URLEncoder.encode(name, "UTF-8"));
		//把cookie路径设置在根目录下面
		cookie.setPath("/");
		cookie.setDomain(".baidu.com");//设置二级域名 了解即可
		//将cookie交还给浏览器
		resp.addCookie(cookie);
		
		PrintWriter writer = resp.getWriter();
		writer.println("欢迎您:"+name+"<br />");
		writer.println("<a href='/list'>您有五封邮件未读!!</a>");
	}
}

/**
 *  邮箱的邮件列表(第二页面)
 * */
@WebServlet("/list")
public class ListServlet extends HttpServlet {
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html;Charset=UTF-8");
		String name = "";
		//拿到所有的cookies
		Cookie[] cookies = req.getCookies();
		//判断cookies是否为空
		if(cookies!=null){
			//遍历cookies,根据它的key,拿到对应的值
			for (Cookie cookie : cookies) {
				if("name".equals(cookie.getName())){
					name = cookie.getValue();
					//进行解码,解决中文问题(因为这里传过来的数据是编码后的数据)
					name = URLDecoder.decode(name, "UTF-8");
					/**
					 *  第一种修改cookie中值得方法
					 *  	cookie.setValue(String newValue)
					 *  	resp.addCookie(Cookie cookie)
					 *  第二种修改cookie的方法:创建一个新的Cookie,名称一样,进行覆盖
					 *  	采用覆盖原有cookie的办法,但是也必须重新把cookie交还给浏览器
					 *  	Cookie temp = new Cookie("name","xxxxx")
					 * */
					//修改cookie中指定的值
					cookie.setValue("66666");
					//修改cookie后的值必须交还给浏览器
					resp.addCookie(cookie);
				}
			}
		}
		
		PrintWriter writer = resp.getWriter();
		writer.println("欢迎您:"+name+"<br />");
		for(int i=1;i<=5;i++){
			writer.println("<br /> <a href='/cookie/oneinfo'>第"+i+"封邮件!!</a>");
		}
	}
}

/**
 *   邮箱中某封邮件具体的内容页面(第三页面)
 * */
@WebServlet("/cookie/oneinfo")
public class OneInfoServlet extends HttpServlet {
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException {
			req.setCharacterEncoding("UTF-8");
			resp.setContentType("text/html;Charset=UTF-8");
			
			String name ="";
			//拿到所有的cookies
			Cookie[] cookies = req.getCookies();
			//判断cookies是否为空
			if(cookies!=null){
				//遍历cookies,根据它的key,拿到对应的值
				for (Cookie cookie : cookies) {
					if("name".equals(cookie.getName())){
						name = cookie.getValue();
						//进行解码,解决中文问题(因为这里传过来的数据是编码后的数据)
						name = URLDecoder.decode(name, "UTF-8");
					}
				}
			}
						
			PrintWriter writer = resp.getWriter();
			writer.println("欢迎您:"+name+"<br />");
			writer.print("明天一起敲代码");
		}
	
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值