会话技术(Cookie && Session)

1、会话技术的概述

用户打开一个浏览器,点击多个超链接访问服务器的web资源,然后关闭浏览器,整个过程就是一次会话。每个用户与服务器进行交互时,都会产生一些各自的数据,程序想要把这些数据进行保存就需要使用会话技术。

为什么需要会话技术?如下例:购物
request域:
保存的数据只在一次请求范围内有效,每次响应结束后,request会被销毁,其中保存的数据丢失。
用户的多次购买请求发出后,最后发现除了最后一次之前的数据都丢失了。
ServletContext域:
保存的数据在整个web项目运行时都有效,当web项目从服务器中移除或者关闭服务器时,ServletContext对象会被销毁,里面的数据才会失效,数据保存在服务器的内存中。
因为整个web项目只有一个ServletContext对象,所以保存的数据综合在一起,多个用户的购买信息就会统一在一起结算。

会话技术的分类:Cookie和Session

Cookie是客户端技术,程序把每个用户的数据以cookie的形式保存到各自的浏览器中,当用户用浏览器再次访问服务器中web资源时,就会带着各自的数据(cookie)过去。这样,web资源处理的就是用户各自的数据了。

Session是服务器端技术,利用这个技术,服务器在运行时会为每一个用户的浏览器创建一个独享的session对象。由于这个session为用户浏览器所独享,所以用户在访问服务器时,可以把各自的数据放在各自的session中,当用户再次访问服务器中的web资源时,其他web资源再从用户各自的session中取出这个数据来为用户服务。

为什么有Cookie还有Session?
Cookie有局限性:
Cookie保存的数据是有个数和大小限制的;
数据是保存在客户端浏览器上,相对来说不是很安全。
Session:
Session没有个数和大小限制的;
数据保存在服务器上,相对来说较为安全。

Cookie的使用----案例:记录用户上次访问时间

1、获得从浏览器带过来的Cookie
	通过HttpServletRequest对象中的方法:getCookie()  返回的是一个数组
2、向浏览器回写Cookie
	通过HttpServletResponse对象中的方法:addCookie()
3、Cookie的构造
	Cookie(String name, String value)
4、创建web项目
//如果是第一次访问
    显示 您好,欢迎访问本网站!
    记录当前访问时间,存入到Cookie中,回写到浏览器
//如果不是第一次访问
    从Cookie中获得上一次访问的时间,显示到浏览器
    记录当前访问时间,存入到Cookie中,回写到浏览器

    
编写工具类
//判断是否是第一次访问:从指定的Cookie的数组中获取指定名称的Cookie(将这个操作写成一个工具类CookieUtil)
	public class CookieUtil {
		public static Cookie findCookie(Cookie[] cookies,String name) {
			if(cookies==null) {
				//浏览器没有携带任何的Cookie
				return null;
			}else {
				for(Cookie cookie:cookies) {
					//判断数组中的名称与给定的名称是否一致
					if(name.equals(cookie.getName())) {
						return cookie;
					}
				}
				//浏览器带有Cookie过来,但是没有指定名称的Cookie
				renturn null;
			}
		}
	}


Servlet中:
    //获得从浏览器带过来的所有Cookie
    Cookie[] cookies = request.getCookies();
	//从数组中查找指定名称的Cookie
	Cookie cookie = CookieUtil.findCookie(cookies,"lastVisit");
	//判断是否是第一次访问
	if(cookie == null) {
        //是第一次访问,可以显示到页面上一段内容
        response.setContentType("text/html;charset=UTF-8");
        response,getWriter().println("<h1>您好,欢迎访问本网站!</h1>");
    }else {
        //不是第一次访问
        //获得Cookie中上一次的访问时间
        String value = cookie.getValue();
        //显示到页面上一段内容
        response.setContentType("text/html;charset=UTF-8");
        response,getWriter().println("<h1>您好,您的上一次访问时间是:"+value+"</h1>");
    }
	//记录当前的系统时间存入到Cookie,回写到浏览器
	Date d = new Date();
	//存入到Cookie中
	Cookie c = new Cookie("lastVisit",d.toLocaleString);
	//给Cookie设置有效路径
	c.setPath("/项目名");---访问这个项目下的任意路径都会带着这个Cookie
	//给Cookie设置有效时间
	c.setMaxAge(0);---设置为0表示手动删除持久性Coolie
    c.setMaxAge(60*60);---设置有效时长为1小时
	//回写到浏览器
	response.addCookie(c);

Cookie的分类

上文案例存在问题:用户如果关闭浏览器后再重新打开浏览器,会有又变成第一次访问
Cookie的分类:
默认会话级别的Cookie
没有设置有效时间,因为Cookie保存在浏览器的内存中,当关闭了浏览器Cookie就销毁了
持久级别的Cookie
有有效时间的Cookie,这种Cookie的内容不是保存在浏览器的内存中,将Cookie的内容持久化到硬盘上,这时关闭浏览器后再打开就直接加在硬盘上的文件,Cookie中的数据不会丢失,直到有效时间到了。

Cookie中的API:
1、构造方法:Cookie(String name, String value)
2、其他的方法
获得Cookie的名称/值:getName()/getValue()
设置Cookie的有效域名:setDomain(String pattern)
设置Cookie的有效路径:setPath(String uri)
设置Cookie的有效时间:setMaxAge(int expiry)

Cookie的使用细节

(1)一个Cookie只能标识一种信息,至少含有一个标识该信息的名称和值。
(2)一个web站点可以给一个浏览器发送多个Cookie,一个web浏览器可以存储多个web站点的Cookie。比如一个火狐浏览器可以存储新浪发过来的Cookie,也可以存储百度发过来的Cookie。
(3)浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB(老版本的浏览器)。------浏览器多存放的Cookie的大小和个数是有限度的
(4)如果创建了Cookie,并发送到浏览器,默认情况下它是一个会话级别的Cookie。如果希望将这个Cookie存储到磁盘上,需要设置有效时长,它是以秒为单位的。
(5)手动删除持久性Cookie时,需要设置有效时长为0,再回写到浏览器;删除时path必须一致。

Session作为域对象

Session作为域对象的API:
向Session中存入数据:setAttribute(String name,Object value)
从Session中获取数据:getAttribute(String name)
从Session中移除数据:removeAttribute(String name)

Session作为域对象的作用范围:一次会话的范围,一次会话指的是用户打开浏览器点击多个超链接,访问服务器资源,到最后关闭浏览器的过程。也就是说Session保存的数据可以在多次请求范围内都有值,但是它所保存的是当前浏览器的用户的私有的数据。比如用户的登录信息,购物信息,验证码。。。

补充:Servlet的域对象的总结

请求范围(ServletRequest)
创建:当用户向服务器发送一次请求,服务器就会创建一个request对象
销毁:当服务器对这次请求作出了响应,服务器就会销毁这个request对象
存数据:void setAttribute(String name,Object value)
取数据:Object getAttribute(String name)
作用范围:一次请求(转发就是一次请求)

会话范围(HttpSession)
创建:服务器端第一次调用getSession()方法时,服务器就会创建一个session对象
销毁:
1.session过期,默认是30分钟
2.非正常关闭服务器(正常关闭服务器时session会被序列化)
3.手动销毁,调用session.invalidate()
存数据:void setAttribute(String name,Object value)
取数据:Object getAttribute(String name)
作用范围:一次会话的范围(多次请求)

应用范围(ServletContext)
创建:服务器启动时创建,服务器会为每个web项目都创建一个单独的ServletContext对象
销毁:服务器关闭或者项目从服务器移除的时候。
存数据:void setAttribute(String name,Object value)
取数据:Object getAttribute(String name)
作用范围:整个应用的范围,保存的数据在项目的任何地方都可以使用

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天然首长

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

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

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

打赏作者

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

抵扣说明:

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

余额充值