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的简单实用
代码语言:javascript代码运行次数:0运行复制
getCookies()获得从浏览器带来的cookie
addCookie()通过HttpServletresponse想浏览器回写cookie
  • 1、抽取查找指定名称Cookie的工具类
代码语言:javascript代码运行次数:0运行复制
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.实现代码
代码语言:javascript代码运行次数:0运行复制
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中存入数据
代码语言:javascript代码运行次数:0运行复制
setAttribute()
  • 从Session域中获取数据
代码语言:javascript代码运行次数:0运行复制
getAttribute()
  • 从Session域中移除数据
代码语言:javascript代码运行次数:0运行复制
removeAttribute()

6.2 作为域对象的作用范围

作用范围是一次会话的范围。

即用户打开浏览器,打开若干个超链接,访问服务器资源,最后关闭浏览器的过程。

7. 登录案例

7.1 案例需求及功能分析

登录页面有:用户名、 密码、验证码、记住用户名、登录按钮

  • 登陆失败
    • 用户名或密码错误
    • 验证码错误
    • 回到登录页面
  • 登陆成功
    • 如果勾选了记住用户名,则利用Cookie记住登陆成功用户的用户名
    • 需要将用户信息保存到Session中
    • 进行页面跳转到成功页面
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2021-04-20 ,如有侵权请联系 cloudcommunity@tencent 删除浏览器入门数据对象后端