会话技术Cookie&Session

会话技术简介

1.存储客户端的状态

因为Http协议是无状态的,也就是说每个客户端访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客服端的状态。会话技术是帮助服务器记住客户端状态(区分客户端)

2.会话技术

从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。会话技术就是记录这次会话中客户端的状态与数据的。
会话技术分为:Cookie和Session
Cookie: 数据存储在客户端本地,减少服务器端的存储压力,安全性不好,客户端可以清除
Session: 将数据存储到服务器端,安全性相对好,但增加服务器的压力

Cookie技术

一、服务器端向客户端发送一个Cookie

1. 创建Cookie

//创建cookie对象
//Cookie cookie = new Cookie(String cookieName,String cookieValue);
Cookie cookie = new Cookie("name","zhangsan");

那么该Cookie会以响应头的形式发送给客户端。注意:在Tomcat8.0之前,Cookie中不允许存储中文字符,只能编码之后存储,比如URL encode;Tomcat8.0之后,允许存储中文字符,但是特殊符号仍然不行,也需要编码才行。
2. 设置Cookie在客户端的持久化时间

//为cookie设置持久化时间 ---- cookie信息在硬盘上保存的时间
//10分钟(单位秒) ---- 时间设置为0代表删除该cookie
cookie.setMaxAge(10*60);

注意:如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭,cookie信息销毁(会话级别的Cookie),如果设置持久化时间,Cookie信息会被持久化到浏览器的磁盘文件里。
3. 设置Cookie的携带路径

//访问WEB16下的任何资源时都携带这个cookie
cookie.setPath("/WEB16");

注意:如果不设置携带路径,那么该Cookie信息会在访问 产生该cookie的web资源所在的路径都携带该Cookie信息(具体描述:如果产生该cookie的servlet的访问路径是:/WEB16/sendCookie,那么其所在路径为/WEB,所以访问/WEB目录下所有web资源都会携带该cookie)。示例:

cookie.setPath("/WEB16");//代表访问WEB16应用中的任何资源都携带cookie
cookie.setPath("/WEB16/cookieServlet");//代表访问WEB16中的cookieServlet时或者/WEB16/cookieServlet/路径下的资源才携带cookie信息
cookie.setPath("/");//访问服务器下的所有的资源都携带这个cookie

4.向客户端发送cookie

//将cookie中存储的信息发送到客户端---响应头
response.addCookie(cookie);

5.删除客户端的cookie
如果想删除客户端的已经存储的cookie信息,那么就使用同名同路径的持久化时间为0的cookie进行覆盖即可。

		//删除客户端保存 name=zhangsan的cookie信息
		Cookie cookie = new Cookie("name","");
		//将path设置成与要删除cookie的path一致
		cookie.setPath("/WEB16");
		//设置时间是0
		cookie.setMaxAge(0);
		response.addCookie(cookie);

6.Cookie的唯一标识

二、服务器端接收客户端携带的Cookie

cookie信息是以请求头的方式发送到服务器端的。在每次请求中,浏览器会根据cookie的有效携带路径,自动携带Cookie的信息来到服务器。
在这里插入图片描述

		//获得客户端携带的cookie的数据
		Cookie[] cookies = request.getCookies();
		//通过cookie名称获得想要的cookie
		if(cookies!=null){
			for (Cookie cookie :cookies){
				//获得cookie的名称
				String cookieName = cookie.getName();
				if(cookieName.equals("name")){
					//获得该cookie的值
					String cookieValue = cookie.getValue();
					
					System.out.println(cookieValue);
				}
			}
		}

Session技术

Session 技术是将数据存储在服务器端的技术,会为每个客户端都创建块内存空间存储客户的数据,但客户端需要每次都携带一个标识去服务器中寻找属于自己的内存空间。所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客户的唯一标识JSESSIONID
1.获得Session对象

		//创建属于该客户端(会话)的私有的session区域
		// request.getSession()方法内部会判断 该客户端是否在服务器端已经存在session
		// 如果该客户端在此服务器不存在session 那么就会创建一个新的session对象
		// 如果该客户端在此服务器已经存在session 获得已经存在的该session返回
		HttpSession session = request.getSession();

此方法会获得专属于当前对话的Session对象,如果服务器端没有该会话的Session对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在Session了)。只有当Session对象不存在时,服务器会自动把JSESSIONID响应给浏览器,以后每次都是浏览器携带JSESSIONID寻找服务器session区域,而服务器不在返回JSESSIONID的set-cookie响应。(简单来说,只有当服务器创建Session的请求中才返回JSESSIONID,以后每次响应都不会再返回JSESSIONID)。JSESSIONID的有效携带路径默认为该web应用下的所有资源。如:/WEB16
2.向Session中存取数据(Session也是一个域对象)
Session也是存储数据的区域对象,所以Session对象也具有如下三个方法:

session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);

3.Session对象生命周期
创建:第一次执行request.getSession()时创建
销毁:

  1. 服务器(非正常)关闭时
  2. session过期/失效(默认30分钟,Tomcat中配置)。从不操作服务器的资源开始计时(最后一次访问服务器的时间开始)。也可以在工程的web.xml中进行配置:<session-config> <session-timeout>30</session-timeout> </session-config>
  3. 手动销毁session:session.invalidate();

4.Session作用范围
默认在一次会话中,也就是说,一次会话中任何资源公用一个session对象。
5.getSesssion()方法与HttpSession对象的相关方法
Session是与每个请求消息紧密相关的,为此,HttpServletRequest定义了用于获取Session对象的getSession()方法,该方法有两种重载形式,具体如下:
上面重载的两个方法都用于返回与当前请求相关的HttpSession对象。不同的是,第一个getSession()方法根据传递的参数来判断是否创建新的HttpSession对象,如果参数为true,则在相关的HttpSession对象不存在时创建并返回新的HttpSession对象,否则不创建新的HttpSession对象,而是返回null。第二个getSession()方法则相当于第一个方法参数为true时的情况,在相关的HttpSession对象不存在时总是创建新的HttpSession对象。
要想使用HttpSession对象管理会话数据,不仅需要获取到HttpSession对象,还需要了解HttpSession对象的相关方法。如表:

方法声明功能描述
String getId()用于返回与当前HttpSession对象关联的会话标识号
long getCreationTime()返回Session创建的时间,这个时间是创建Session的时间与1970年1月1日00:00:00之间时间差的毫秒表示形式
long getLastAccessedTime()返回客户端最后一次发送与Session相关请求的时间,这个时间是发送请求的时间与1970年1月1日00:00:00之间时间差的毫秒表示形式
void setMaxInactiveInterval(int interval)用于设置当前HttpSession对象可空闲的以秒为单位的最长时间,也就是修改当前会话的默认超时间隔
boolean isNew()判断当前HttpSession对象是否是新创建的
void invalidate()用于强制是Session对象无效
ServletContext getServletContext()用于返回当前HttpSession对象所属于的WEB应用程序对象,即代表当前WEB应用程序的ServletContext对象
void setAttribute(String name,Object value)用于将一个对象与一个名称关联后存储到当前的HttpSession对象中
String getAttribute()用于从当前HttpSession对象中返回指定名称的属性对象
void removeAttribute(String name)用于从当前HttpSession对象中删除指定名称的属性
Enumeration<String> getAttributeNames()获得HttpSession对象中所有的属性的名称(所有键值对的键)

注意问题:
1:浏览器关闭,session就销毁了?不对,session的销毁默认是不访问起30分钟,与浏览器状态无关,浏览器关闭,也就是会话级别的Cookie消失,默认的JSESSIONID消失,但是服务器的Session依然存在。
2:服务器关闭,此次会话结束?不对,会话的结束关键在于浏览器状态,与服务器无关。如果服务器再次重启,浏览器状态不变,任然是同一次会话。
3:Cookie和浏览器缓存的区别:浏览器缓存可以缓存任意内容(上网浏览的所有内容),而Cookie只是服务器需要浏览器缓存的数据(是浏览器缓存中的一部分)

补充
Cookie一般由服务端设置,但是,客户端JS也能够设置Cookie,有关Cookie详情查看该篇博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值