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



目录
打赏
0
0
1
0
85
分享
相关文章
JAVA接入DeepSeek大模型接口开发---阿里云的百炼模型
随着大模型的越来越盛行,现在很多企业开始接入大模型的接口,今天我从java开发角度来写一个demo的示例,用于接入DeepSeek大模型,国内的大模型有很多的接入渠道,今天主要介绍下阿里云的百炼模型,因为这个模型是免费的,只要注册一个账户,就会免费送百万的token进行学习,今天就从一个简单的可以执行的示例开始进行介绍,希望可以分享给各位正在学习的同学们。
132 3
JAVA接入DeepSeek大模型接口开发---阿里云的百炼模型
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
249 5
|
5月前
|
在Java中如何实现接口?
实现接口是 Java 编程中的一个重要环节,它有助于提高代码的规范性、可扩展性和复用性。通过正确地实现接口,可以使代码更加灵活、易于维护和扩展。
285 64
|
5月前
|
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
411 60
|
5月前
|
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
233 58
|
5月前
|
在Java中实现接口的具体代码示例
可以根据具体的需求,创建更多的类来实现这个接口,以满足不同形状的计算需求。希望这个示例对你理解在 Java 中如何实现接口有所帮助。
146 38
|
4月前
|
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
323 2
利用Java获取京东SKU接口指南
本文介绍如何使用Java通过京东API获取商品SKU信息。首先,需注册京东开放平台账号并创建应用以获取AppKey和AppSecret。接着,查阅API文档了解调用方法。明确商品ID后,构建请求参数并通过HTTP客户端发送请求。最后,解析返回的JSON数据提取SKU信息。注意遵守API调用频率限制及数据保护法规。此方法适用于电商平台及其他数据获取场景。
|
4月前
|
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
73 6