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>