Java Web——Servlet的数据共享方案:HttpSession接口(会话作用域对象)

简介: Java Web——Servlet的数据共享方案:HttpSession接口(会话作用域对象)

文章目录:


1.介绍

2.Cookie类和HttpSession接口的区别

3.应用举例

3.1 代码部分 

3.2 运行结果部分

4.工作原理图

5.request.getSession()   request.getSession(false)

6.HttpSeesion创建的session对象的销毁时机 

1.介绍


1.    HttpSession接口来自于Servlet规范中。

2.    HttpSession接口实现类由Http服务器厂商提供。

3.    HttpSession接口修饰对象被称为会话作用域对象。

4.    如果两个Servlet为同一个用户/同一个浏览器提供服务,此时可以借助于用户的HttpSession对象进行数据共享。

2.Cookie类和HttpSession接口的区别


1.    类型不同: Cookie是一个类,HttpSession是一个接口。

2.    存放位置不同:Cookie存放在客户端计算机,HttpSession(会话作用域对象)存放在服务端计算机内存。

3.    存放共享数据个数不同:一个cookie对象只能存储一个共享数据,一个会话作用域对象通过map存储,因此可以任何个共享数据。

4.    存放数据类型不同:cookie只能存放String类型的共享数据,会话作用域对象存放Object类型的共享数据。

5.    与用户关系: 一个用户可以拥有多个cookie,一个用户只能拥有一个会话作用域对象。

6.    参照物不同:cookie相当于用户在服务端拥有的会员卡,会话作用域对象相当于用户在服务端拥有的私人储物柜。

3.应用举例


3.1 代码部分 

package com.songzihao.controller;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
/**
 *
 */
public class OneServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //调用请求对象向Tomcat索要当前用户的私人储物柜
        HttpSession session=request.getSession();
        //将共享数据添加到当前用户的私人储物柜
        session.setAttribute("key1",500);
    }
    /**
     *  tomcat将当前用户的柜子编号以cookie形式写入响应头
     *  cookie("JSESSIONID",柜子编号)
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
}
package com.songzihao.controller;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
/**
 *
 */
public class TwoServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //调用请求对象向Tomcat索要当前用户的私人储物柜
        HttpSession session=request.getSession(false);
        //读取OneServlet存入的共享数据
        Integer data= (Integer) session.getAttribute("key1");
        System.out.println("TwoServlet得到的共享数据===" + data);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>OneServlet</servlet-name>
        <servlet-class>com.songzihao.controller.OneServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>OneServlet</servlet-name>
        <url-pattern>/one</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>TwoServlet</servlet-name>
        <servlet-class>com.songzihao.controller.TwoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TwoServlet</servlet-name>
        <url-pattern>/two</url-pattern>
    </servlet-mapping>
    <session-config>
        <!-- session最大空闲时间5分钟 -->
        <session-timeout>5</session-timeout>
    </session-config>
</web-app>


3.2 运行结果部分


4.工作原理图


5.request.getSession()  与  request.getSession(false)


在代码部分中,我们可以看到OneServlet中调用的是  request.getSession()TwoServlet中调用的是  request.getSession(false)


这两个方法肯定是有区别的,下面我们来看一下:

1.    request.getSession():如果当前用户在服务端拥有私人储物柜,要求tomcat返回这个储物柜。
                                   
如果当前用户在服务端尚未拥有私人储物柜,要求tomcat为当前用户创建一个全新的私人储物柜。

2.    request.getSession(false):如果当前用户在服务端拥有私人储物柜,要求tomcat返回这个储物柜。
                                           
如果当前用户在服务端尚未拥有私人储物柜,要求tomcat返回null

3.    如果当前用户身份【经过登录验证审核判定为合法】,此时应该使用request.getSession()来索要私人储物柜。

4.    如果当前用户身份尚未确认合法,此时应该使用request.getSession(false)来索要私人储物柜。


6.HttpSeesion创建的session对象的销毁时机


1.    在浏览器关闭时,切断了用户与浏览器之间联系。但是tomcat是服务端计算机中资源调度软件无法侦测浏览器何时关闭的,因此在浏览器关闭时,服务端是不会销毁用户的session

2.    tomcat在创建session对象时,设置一个【最大空闲时间】。如果session对象从上次使用完毕到现在空闲时间达到了【最大空闲时间】,tomcat认为用户放弃了自己的session.此时tomcat负责销毁。

3.    tomcat设置【最大空闲时间】是30分钟。

4.    web.xmsession的最大空闲时间:



相关文章
|
6天前
|
Java
java代码优化:判断内聚到实体对象中和构造上下文对象传递参数
通过两个常见的java后端实例场景探讨代码优化,代码不是优化出来的,而是设计出来的,我们永远不可能有专门的时间去做代码优化,优化和设计在平时
24 15
|
3天前
|
Kubernetes Java 持续交付
小团队 CI/CD 实践:无需运维,Java Web应用的自动化部署
本文介绍如何使用GitHub Actions和阿里云Kubernetes(ACK)实现Java Web应用的自动化部署。通过CI/CD流程,开发人员无需手动处理复杂的运维任务,从而提高效率并减少错误。文中详细讲解了Docker与Kubernetes的概念,并演示了从创建Kubernetes集群、配置容器镜像服务到设置GitHub仓库Secrets及编写GitHub Actions工作流的具体步骤。最终实现了代码提交后自动构建、推送镜像并部署到Kubernetes集群的功能。整个过程不仅简化了部署流程,还确保了应用在不同环境中的稳定运行。
31 9
|
1月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
67 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
25天前
|
弹性计算 负载均衡 安全
云端问道-Web应用上云经典架构方案教学
本文介绍了企业业务上云的经典架构设计,涵盖用户业务现状及挑战、阿里云业务托管架构设计、方案选型配置及业务初期低门槛使用等内容。通过详细分析现有架构的问题,提出了高可用、安全、可扩展的解决方案,并提供了按量付费的低成本选项,帮助企业在业务初期顺利上云。
|
2月前
|
Java Maven Spring
Java Web 应用中,资源文件的位置和加载方式
在Java Web应用中,资源文件如配置文件、静态文件等通常放置在特定目录下,如WEB-INF或classes。通过类加载器或Servlet上下文路径可实现资源的加载与访问。正确管理资源位置与加载方式对应用的稳定性和可维护性至关重要。
67 6
|
2月前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
91 4
|
2月前
|
Java 持续交付 项目管理
使用Maven进行项目管理:提高Java Web开发的效率
Maven 是一款强大的项目管理和构建自动化工具,广泛应用于Java社区。它通过依赖管理、构建生命周期管理、插件机制和多模块项目支持等功能,简化了项目的构建过程,提高了开发效率。本文将介绍Maven的核心功能及其在Java Web开发中的应用。
77 0
|
3月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
202 3
|
1月前
|
前端开发 安全 JavaScript
2025年,Web3开发学习路线全指南
本文提供了一条针对Dapp应用开发的学习路线,涵盖了Web3领域的重要技术栈,如区块链基础、以太坊技术、Solidity编程、智能合约开发及安全、web3.js和ethers.js库的使用、Truffle框架等。文章首先分析了国内区块链企业的技术需求,随后详细介绍了每个技术点的学习资源和方法,旨在帮助初学者系统地掌握Dapp开发所需的知识和技能。
2025年,Web3开发学习路线全指南
|
2月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
221 45