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%20http://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的最大空闲时间:



相关文章
|
4月前
|
消息中间件 缓存 前端开发
从资损百万到零事故:Java 接口幂等设计的艺术与实践
在分布式系统中,重复请求常引发严重资损,如支付双扣、库存超卖等问题,其根源在于接口缺乏幂等性设计。本文通过真实案例揭示幂等性的重要性,并详解8种主流解决方案,涵盖唯一请求ID、乐观锁、悲观锁、状态机等,帮助开发者构建稳定系统,保障业务一致性。无论你是架构师还是开发工程师,都能从中获得实战指导,有效规避重复调用带来的风险。
383 2
|
4月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
3月前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
171 11
|
2月前
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
234 1
|
4月前
|
存储 缓存 安全
Java集合框架(二):Set接口与哈希表原理
本文深入解析Java中Set集合的工作原理及其实现机制,涵盖HashSet、LinkedHashSet和TreeSet三大实现类。从Set接口的特性出发,对比List理解去重机制,并详解哈希表原理、hashCode与equals方法的作用。进一步剖析HashSet的底层HashMap实现、LinkedHashSet的双向链表维护顺序特性,以及TreeSet基于红黑树的排序功能。文章还包含性能对比、自定义对象去重、集合运算实战和线程安全方案,帮助读者全面掌握Set的应用与选择策略。
306 23
|
4月前
|
安全 Java 开发者
Java集合框架:详解Deque接口的栈操作方法全集
理解和掌握这些方法对于实现像浏览器后退功能这样的栈操作来说至关重要,它们能够帮助开发者编写既高效又稳定的应用程序。此外,在多线程环境中想保证线程安全,可以考虑使用ConcurrentLinkedDeque,它是Deque的线程安全版本,尽管它并未直接实现栈操作的方法,但是Deque的接口方法可以相对应地使用。
293 12
|
4月前
|
存储 安全 Java
Java集合框架(一):List接口及其实现类剖析
本文深入解析Java中List集合的实现原理,涵盖ArrayList的动态数组机制、LinkedList的链表结构、Vector与Stack的线程安全性及其不推荐使用的原因,对比了不同实现的性能与适用场景,帮助开发者根据实际需求选择合适的List实现。
|
4月前
|
Java API 网络架构
java调用api接口自动判断节假日信息
java调用api接口自动判断节假日信息
1563 0