前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java学习笔记-全栈-web开发-07-Session&Cookie

Java学习笔记-全栈-web开发-07-Session&Cookie

作者头像
devi
发布2021-08-18 15:27:40
1.5K0
发布2021-08-18 15:27:40
举报
文章被收录于专栏:搬砖记录

1. 会话

1.1 什么是会话

每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。

例如:用户点击超链接通过一个servlet购买了一个商品,程序应该想办法保存用户购买的商品,以便于用户点结帐servlet时,结帐servlet可以得到用户购买的商品为用户结帐。

通过回话,能够实现浏览器与服务器交互时的部分数据存取。

会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

1.2 为什么需要会话

因为HTTP协议是无状态的。 这说明HTTP不能记录任何信息,但是交互需要承前启后,因此引入“会话技术”。 详情可以查看百度百科:HTTP无状态协议

1.3 会话技术

会话技术有两种:

  • Cookie:客户端(浏览器)技术
    • 程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
  • Session:服务端技术
    • 服务器在运行时可以为每一个用户的浏览器创建一个其独享的HttpSession对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务

2. Cookie

  • 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
  • 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
  • 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
  • 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。

2.1 API

javax.servlet.http.Cookie

  • javax.servlet.http.Cookie类用于创建一个Cookie
  • response接口中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段。
  • request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookie。

2.1.1 Cookie的流程

  • 1.服务端定义addCookie,在响应头中增加set-Cookie,客户端接收
  • 2.客户端创建cookie
  • 3.客户端再次访问的时候,将上次的cookie返回给服务器

2.1.2 Cookie类的方法

  • public Cookie(String name,String value)
  • setValue与getValue方法
  • setMaxAge与getMaxAge方法 (秒) 生命周期
  • setPath与getPath方法
  • setDomain与getDomain方法
  • getName方法

2.1.3 Cookie类的常用属性

2.2 Cookie应用场景

2.2.1 记录访问时间

先检验是否存在Cookie,若有,则获取Cookie中的数据,若无,则创建Cookie,以供下次使用

2.2.1.1 maxAge方法

顾名思义,最大年龄–>Cookie的存活时间

maxAge: cookie的缓存时间。默认是-1,默认存在浏览器的缓存中。单位是秒

  • 负数:表示cookie的数据存在浏览器缓存中(关闭浏览器删除)
  • 0:表示删除cookie(得响应给浏览器,他才会删除,response.addCookie())
  • 正数:缓存在持久化磁盘上的时间

2.2.2. 记录用户名

2.2.2.1 html(jsp)
2.2.2.2 js
代码语言:javascript
复制
//通过document对象获取cookie,拿到用户名以及是否remember。
//通过window.onload在页面加载时根据remember的值选择是否载入用户名

<script type="text/javascript">
	var cookies = document.cookie.split(';');
	//通过key获取cookie的值
	function getCK(mkey) {
		
		for(var i = 0;i<cookies.length;i++){
			var kv = cookies[i].split('=');
			//key有可能空字符串
			if( kv[0].trim() == mkey){
				return kv[1].trim();
			}
		}
		 
		return '';
	}
	
	window.onload = function(){
		var remember = getCK('remember');
		var username = getCK('username');
		
		console.log(remember + "---");
		console.log(username);
	 	if(remember == 'true'){//记住密码
			//console.log('记住密码');
			var userNameInput = document.getElementById('username');
			userNameInput.value = username;
			
			var rememberInput = document.getElementById('remember');
			rememberInput. checked="checked";
		}
	}
</script>
2.2.2.3 Servlet

2.2.3 历史记录

目标: 查看书籍的浏览记录

2.2.3.1 原理
  • 1.客户端访问书籍(查看一本具体的书,viewBookServlet处理)(发送响应给服务端),服务端返回时让其设置Cookies
  • 2.客户端查看书籍首页(查看所有的书,showAllBookServlet处理),服务端拿到cookies,放在集合中,然后根据cookies(访问记录)响应历史内容给客户端
2.2.3.2 model
2.2.3.3 模仿数据库数据
2.2.3.4 showAllBookServlet

注:此处通过getWriter().writer()直接写回html代码,这种方式仅用于测试学习,不适合正式开发

这个Servlet用于展示所有的书籍,并获取cookie展示历史记录(不做cookie的创建)

2.2.3.5 viewBookServlet

用户查看书籍详情页 为其创建cookie,作为访问历史的记录 为保证历史记录的正确性,每次都需要移除旧的相同cookie,创建新的cookie并更新存活时间。

3. Session

在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象)

注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

Session特点:

  • Session是一种key-value的键值对
  • Session对象是在客户端第一次请求服务器的时候自动创建的。(不需要我们来创建session,我们需要做的就是set和get数据,但是,访问静态资源是不会创建session的)
  • Session技术把用户的数据写到用户独占的session中。
  • Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
  • 每个浏览器存储自己的数据到Session中,服务器一般Session放在内存里
  • Session的数据是不能被其它浏览器共享的,是相对安全
  • Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session

疑问:服务器是如何实现一个session为一个用户浏览器服务的?

  • 服务器会为每个浏览器分配一个session ID,然后把Session ID通过Cookie的形式存储在客户端
  • 客户端第一次访问服务端的时候,服务端创建session,分配id并通过cookies响应给客户端
  • 客户端将带session的cookies存在本地,下次访问的时候,会带上cookies
  • 注意:尽管session保存在cookie中,当浏览器关闭后,cookie还在,但session在服务端已经销毁,因此相当于没有保存session

所以:创建session,也会同时创建cookie

3.1 session常用方法

  • 把数据保存在HttpSession对象中,该对象也是一个域对象。
  • void setAttribute(String name,Object value);
  • Object getAttribute(String name);
  • void removeAttribute(String name);
  • HttpSession.getId()
  • setMaxInactiveInterval(int interval) 设置session的存活时间
  • invalidate() 使此会话无效,删除session

HttpSession request.getSession(boolean create) 参数create: true:根据客户端JSESSIONID的cookie的值,找对应的HttpSession对象,找不到则创建一个 false:根据客户端JSESSIONID的cookie的值,找对应的HttpSession对象,找不到返回null(不会创建新的,只是查询)。

3.2 session状态

  • 创建:当浏览器第一次访问服务器动态资源就创建
  • 活着:服务器应用运行时
  • 死亡:
    • Session.invalidate();强制销毁
  • 超时:默认30分钟
    • setMaxInactiveInterval(int )单位秒

可以在xml统一配置存活时间

代码语言:javascript
复制
<session-config>
	<!--单位是分钟-->
	<session-timeout>1</session-timeout>
</session-config>

3.3 session 实验

考虑“会话”以及“一个浏览器拥有一个session对象”的含义,尽管上面是两个不同的访问,但能够共享同一个session。

3.4 session应用场景

3.4.1 购物车实现

原理:利用session,保存用户的临时操作数据

  1. 展示所有书
  2. 加入购物车:用户点击购买书之后,将该书加入session
  3. 查看购物车:从session中获取数据
  • 购物列表showAllBookServlet,展示所有书
  • 购买servlet
  • 显示购物车

3.4.2 验证码

原理: 1.在验证码创建的地方,将验证码存到session 2.在用户输入验证码的地方,访问服务器后将用户输入与session中的验证码进行对比

实现前先思考:用session进行验证码和用request对验证码进行验证的区别?(本节底部给出解释)

  • 生成验证码,存入session
  • 登录页面

这种写法仅用于测试,一般来说使用form的POST方法提交登录数据。

  • 登录处理servlet

用session进行验证码和用request对验证码进行验证的区别?

  • session: 生成验证码并保存、传递验证码、检验验证码,都是通过一个session会话实现的,好处显而易见,保证了数据的安全,实现方法简洁优雅。
  • request: 生成验证码后保存到服务端、通过response传递验证码给浏览器、浏览器通过request传回服务端、服务端进行验证码比对。显然,上述方法麻烦多了,而且数据不安全,甚至可能不稳定。

3.5 session持久化

xx持久化:将xx保存在本地硬盘(或者数据库),一般指的就是数据的持久化。session也是数据。

  • 持久化的优点:
    • 节约内存空间
    • 确保在服务器重启或单个Web应用重启后,能恢复重启前的会话

3.5.1 持久化状态

Session在其生命周期中,可能会在运行时状态和持久化状态之间转换。(被持久化对象需要先实现可序列化接口 Serializable)

Serializable:凡是想要将对象保存在本地,都需要实现可序列化接口。

3.5.1.1 搁置

会话从运行时状态变为持久化状态的过程称为 —— 搁置(从内存到硬盘);

在以下情况下,Session会被搁置:

  • 当服务器重启或单个Web应用终止时,Web应用中的Session会被搁置;
  • 会话处于不活动状态的时间太长,达到了特定的限定值;
  • Web应用中处于运行状态的会话数目太多,达到了特定的限制值,部分Session被搁置
3.5.1.2 激活

会话从持久化状态变为运行时状态的过程称为激活;

在以下情况下,Session会被激活:

  • 当服务器重启或单个Web应用重启时,Web应用中的Session会被激活
  • 处于Session中的客户端想Web应用发出HTTP请求,相应的Session会被激活

3.5.2 持久化路径

会话持久化的路径是在**\work\Catalina\localhost\项目名**下

4. cookie与session的区别与联系

区别

  • cookie:
    • 服务器通知浏览器创建,浏览器保存。
    • 保存时间由浏览器决定,通常非常长。
    • 不考虑数据安全,可使用cookie
    • 考虑服务器性能,使用cookie
  • session:
    • 服务器创建,服务器保存,通过cookie将session传递给浏览器。
    • 有效时间由服务器决定,通常只有一个会话时长。
    • 考虑数据安全,使用session
    • 不考虑服务器性能,使用session

联系

  • session是通过cookie来工作的 session和cookie之间是通过_COOKIE[‘PHPSESSID’]来联系的,通过_COOKIE[‘PHPSESSID’]可以知道session的id,从而获取到其他的信息。

cookie和session结合使用

  • 存储在服务端:通过cookie存储一个session_id,具体的数据则是保存在session中。如果用户已经登录,则服务器会在cookie中保存一个session_id,下次再次请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做server side session
  • 将session数据加密,然后存储在cookie中。这种专业术语叫做client side session
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/12/20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 会话
    • 1.1 什么是会话
      • 1.2 为什么需要会话
        • 1.3 会话技术
        • 2. Cookie
          • 2.1 API
            • 2.1.1 Cookie的流程
            • 2.1.2 Cookie类的方法
            • 2.1.3 Cookie类的常用属性
          • 2.2 Cookie应用场景
            • 2.2.1 记录访问时间
            • 2.2.2. 记录用户名
            • 2.2.3 历史记录
        • 3. Session
          • 3.1 session常用方法
            • 3.2 session状态
              • 3.3 session 实验
                • 3.4 session应用场景
                  • 3.4.1 购物车实现
                  • 3.4.2 验证码
                • 3.5 session持久化
                  • 3.5.1 持久化状态
                  • 3.5.2 持久化路径
              • 4. cookie与session的区别与联系
              相关产品与服务
              云服务器
              云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档