会话

1.会话技术的概述

1.1 什么是会话

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

1.2 为什么要学习会话

每个用户与服务器进行交互过程中,产生一些各自的数据,程序想要把这些数据进行保存,就需要使用会话技术。
例如:用户点击超链接购买了一个商品,程序应该保存用户所购买的商品,以便于用户点击结账可以得到用户所购买的商品信息。

思考:用户购买的商品信息保存在request或ServletContext中是否可以?
在这里插入图片描述

1.3 会话技术的实现原理

会话技术分类:
cookie技术
Session技术

1.3.1 Cookie技术

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

在这里插入图片描述

1.3.2 Session技术

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

在这里插入图片描述

2.Cookie

2.1 案例-记录用户上次访问时间

2.1.1 分析

在这里插入图片描述

2.1.2 Cookie的简单使用

获得从浏览器带过来的Cookie

通过HttpServletRequest对象中的方法:
在这里插入图片描述
向浏览器中回写Cookie

通过HttpSerlvetResponse对象中的方法:
在这里插入图片描述
Cookie的构造
在这里插入图片描述

2.1.3 案例代码实现

创建一个工具类 CookieUtils
在这里插入图片描述
编写Serlvet
在这里插入图片描述
这端代码问题出在response.addCookie©;中
由于无法回写到浏览器中的Cookie,导致页面一直没有刷新出来上次访问时间。
这是因为Cookie中不能含有空格字符,而普通的Date格式是无法直接存入到Cookie中的。所以使用SimpleDateFormat来对Date格式进行修正。

2.2 Cookie的分类

2.2.1 记录用户上次访问时间存在问题

用户访问Servlet,记录用户的上次访问时间。但是如果用户将浏览器关闭,重新打开浏览器访问程序,程序就会把其当成是第一次访问。

2.2.2 分类

2.2.2.1 默认级别的Cookie

指的是没有设置有效时间的Cookie,默认的情况下只要关闭了浏览器,Cookie也会被销毁。Cookie存在于浏览器的内存中,当关闭了浏览器Cookie就销毁了。

2.2.2.2 持久级别的Cookie

指的是有有效时间的Cookie,这种Cookie的内容不是保存在浏览器的内存中,将Cookie的内容保存(持久化)到硬盘上。这个时候,关闭浏览器,再次打开浏览器会加载硬盘上的文件,从而Cookie中的数据就不会丢失。

2.3 Cookie的API

2.3.1 构造方法

在这里插入图片描述

2.3.2 其他方法

  • 获得cookie的名称
    在这里插入图片描述

  • 获得cookie的值
    在这里插入图片描述

  • 设置cookie的有效域名
    在这里插入图片描述

  • 设置cookie的有效路径
    在这里插入图片描述
    设置有效路径后,只有访问这个路径,才会启用这个cookie

  • 设置cookie的有效时长
    在这里插入图片描述

2.3.3 案例问题解决

在这里插入图片描述
这样子这个cookie经过1小时就会删除了,当然如果想手动删除这个持久化的cookie只需要把 (60*60)设置成(0)即可,前提是路径相同,所以在设置cookie有效时长之前一般都会设置有效路径。

2.4 Cookie的使用细节

  • 一个Cookie只能标识一种信息,至少含有一个标识该信息的名称和值。
  • 一个web站点可以给一个浏览器发送多个cookie。一个web浏览器可以存储多个web站点的cookie。
  • 浏览器一般只允许存放300个cookie,每个站点最多存放20个cookie,每个cookie的大小限制为4KB(老版本浏览器)。——即浏览器存放的Cookie的大小和个数是有限制的。
  • 如果创建了一个cookie,并发送到浏览器 ,默认级别下它是一个会话级别的cookie。用户退出浏览器就被删除。如果希望把这个cookie存放到磁盘上,需要设置有效时长调用setMaxAge(int maxAge)方法,以秒为单位。
  • 需要手动删除持久性cookie,可以将cookie的有效市场设置为0.必须注意:删除cookie时候,path必须一致,否则无法删除。

3.Session

3.1 概述

3.1.1 什么是Session

Session称为是一次会话,与Cookie不同的是,cookie将用户产生的私有的数据保存到浏览器端,Session将用户产生的私有的数据保存到服务器端。注意:一个浏览器独占一个Session对象。因此,在需要保存用户数据的时候,服务器程序可以将用户数据写到session对象中,当用户使用浏览器访问其他程序时,其他程序可以从用户的session中取出该用户的数据,为用户服务。

3.1.2 为什么有了Cookie还要有Session

Cookie的局限性

  • Cookie保存的数据是有个数和大小限制的。
  • 数据保存在客户端的浏览器上(相对不是很安全)。

Session

  • Session是没有个数和大小限制的。
  • 数据是保存在服务器上(相对比较安全)。

3.1.3 Session如何保存数据

Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到Session对象。
在这里插入图片描述

3.2 Session的实现原理

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

在这里插入图片描述
Session的实现原理:

  • 基于Cookie的,基于Cookie回写了一个Session的ID。

3.3 Session作为域对象存取数据

3.3.1 Session作为域对象的API

  • 向Session中存入数据
    在这里插入图片描述
  • 从Session域中获取数据
    在这里插入图片描述
  • 从Session域中移除数据在这里插入图片描述

3.3.2 Session作为域对象的作用范围

Session作为域对象,作用范围就是一次会话的范围,指的是用户打开浏览器点击多个超链接,访问服务器资源,到最后关闭浏览器的过程。

3.4 Servlet的数据访问范围的总结

3.4.1 Serlvet的域对象的总结

3.4.1.1 请求范围(ServletRequest)

何时创建和销毁的

  • 创建:当用户向服务器发送一次请求,服务器创建一个Request对象。
  • 销毁:当服务器对这次请求做出了响应,服务器就会销毁这个Request对象。
    如何存取数据
  • 存数据:void setAttribute(String name,Object value);
  • 取数据:Object getAttribute(String name);
    作用范围
  • 作用范围:一次请求。(转发就是一次请求)。
3.4.1.2 会话范围(HttpSession)

何时创建和销毁的

  • 创建:服务器第一次调用getSession()方法的时候。
  • 销毁:三种情况可以销毁Session。
    ① Session过期,默认的过期时间30分钟。
    ② 非正常关闭服务器。(正常关闭服务器Session会被序列化)。
    ③ 手动调用session.invalidate();
    如何存取数据
  • 存数据:void setAttribute(String name,Object value);
  • 取数据:Object getAttribute(String name);
    作用范围
  • 作用范围:一次会话的范围(多次请求)。
3.4.1.3 应用范围(ServletContext)

何时创建和销毁的

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

3.5 案例

3.5.1 案例需求描述

在这里插入图片描述

3.5.2 案例准备

创建项目,导包,项目环境搭建,引入C3P0配置文件

3.5.3 案例代码-用户登录功能

用户登录流程

用户输入用户名或密码进行登录:

  • 如果用户名或密码错误,保存错误信息,回到登录页面
  • 如果用户名和密码正确,将用户的信息保存到会话中,跳转到成功页面。

代码实现

登录界面(login.jsp)写法与上一个项目的大同小异

成功界面(success.jsp):

//这个间隔尖括号的写法在后面会被其他写法代替。

<body>
	//如果用户未经登录就进入了这个界面,就会提醒用户前去登录
	<%
		if(request.getSession().getAttribute("exisUser") == null){
	%>
	<h1>您还没有登录!请先去<a href="login.jsp">登录</a></h1>
	<%
		}else{
	%>
	<h1>用户登录成功!</h1>
	<%
		User exisUser = (User) session.getAttribute("exisUser");
		Integer uno = exisUser.getUno();
		String uname = exisUser.getUname();
		String password = exisUser.getPassword();
		String local = exisUser.getLocal();
	%>
<h2>账号id:<%= uno%></h2>
<h2>用户名:<%= uname%></h2>
<h2>密码:<%= password%></h2>
<h2>地址:<%= local%></h2>
	<%
		}
	%>
</body>

3.5.4 案例代码-一次性验证码的分析

一次性验证码作用

一次性验证码作用:防止恶意灌水。而且一次性验证码只能使用一次,不管成功与否,验证码都将失效。

一次性验证码的校验

一次性验证码生成(随机生成4个字母或数字,由response生成一张图片响应到页面)。
在这里插入图片描述
代码实现
……

3.5.5 案例代码-记住用户名的实现

需求概述

如果在登录的过程中,将记住用户名的复选框勾选了,而且在登录成功情况下,需要记住用户名,在关闭服务器,下次访问该网站的登录页面的时候,会在用户名的文本框中自动呈现出用户名。

代码实现

  • 记住用户名的后台代码
    在这里插入图片描述

3.5.6 案例代码-系统退出

        //销毁Session
        request.getSession().invalidate();
        //页面跳转
        response.sendRedirect("/LoginRenew/success.jsp");
	<h3><a href="/LoginRenew/LogOutServlet">退出</a> </h3>
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值