板块一 Servlet编程:第六节 HttpSession对象全解 来自【汤米尼克的JAVAEE全套教程专栏】

这篇具有很好参考价值的文章主要介绍了板块一 Servlet编程:第六节 HttpSession对象全解 来自【汤米尼克的JAVAEE全套教程专栏】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在上一节中,我们学习了Servlet五大对象里的第三个Cookie对象,但Cookie是有大小限制和数量限制的,并且越来越多的Cookie代表客户端和服务器的传输量增加,可不可以每次传的时候不传所有Cookie值,而只传一个唯一ID,通过这个ID直接在服务器查找用户信息呢?答案是有的,这就是我们的Session

一、什么是HttpSession

Session的本质

Session是基于Cookie来工作的,同一个客户端每次访问服务器时,只要当浏览器在第一次访问服务器时,服务器设置一个id并保存一些信息(例如登陆就保存用户信息,视具体情况),并把这个id通过Cookie存到客户端,客户端每次和服务器交互时只传这个id,就可以实现维持浏览器和服务器的状态,而这个ID通常是NAME为JSESSIONID的一个Cookie

Session通过HttpSession来实现,HttpSession对象是javax.servlet.http.HttpSession的实例,该接口并不像HttpServletRequest或HttpServletResponse还存在一个父接口,该接口只是一个纯粹的接口。这因为Session本身就属于HTTP协议的范畴。

对于服务器而言,每一个连接到它的客户端(浏览器)都是一个Session,Servlet容器使用Session创建客户端服务器之间的会话。会话将保留指定的时间段,能处理多个来自用户的页面请求。一个会话通常对应于一个用户,该用户可能多次访问一个站点。

Session时序图
板块一 Servlet编程:第六节 HttpSession对象全解 来自【汤米尼克的JAVAEE全套教程专栏】,汤米尼克的JAVAEE+Spring 全套教程,servlet,java-ee,Session

Session无论客户端还是服务器端都可以感知到,若重新打开一个新的浏览器,则无法取得之前设置的Session,因为每一个Session只保存在当前的浏览器当中,并在相关的页面取得。我们可以通过request.getSession()方法,来获取当前会话的Session对象。

二、创建Seesion及常用方法

创建Seesion要调用Request对象

request.getSession();

当创建Session对象时,会先判断Session对象是否存在,如果存在则获取Session对象,否则会直接创建一个Session对象

常用方法

  • 获取Session的会话标识符 getId()
  • 获取Session的创建时间(时间戳) getCreationTime()
  • 获取最后一次访问时间 getLastAccessedTime()
  • 判断是否是新的session对象 isNew()

实例
在start.java中导入javax.servlet.http.HttpSession,并在service()方法中添加测试代码

package www.caijiyuan;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

import javax.servlet.http.HttpSession;


@WebServlet("/start")
public class start extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取session对象
        HttpSession session = req.getSession();

        // 获取session的会话标识符
        String id = session.getId();
        System.out.println(id);
        // 获取session的创建时间
        System.out.println(session.getCreationTime());
        // 获取最后一次访问时间
        System.out.println(session.getLastAccessedTime());
        //判断是否是新的session对象
        System.out.println(session.isNew());
    }
}

启动服务器,在浏览器中连续访问两次start,控制台分别打印两次访问start的信息
板块一 Servlet编程:第六节 HttpSession对象全解 来自【汤米尼克的JAVAEE全套教程专栏】,汤米尼克的JAVAEE+Spring 全套教程,servlet,java-ee,Session
可以看出来,两次访问都是同一个Session ID,并且第二次访问时,Session最后一次访问的时间已经改变,并且不是新创建的Session对象
如果此时重启浏览器,再访问start,Session ID的值就会改变,说明此Session非彼Session板块一 Servlet编程:第六节 HttpSession对象全解 来自【汤米尼克的JAVAEE全套教程专栏】,汤米尼克的JAVAEE+Spring 全套教程,servlet,java-ee,Session我们在开发者工具中查看Cookie,会发现一个 键为JSESSIONID,值为Session的ID的Cookie,这里提到一个叫做JSESSIONID的Cookie,这是一个比较特殊的Cookie,当用户请求服务器时,如果访问了Session,则服务器会创建一个名为JSESSIONID,值为获取到的Session(无论是获取到的还是新创建的)的sessionld的Cookie对象,并添加到Response对象中,响应给客户端,并且这个Cookie的存活时间被标识成了会话(关闭浏览器)
所以Session的底层依赖Cookie来实现

其实除了使用Cookie还有三种方式让Session正常工作:

  • 通过URL传递SessionID:当浏览器不支持Cookie功能时,浏览器会将用户的SessionCookieName(默认为JSESSIONID)重写到用户请求的URL参数中。格式:/path/Servlet;name=value;name2=value2?Name3=value3
  • 通过隐藏表单传递SessionID:会根据javax.servlet.request.ssl_session属性值设置SessionID
  • 通过SSL传递SessionID

三、Session域对象

Session用来表示一次会话,在一次会话中数据是可以共享的,这时Session作为域对象存在,可以通过setAttribute(name,value)方法向域对象中添加数据,通过getAttribute(name)从域对象中获取数据,通过removeAttribute(name)从域对象中移除数据

实例
在start.java中添加数据
start.java

package www.caijiyuan;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import javax.servlet.http.HttpSession;

@WebServlet("/start")
public class start extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取session对象
        HttpSession session = req.getSession();
        // 设置session域对象
        session.setAttribute("SessionName","ToomyNike");
    }
}

在after.java中获取数据并输出,然后移除session域对象
after.java

package www.caijiyuan;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/after")
public class after extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        // 获取指定名称的session域对象
        String SessionName = (String) session.getAttribute("SessionName");
        System.out.println(SessionName);
        // 移除指定名称的session域对象
        session.removeAttribute("SessionName");
    }
}

启动服务器,先后在浏览器中访问start和after资源,便可在控制台打印得
板块一 Servlet编程:第六节 HttpSession对象全解 来自【汤米尼克的JAVAEE全套教程专栏】,汤米尼克的JAVAEE+Spring 全套教程,servlet,java-ee,Session
如此就实现了一次Session值的设置获取,并且通过Session存储的数据只要一次会话存在它就在设定的之间内一直存在,除非手动销毁。看到这里是不是觉得跟我们在 第三节 HttpServletRequest对象全解与请求转发学到的Request作用域有异曲同工之处?我们将在下一小节ServletContext作用域中为Servlet的三大作用域作总结

四、Session对象的销毁

  • 默认到期时间
    当客户端第一次请求Servlet并操作Session时,Session对象生成,Tomcat中Session默认的存活时间为30min,即不操作界面的时间,一旦有操作,Session会重新计时。可以在Tomcat中的conf目录下的web.xml文件中进行修改默认到期时间。
    实例
    打开D:\...\TOMCAT8.5\apache-tomcat-8.5.93-windows-x64\apache-tomcat-8.5.93\conf目录中的web.xml配置文件,在<session-config>标签处即可设置默认到期时间(分钟)
    板块一 Servlet编程:第六节 HttpSession对象全解 来自【汤米尼克的JAVAEE全套教程专栏】,汤米尼克的JAVAEE+Spring 全套教程,servlet,java-ee,Session
    当然除了以上的修改方式外,我们也可以在程序中自己设定Session的生命周期
  • 手动设置到期时间
    通过session.setMaxlnactivelnterval(int)来设定Session的最大不活动时间,单位为秒
    实例
//获取session对象
HttpSession session = request.getSession();
// 设置session的最大不活动时间
session.setMaxInactiveInterval(15); // 15秒

此外还可以通过 getMaxlnactivelnterval()方法来查看当前Session对象的最大不活动时间

  • 立刻失效session. invalidate();
  • 关闭浏览器失效,从前面的JESSION可知道,session的底层依赖cookie实现,并且该cookie的有效时间为关闭浏览器,从而session在浏览器关闭时也相当于失效了(因为没有JSESSION再与之对应)
  • 关闭服务器失效,当关闭服务器时,Session销毁,Session 失效则意味着此次会话结束,数据共享结束

以上就是此小节的所有内容,我们学习了Session在Servlet中整个创建、操作、销毁的生命周期,在下一节中我们将学习Servlet板块的最后一个对象也是最后一个作用域:ServletContext文章来源地址https://www.toymoban.com/news/detail-832538.html

到了这里,关于板块一 Servlet编程:第六节 HttpSession对象全解 来自【汤米尼克的JAVAEE全套教程专栏】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Lua中文语言编程源码-第六节,更改lmathlib.c 数学库函数, 使Lua加载中文库关键词(与数学库相关)

    源码已经更新在CSDN的码库里: 在src文件夹下的lmathlib.c 数学库 函数,Standard mathematical library:表明这个C源文件实现了Lua的标准数学库(Standard mathematical library),即提供了与数学相关的API和功能实现。 增加中文版mathlib数学函数名列表,保留英文版mathlib数学函数名列表。 原

    2024年03月27日
    浏览(68)
  • Layui快速入门之第六节 选项卡

    目录 一:基本概念 选项卡依赖element模块 API 元素属性 基本使用: 二:选项卡风格 默认风格 简约风格  ​编辑 卡片风格 三:hash 状态匹配 四:tab相关操作 渲染 tab 添加 tab 删除 tab 切换 tab 自定义 tab 五:事件 tab 切换事件 tab 删除事件              选项卡组件  tab  是指

    2024年02月07日
    浏览(30)
  • 【Git 入门教程】第六节、Git高级操作

    Git是一种非常强大的分布式版本控制系统,可以帮助开发者轻松地管理和协调代码库。在本文中,我们将介绍一些Git高级操作,包括如何管理Git仓库、标签、子模块和忽略文件。 Git提供了许多命令来管理本地Git仓库。以下是一些常用的管理命令: 初始化一个新的Git仓库: 查

    2024年02月05日
    浏览(40)
  • ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() --调试发现HttpSession session无法读取数据

    该开始一直按错误去进行查询  看到网上的主要解决方法: 1.注入的数据类型加入注解@Autowired, 2.service层添加注解@Service 3.在controller层,添加注解@RestController 而不是 @Controller 4.并在JSON数据前加上@RequestBody 5.spring-boot包冲突,再pom.xml文件中删除这个包 针对后面抛出的异常j

    2024年02月08日
    浏览(31)
  • 【PyTorch】第六节:乳腺癌的预测(二分类问题)

    作者 🕵️‍♂️:让机器理解语言か 专栏 🎇:PyTorch 描述 🎨:PyTorch 是一个基于 Torch 的 Python 开源机器学习库。 寄语 💓:🐾没有白走的路,每一步都算数!🐾          上一个实验我们讲解了线性问题的求解步骤,本实验我们以乳腺癌的预测为实例,详细的阐述如

    2023年04月16日
    浏览(40)
  • AI实战营第二期 第六节 《MMDetection代码课》——笔记7

    MMDetection 是被广泛使用的检测工具箱,包括了目标检侧、实例分割、全景分割等多个通用检测方向,并支持了 75+ 个主流和前沿模型, 为用户提供超过 440+ 个预训练模型, 在学术研究和工业落地中拥有广泛应用。该恇架的主要特点为: 模块化设计。MMDetection 将检测框架解耦成不

    2024年02月08日
    浏览(39)
  • 第六节:Git标签(关键词:git tag、git show、创建、删除、查看、推送标签)

    本节涉及Git命令 git tag :列出所有标签 git tag tagname commitID :创建标签 git tag -a tagname -m \\\'message\\\' commitID :创建带有注释的标签 git show tagname :查看某个标签细节 git tag -d :删除标签 git psuh origin --tags :推送所有标签 git psuh origin tagname :推送某个标签 git checkout tagname :检出标签

    2024年02月07日
    浏览(59)
  • 计算机网络原原理学习资料分享笔记---第一章/第六节(为有梦想的自己加油!)

    第六节 计算机网络与 因特网发展简史 第六节 计算机网络与因特网发展简史 知识点 1 计算机网络与因特网发展简史 第六节 计算机网络与因特网发展简史 3 、 1972 年底, ARPAnet已经发展到 15 个交换结点。 4 、 20 世纪 70 年代早期与中期,除了ARPAnet之外,还诞生了许多其他分

    2024年04月27日
    浏览(31)
  • Servlet3.0 新特性全解

    tomcat 7以上的版本都支持Servlet 3.0 注解支持;Servlet、Filter、Listener无需在web.xml中进行配置,可以通过对应注解进行配置; 支持Web模块; Servlet异步处理; 文件上传API简化; @WebServlet :修饰Servlet类,用于部署该Servlet类。 @WebFilter:修饰Filter类,用于部署该Filter类 @WebInitParam:

    2024年02月04日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包