JavaWeb后端入门8—会话技术
1. 概述
1.1 什么是会话
会话简单理解为:用户打开一个浏览器,点击多个超链接访问服务器的 web资源,然后关闭浏览器,整个过程称为是一次会话。
1.2 为什么要使用
每个用户与服务器进行交互过程中,产生一些各自的数据,程序想要把这些数据进行保存,就需要使用会话技术。
例如:用户点击超链接购买一个商品,程序应该保存用户所购买的商品,以便于用户点击结账可以得到用户所购买的商品信息。
思考:用广购买的商品保存在request 或 Servletcontext中是否可以?
不可以 ①如果保存在request,响应结束之后,对象销毁,数据丢失②如果存储在ServletContext,因为只有一个,所有用户的购物车就会共享
2. 分类及实现原理
2.1 会话技术的分类
- cookie
- session
cookie
cookie是客户端技术,程序吧每个用户的数据以cookie的形式保存到各自浏览器中。当用户使用浏览器再次访问服务器中的web资源的时候,就会带这个字的数据过去。这样,web资源处理的就是用户各自的数据了。
session
session是服务器端技术。利用这个技术,服务器在运行时为每一个用户的浏览器创建一个独享的session对象。由于session为用户浏览器独享,所以用户在访问服务器的时候,可以把各自的数据放置在各自的session中,当用户再次访问服务器的web资源的时候,其他web资源再从用户各自的session中取出数据为用户服务。
2.2 会话技术的实现原理
cookie
session
3. Cookie的API
构造方法:
代码语言:javascript代码运行次数:0运行复制Cookie(String name,String value)
获得Cookie名称、值:
代码语言:javascript代码运行次数:0运行复制String string = getName()
String string = getValue()
设置Cookie有效域名
代码语言:javascript代码运行次数:0运行复制setDomain(String)
设置Cookie的有效路径
代码语言:javascript代码运行次数:0运行复制setPath(String)
设置Cookie 的有效时长:Cookie生命周期
代码语言:javascript代码运行次数:0运行复制setMaxAge(int)
4. 利用cookie记录上次访问的时间
4.1 基本需求及流程
4.2 代码实现
- cookie的简单实用
getCookies()获得从浏览器带来的cookie
addCookie()通过HttpServletresponse想浏览器回写cookie
- 1、抽取查找指定名称Cookie的工具类
package com.itheima.utils;
import javax.servlet.http.Cookie;
/**
* 查找指定名称Cookie的工具类
* */
public class CookieUtils {
public static Cookie findCookie(Cookie[] cookies,String name) {
if (cookies == null) {
//浏览器没有携带任何cookie
return null;
}else {
for(Cookie cookie:cookies) {
//判断数组中的每个cookie名称是否与给定名称一致
if (name.equals(cookie.getName())) {
//直接返回
return cookie;
}
}
return null;
}
}
}
- 2.实现代码
package com.itheima.cookie;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.itheima.utils.CookieUtils;
/**
* 记录用户上次访问时间的Servlet
*/
public class VisitServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 用户访问Servlet
* 如果是第一次访问:显示您好+记录当前访问时间,存入到cookie,回写到浏览器
* 如果不是第一次访问:从cookie中获得上次时间,显示到页面+记录当前时间,存入到cookie,回写到浏览器
* */
// 设置响应的消息体的数据格式以及编码(为了支持中文)
response.setContentType("text/html;charset=utf-8");
//判断是否为第一次访问:从置顶的cookie数组中获取指定名称的cookie
//获得从浏览器带过来的所有cookie
Cookie[] cookies = request.getCookies();
Cookie cookie = CookieUtils.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();
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日hh:mm:ss");
String currentTime = format.format(d);
//存入到cookie中
Cookie c = new Cookie("lastVisit",currentTime);
//回写到浏览器
response.addCookie(c);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
注意1:response.setContentType("text/html;charset=utf-8");
必不可少!!
注意2:最新版的Cookie中一定不能携带空格!!
4.3 代码存在的问题
关闭浏览器再打开的时候,cookie并不会保存,还是第一次访问时的情形。
这是Cookie的分类不同:
- 默认级别的Cookie
没有设置有效时间的Cookie,默认情况下,只要关闭浏览器,Cookie就被销毁。(存在于浏览器的内存中)
- 持久级别的Cookie
指的是有有效时间的Cookie,这种Cookie的内容不保存在浏览器内存中,将Cookie的内容保存到(持久化)到硬盘上。即使关闭浏览器,再次打开时也会加载硬盘上的文件,从而Cookie的数据就不会丢失。
4.4 代码改进
代码语言:javascript代码运行次数:0运行复制回写到浏览器之前,加入两句代码
//给Cookie设置有效路径
c.setPath("/web03");
//给Cookie设置有效时长(单位秒)
c.setMaxAge(60*60);//1小时
4.5 Cookie使用细节
- 一个Cookie至少含有一个名称和值
- 一个web站点可以给一个浏览器发送多个Cookie。一个Web浏览器也可以存放多个站点的Cookie
- 浏览器一般只允许存放300个Cookie,每个站点最多可以存放20个Cookie,每个Cookie的大小限制为4k(老版本)。 新版本浏览器无此限制
- 如果创建了一个Cookie,并发送到浏览器,默认情况下它是一个会话级别的,用户关闭浏览器就被删除。如果希望存储在硬盘上,需要设置SetMaxAge( ),这个值以秒为单位
- 如果需要删除持久性的Cookie,可以将Cookie的有效时长设置为0,。注意:删除Cookie是,path必须一致,否则无法删除。
5. Session概述
5.1 什么是Session
Session称为是一次会话,cookie将用户产生的私有的数据保存到浏览器端,Session将用户产生的私有的数据保存到服务器端。注意:一个浏览器独占一个session对象。因此,在需要保存用户数据时候,服务器程序可以将用户数据写到session对象中,当用户使用浏览器访问其他程序时,其他程序可以从用户的session中取出该用户的数据,为用户服务。
5.2 为什么需要Session
- Cookie的局限性
- Cookie保存的数据有个数和大小限制
- 数据是保存在客户端浏览器上(相对不是很安全)
- Session的优点
- Session无个数和大小限制
- 数据保存在服务器上
5.3 保存数据过程
5.4 Session实现原理-基于Cookie
6. Session作为域对象存取数据
6.1 作为域对象的API
- 向Session中存入数据
setAttribute()
- 从Session域中获取数据
getAttribute()
- 从Session域中移除数据
removeAttribute()
6.2 作为域对象的作用范围
作用范围是一次会话的范围。
即用户打开浏览器,打开若干个超链接,访问服务器资源,最后关闭浏览器的过程。
7. 登录案例
7.1 案例需求及功能分析
登录页面有:用户名、 密码、验证码、记住用户名、登录按钮
- 登陆失败
- 用户名或密码错误
- 验证码错误
- 回到登录页面
- 登陆成功
- 如果勾选了记住用户名,则利用Cookie记住登陆成功用户的用户名
- 需要将用户信息保存到Session中
- 进行页面跳转到成功页面
发布者:admin,转转请注明出处:http://www.yc00.com/web/1747998751a4717081.html
评论列表(0条)