cookie与session学习笔记 -- day02 Cookie&Session

一、什么是会话

1、在日常生活中,从拨通电话到挂断电话之间的一连串的你问我答的过程就是一个会话。Web应用中的会话过程类似于生活中的打电话过程,它指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程,例如,一个用户在某网站上的整个购物过程就是一个会话。

2、在打电话过程中,通话双方会有通话内容,同样,在客户端与服务器端交互的过程中,也会产生一些数据。例如,用户甲和乙分别登录了购物网站,甲购买了一个Nokia手机,乙购买了一个Ipad,当这两个用户结账时,Web服务器需要对用户甲和乙的信息分别进行保存。在前面章节讲解的对象中,HttpServletRequest对象和ServletContext对象都可以对数据进行保存,但是这两个对象都不可行,具体原因如下:

(1)客户端请求Web服务器时,针对每次HTTP请求,Web服务器都会创建一个HttpServletRequest对象,该对象只能保存本次请求所传递的数据。由于购买和结账是两个不同的请求,因此,在发送结账请求时,之前购买请求中的数据将会丢失。

(2)使用ServletContext对象保存数据时,由于同一个Web应用共享的是同一个ServletContext对象,因此,当用户在发送结账请求时,由于无法区分哪些商品是哪个用户所购买的,而会将该购物网站中所有用户购买的商品进行结算,这显然也是不可行的。

(3)为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session。


二、Cookie

1、Cookie 和浏览器缓存有什么区别?

共同点:浏览器缓存可以缓存任意内容(上网浏览的所有内容)、cookie只是服务器需要浏览器缓存数据(浏览器缓存中一部分)

2、cookie解惑

(1)、Cookie为什么有路径?

客户端的浏览器下是有很多来自不同网站的Cookie对象的,如果我们没有路径,可能会将来自百度的Cookie发送给Google,这样Google就获取到了来自百度的Cookie这是不允许的.

总之当我们向某个WEB项目发起请求时,仅仅是将和这个项目相关的Cookie对象发送到了相关的WEB项目.

(2)、Cookie中不要存放中文

(3)、当Cookie过了有效期,将不再向服务端发送,浏览器会自行处理

(4)、cookie中不会以明文的形式存储重要的数据

2、cookie的应用

(1)、保存用户的用户名

(2)、记录用户的行为,例如,京东商场左下角有一个最近访问的产品记录信息,当当网上有你最近浏览过的书籍信息,都是根据用户访问页面,记录到cookie的信息来制作的。

(3)、电商购物车的处理,因为在不同页面,点击添加到购物车,这个信息也是记到了cookie里面。结账的时候统一提交

(4)、定制页面。如果网站提供了换肤的功能,我们这个时候也是将他记录到cookie里面,以便下次访问还是保持原来的风格页面。

三、cookie的API的测试

1、创建cookie

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//创建cookie
		Cookie ck1=new Cookie("name01","mary");
		Cookie ck2=new Cookie("name02","jianbing");
		//设置cookie有效期
		ck1.setMaxAge(60*60*24*7);
		ck2.setMaxAge(60*60*24*7);
		//设置cookie路径
		ck1.setPath("/day38");
		ck2.setPath("/day38");
		//发送Cookie
		response.addCookie(ck1);
		response.addCookie(ck2);
		
		
		response.getWriter().println("Cookie   has   created");
	}
2、获取cookie

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取Cookie
		Cookie[] cks = request.getCookies();
		//遍历获取到的cookie
		for (Cookie ck : cks) {
			System.out.println(ck.getName()+"<===>"+ck.getValue());
		}
	}

3、移除cookie

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取到指定名称cookie
		Cookie[] cks = request.getCookies();
		for (Cookie ck : cks) {
			if(ck.getName().equals("name01")){
				//设置获取到的cookie的有效期为0,路径和原先的路径一致
				ck.setMaxAge(0);
				ck.setPath("/day38");
				//发送cookie			
				response.addCookie(ck);
			}
		}
		
		response.getWriter().println("Cookie   has deleted");
	
	}

四、Cookie总结

1、Cookie的分类

(1)、会话级别的Cookie:默认的.关闭了浏览器Cookie就销毁了.

(2)、持久级别的Cookie:需要设置有效时长的.关闭浏览器也不会销毁的Cookie.

               setMaxAge(int expiry);  以秒为单位的时间,超过了该时间后Cookie会自动销毁. 

               setMaxAge(0),手动删除持久性的Cookie。(前提:path和name必须一致)

               setPath(String uri);设置Cookie的有效路径.

                              例如:

                              1)cookie.setPath("/day16/demo"); 

                                     表示day16 项目下,【demo目录】下所有的servlet,都可以访问当前cookie。但“/day16”或“/day16/aaa”将不能访问。

                              2)cookie.setPath("/day16"); 

                                    表示【day16 项目】下的所有servlet都可以访问当前cookie

                              3)cookie.setPath("/"); 

                                     表示【tomcat下】的所有的web项目,都可以访问当前cookie

(3)、cookie唯一标示:

               唯一标示:domain + path + name (类似Java中 包 + 类名)

                              domain 域名,不同的网站使用的是不同的域名,cookie就不同。

                              path 路径,通过cookie.setPath(…)设置的内容。

                              name cookie名称,通过 new Cookie(name , …) 确定的内容。

               例如:以下表示的是两个cookie,可以同时存在。

     /web/a/b/cookieName

                            /web/a/cookieName

               如果路径和名称一样,两次addCookie(),后者将覆盖前者。

2、Cookie的API


五、Session简介

1、什么是session
2、session的实现过程

(1)、获取session的方法是:request.getSession();
(2)、执行过程为:
●  tomcat看本次请求的请求头是否通过请求头携带过一个随机的字符串
●  如果没有,新建一个随机的字符串,并创建一个和这个随机字符串关联的session对象.
●  如果有,通过这个随机的字符串看内存中是否已经存在一个和其相等的字符串,
        存在,说明之前创建过session对象,那么获取到这个session对象返回即可.
        不存在,说明之前的session已经销毁或者是用户在伪造session,则在服务端没有一个和这个字符串的值相等的字符串,此时新建一个随机的字符串, 并创建一个和这个随机字符串关联的session对象.

3、Session的本质

服务端为各个不同的客户端创建了一个对象,这个对象在服务端,用来保存来自各个客户端的数据

4、Sssion的生命周期
 创建:当用户访问服务端时,首次碰到request.getSession(),
 销毁:

●  服务器非正常关闭
●  session超时(默认30分钟,可以配置)
●  session销毁
注意:服务器正常关闭,session对象不在内存中,被序列化到硬盘上,此时重新启动服务器,还是可以将session加载到内存中的

5、何为一次会话?

         客户端和服务端交互过程中,session有效期期间的请求响应为一次会话. 

6、浏览器关闭:

         session相关的那个随机的字符串是以cookie的形式来实现的,而且对应的cookie是会话级别的,有效期为0.浏览器关闭,随机的字符串将无法向服务端传递。

六、session的API测试

1、session所有API方法


2、实现代码

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		//获取session
		HttpSession sess = request.getSession();
		out.print("session 的ID是:"+sess.getId()+"<br/>");
		out.print("session 是不是新创建的:"+sess.isNew()+"<br/>");
		long createTime = sess.getCreationTime();
		out.print("session 的创建时间:"+new Date(createTime)+"<br/>");
		long lastAccessedTime = sess.getLastAccessedTime();
		out.print("session 的上次访问时间:"+new Date(lastAccessedTime)+"<br/>");
		out.print("session 的有效期(默认30分钟):"+sess.getMaxInactiveInterval()+"<br/>");
		//向session中放入数据
		sess.setAttribute("name01", "小名");
		sess.setAttribute("name02", "小花");
		out.print("已经向session中放入了数据<br/>");	
		
	}


	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		//再次获取session对象
		HttpSession sess = request.getSession();
		out.print("session 的ID是:"+sess.getId()+"<br/>");
		out.print("session 是不是新创建的:"+sess.isNew()+"<br/>");
		long createTime = sess.getCreationTime();
		out.print("session 的创建时间:"+new Date(createTime)+"<br/>");
		long lastAccessedTime = sess.getLastAccessedTime();
		out.print("session 的上次访问时间:"+new Date(lastAccessedTime)+"<br/>");
		out.print("session 的有效期(默认30分钟):"+sess.getMaxInactiveInterval()+"<br/>");
		//获取到session中所有的name
		Enumeration<String> em = sess.getAttributeNames();
		//遍历Enumeration
		while(em.hasMoreElements()){
			//获取session中的每个name
			String name = em.nextElement();
			String value=(String)sess.getAttribute(name);
			out.println(name+"<====>"+value);
		}
		
		
		
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		// 使session失效
		//request.getSession().invalidate();
		
		request.getSession().removeAttribute("name01");
		
		//PS:销毁session和移除属性的区别:
		//session都销毁了,session中的所有数据都没有了
		//移除属性:仅仅将session中的部分数据移除
		
		out.println("session已经失效");;
	}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值