首页 > 其他分享 >第06章 Session基础

第06章 Session基础

时间:2024-04-05 20:32:12浏览次数:19  
标签:session 浏览器 作用域 基础 Session 06 数据 客户端

Cookie和Session介绍

Cookie是当你访问某个网站的时候,由网站服务器存储在你本地电脑上的数据信息。当你再次访问这个网站时,网站服务器就会从Cookie中获取到之前存储的数据信息。请注意,Cookie是作为http请求头的一部分向网站服务器发送数据信息的。不过,这一切的操作对于访问用户是隐秘的。例如,我们现在访问百度首页,可以开发者模式查看Cookie

Cookie的主要目的就是为了标记用户身份。HTTP是一种无状态协议,即服务器不保留与客户端(浏览器)交互时的任何状态信息。这样做的目的是为了减轻服务器端的记忆负担,从而保持较快的响应速度。但是,有时候,我们需要让服务器知道客户端(浏览器)的身份信息。就需要使用Cookie和Session(会话)技术来解决。它的原理就是客户端浏览器第一次访问服务器的时候,返回浏览器一个唯一的字符串标示JSESSIONID,并要求浏览器再随后的访问中始终携带这个唯一标示。请注意,每一个浏览器都有属于自己的JSESSIONID,并且这个唯一标示是有时间限制的。也就是说,每一个访问服务器端的浏览器的JSESSIONID是不一样的,而且当你重新打开浏览器访问相同服务器的时候,JSESSIONID也可能会改变。

Session(会话)是服务器端的存储,Cookie则是客户端浏览器的存储。字符串标示JSESSIONID就像一把钥匙,所有用户的数据被存储在Session(会话)里面,而这把钥匙则存储在客户端浏览器的Cookie里面。客户端浏览器访问服务器的时候,在请求中会携带这把钥匙,服务器端可以根据这把钥匙,找到属于该客户端的Session(会话)存储空间,里面存储了只属于该客户端自己的信息。这样,服务器端就能够知道跟他交互的是那个客户的浏览器了。当然,不同客户端浏览器的JSESSIONID是不一样的,他们在服务器端的数据存储也是不一样的,多个客户端的数据存储是相互隔离,互不影响的。

有了JSESSIONID之后,服务器端就可以创建HttpSession对象了。我们可以通过 request.getSession 方法获取HttpSession对象,该对象可以让我们针对每一个请求用户存储属于它自己的数据信息。在Tomcat中,Session存储的数据有效期是30分钟,超过30分钟该Session将会过期。这里需要注意的是,Session的过期时间是从Session不被访问的时候开始计算,如果Session一直被访问,Session就总不会过期。简单理解,当你访问一个网站的时候,如果你半个小时候内没有任何点击新连接的操作(或者关闭浏览器),你的Session大概率会失效。比如,如果你登录了,那么登录信息也会失效,可能要求你重新登录。有时候为了避免这种情况发送,我们会使用JS间隔一段时间访问服务器端一次。只要客户端访问服务器,我们的Session的过期时间就会从0开始重新计时。

我们既可以在Servlet里面存放和读取Session数据,也可以在JSP中读取和存放数据。

Servlet中存放和读取Session数据:

// 向session存储数据
request.getSession().setAttribute("message", "hello");

// 读取session中的数据
String message = request.getSession().getAttribute("message").toString();
System.out.println("message=" + message);

首先,我们介绍 getSession() 方法,他可以获取到 HttpSession 对象,有了HttpSession 对象,我们就可以使用setAttribute方法存储数据,同时使用getAttribute方法来获取数据。请大家注意的是,Session并不是默认自动创建的。getSession() 中的可以提供一个布尔参数,例如 getSession(true) 表示:从当前request中获取Session,如果获取不到Session,则会自动创建一个Session,并返回新创建的Session;如果获取到,则返回获取到的Session。

JSP中获取和设置Session对象(自动创建):

// 向session存储数据
<% session.setAttribute("message1", "hi"); %>

// 读取session中的数据
<p><%= session.getAttribute("message1") %></p>

// 使用EL表达式,读取session中的数据
<p>${sessionScope.message1}</p>

另外HttpSession 对象还有其他方法来操作数据,

public void setAttribute(String name, Object value) 
使用指定的名称和值来存储一个数据对象到session中。

public Object getAttribute(String name)
返回session对象中与指定名称的数据对象,如果不存在则返回null。

public void removeAttribute(String name)
移除session中指定名称的数据对象。 
   
public Enumeration getAttributeNames()
返回session对象中所有的数据对象的名称。

public String getId()
返回session对象的ID
   
public long getCreationTime()
返回session对象被创建的时间戳(以毫秒为单位)。

public long getLastAccessedTime()
返回客户端最后访问的时间戳(以毫秒为单位)。

public int getMaxInactiveInterval()
返回session有效期(以秒为单位),默认1800秒

public void setMaxInactiveInterval(int interval)
设置session有效期(以秒为单位)
   
public void invalidate()
清除session对象

public boolean isNew()
返回是否为一个新的客户端

最后在作用域对象,我们之前已经使用过requestScope和sessionScope两个作用域对象。他们主要是EL表达式中读取作用域中的数据。我们如何理解这两个对象。首先,他们都是数据传递存放的容器而已,只不过生命周期不一样。requestScope中存储的数据只有在同一个请求中才可以访问,如果请求URL改变的话,里面的数据就失效无法访问了。而sessionScope域的生命周期要比requestScope长一些,只要sessionid不过期,在任何的请求中都可以访问到。注意,这里的任何请求的前提是同一个浏览器客户端(也就是同一个JSESSIONID)。

另外,还有 pageScope 和 applicationScope 两个作用域。pageScope 只能局限在JSP当前页面中使用,作用域太小,只能辅助做一些操作,因此使用很少。代码如下:

<% pageContext.setAttribute("name2", "servlet"); %>
<p>${pageScope.name2}</p>

applicationScope 的作用域是整个应用的生命周期,只要我们的Tomcat正在运行我们的工程,它就一直存在。applicationScope 里面的数据,可以被不同的请求访问,还可以被不同的客户端浏览器访问。在Servlet中操作 applicationScope 数据的话,我们需要获取ServletContext 对象, 如下

// application作用域
ServletContext content = this.getServletContext();
content.setAttribute("name", "java");
String name = content.getAttribute("name").toString();
System.out.println("name="+name);

如果想要在JSP中操作applicationScope 数据的话,代码如下

<% application.setAttribute("name3", "jsp"); %>
<p>${applicationScope.name3}</p>

需要注意的是,这个作用域是共享于所有的客户端浏览器。也就是说,张三和李四可以使用不同的客户端浏览器访问到相同的共享数据,并且该作用域的数据有效期直到我们的WebServer(例如Tomcat)重启才会失效。

本课程的案例工程为 “SessionDemo”,其中只有 TestServlet 和 test.jsp 两个重要文件。

首先是TestServlet类的doGet方法

		// 请求域对象的使用
		//request.setAttribute("msg", "hello");
		// 请求域需要转发
		//request.getRequestDispatcher("/test.jsp").forward(request, response);        
		       
		// 向session存储数据
		request.getSession().setAttribute("message", "hello");
		// 读取session中的数据
		String message = request.getSession().getAttribute("message").toString();
		System.out.println("message=" + message);

		// 有效期
		int time = request.getSession().getMaxInactiveInterval();
		System.out.println("time=" + time);

		// application作用域
		ServletContext content = this.getServletContext();
		content.setAttribute("name", "java");
		String name = content.getAttribute("name").toString();
		System.out.println("name="+name);

		// 重定向test.jsp
		response.sendRedirect(request.getContextPath() + "/test.jsp");

然后就是“test.jsp”文件内容

<h1><%= session.getId() %></h1>
<h1>${requestScope.msg}</h1>
<h1>${sessionScope.message}</h1>
<h1>${applicationScope.name}</h1>

<% session.setAttribute("message1", "hi"); %>
<p><%= session.getAttribute("message1") %></p>
<p>${sessionScope.message1}</p>

<% pageContext.setAttribute("name2", "servlet"); %>
<p>${pageScope.name2}</p>

<% application.setAttribute("name3", "jsp"); %>
<p>${applicationScope.name3}</p>

下面的页面是我们访问 TestServlet 后重定向后 test.jsp 的页面

上面页面第一行的粗体显示的就是JSESSIONID

Cookie中显示的也是这个JSESSIONID,两者一致。上面的<h1>粗体显示的是从 TestServlet 传递过来的数据,他们分别属于session和application作用域。而下面的<p>标签现实的是本JSP页面中存储和读取session,page和application作用域数据的效果。

此时,我们打开一个新的浏览器(Microsoft Edge)来直接访问“http://localhost:8080/SessionDemo/test.jsp”文件,不是“http://localhost:8080/SessionDemo/test”对应的TestServlet类。这样访问的后果就是,我们无法获取Servlet传递过来的数据。但是,如果数据作用域兼容我们新客户端浏览器访问方式的话,我们应该可以在JSP页面中获取到这些数据。比如 applicationScope 作用域里面的 “java” 数据。但是 sessionScope 作用域肯定是不行的,因为我们的客户端浏览器变了,JSESSIONID不一样了。

总结:正确使用 pageScope, requestScope, sessionScope, applicationScope 四个作用域的数据存储,对我们开发项目帮助非常大。pageScope 作用域最小,基本不使用,而applicationScope作用域范围最大,它可以共享于不同的客户端浏览器。我们日常开发中使用最多的是requestScope和sessionScope两个作用域。

标签:session,浏览器,作用域,基础,Session,06,数据,客户端
From: https://blog.csdn.net/richieandndsc/article/details/137407509

相关文章

  • JavaScript基础代码练习之数列第n位
    一、这段代码要求用户输入一个数字n,然后使用递归的方式计算斐波那契数列中第n位的值,并将结果以警告框的形式显示出来。斐波那契数列是一个经典的数学问题,其中每个数字是前两个数字的和,数列的前两个数字通常是1。因此,这段代码中的函数F(n)使用了递归的方式来计算第n位的斐波那契......
  • 使用阿里云试用Elasticsearch学习:1.1 基础入门——入门实践
    阿里云试用一个月:https://help.aliyun.com/search/?k=elastic&scene=all&page=1官网试用十五天:https://www.elastic.co/cn/cloud/cloud-trial-overviewElasticsearch中文文档:https://www.elastic.co/guide/cn/elasticsearch/guide/current/_document_oriented.html控制台......
  • three.js基础之几何体颜色、纹理贴图、外部模型
    几何体颜色<body><canvasid="mainCanvas"width="400px"height="300px"></canvas></body><scripttype="importmap">{"imports":{"three":"./js/build/......
  • 苹果macOS系统U盘版/恢复版基础安装教程
    目前,刻录U盘进行安装是主流选择,这样安装调试好的黑苹果macOS问题最少,也较为稳定。镜像恢复安装的方式,某宝上的远程安装的商家都是这么干的,但是其中很大一部分商家存在一个严重问题:macOS从10.14开始全面采用了APFS文件系统,但是当时的恢复软件无法支持这个文件系统,仅支持更老的......
  • three.js基础之动画、相机、材质、灯光
    动画<body><canvasid="mainCanvas"width="400px"height="300px"></canvas></body><scripttype="importmap">{"imports":{"three":"./js/build/thr......
  • 学习 Git 基础知识 - 日常开发任务手册
    欢迎来到我关于Git的综合指南,Git是一种分布式版本控制系统,已经在软件开发中彻底改变了协作和代码管理方式。无论你是经验丰富的开发者还是刚开始编程之旅的新手,理解Git对于正确掌控代码、高效管理项目和与他人合作至关重要。在本教程中,我将带领你了解Git的基础知识,涵盖从......
  • three.js基础之几何体Curve、Geometry
    CurveEllipseCurve<canvasid="EllipseCurve"width="300px"height="200px"></canvas><canvasid="ArcCurve"width="300px"height="200px"></canvas><canvasid="Curv......
  • 卷积神经网络基础
    卷积神经网络基础卷积神经网络(CNN)应用领域:图像识别、自然语言处理、语音识别等。多用与图像识别和计算机视觉领域与全连接神经网络相比,卷积神经网络进步的地方在于引入了卷积层结构和池化层结构这两层是CNN卷积网络中重要的部分,具有局部连接、权值共享等特点的深层前......
  • P4329 [COCI2006-2007#1] Bond
    原题链接题解二进制dpetc:令\(dp[00110]\)代表前两个任务选23两个人出战的最大成功率则\(dp[00110]=max(dp[00010]+a[3][2],dp[00100]+a[2][3])\)code#include<bits/stdc++.h>usingnamespacestd;doublea[25][25]={0};doubledp[1<<22]={0};intcal(intnow){......
  • 《前端小白逆袭记:0 基础也能轻松学会》
    随着互联网的快速发展,前端开发成为了一个备受关注的领域。对于零基础的学习者来说,可能会感到无从下手。但不必担心,本文将为你详细介绍0基础如何学习前端。一、学习前端的基础知识HTML(超文本标记语言)是网页的基础,它用于定义网页的结构。CSS(层叠样式表)用于美化网页,实现各......