HttpSession的使用

1 HttpSession 概述

在 Java Servlet API 中引入 session 机制来跟踪客户的状态。session 指的是在一段时间内,单个客户与 Web 服务器的一连串相关的交互过程。在一个 session 中,客户可能会多次请求访问同一个网页,也有可能请求访问各种不同的服务器资源。

在 Servlet API 中定义了 javax.servlet.http.HttpSession 接口,Servlet 容器必须实现这个接口。当一个 session 开始时,Servlet 容器创建一个 HttpSession 对象,并同时在内存中为其开辟一个空间,在 HttpSession 对象中可以存放客户状态的信息(例如购物车)。Servlet容器为 HttpSession 分配一个唯一标识符,称为 SessionID。Servlet 容器把 SessionID 保存在客户的浏览器中。每次客户发出 HTTP 请求时,Servlet 容器可以从 HttpRequest 对象中读取SessionID,然后根据 SessionID 找到相应的 HttpSession 对象,从而获取客户的状态信息。

Session 的运行机制如下图所示。

2 HttpSession 的创建与使用

(1)创建

Servlet 中的 HttpServletRequest 对象为我们提供了以下两种创建和获取 HttpSession 对象的方法:

HttpSession session=request.getSession(boolean value);HttpSession session=request.getSession();

那么这两种方法有什么区别呢?

在第一种方法中,布尔值为 true 时,如果存在与当前请求关联的会话,就返回该会话。否则创建一个新的会话,并把该会话返回。布尔值为 false 时,如果存在与当前请求关联的会话,就返回该会话。否则返回 null,不再创建会话。

第二种方法等同于第一种方法中的布尔参数值为 true 时的情况。

(2)使用

在 javax.servlet.http.HttpSession 接口中定义的方法,我们常用的是有关进行数据存取的方法。

session.setAttribute(String name,Object value) ;session.getAttribute(String name);

setAttribute(String name,Object value)是把一个对象 value 保存在 HttpSession 对象中,并为其指定引用名称为 name。当我们想使用已经存储在 session 中的数据时,我们可以使用 session.getAttribute(String name)方法,把数据取出来。其中 name 为我们在存入数据时,指定的引用名称。值得注意的是,session.getAttribute(String name)方法的返回值是 Object类型,所以在取出数据时,我们要对其进行数据类型转换,而且必须与我们存入的数据类型一致。如 String value=(String)session.getAttribute(String name);

3 HttpSession 对象的存在周期

3.1 HttpSession 对象的创建

当客户端浏览器第一次访问服务器时,服务器为每个浏览器创建不同的 HttpSession 对象。在服务器端使用 request.getSession()方法来获得 HttpSession 对象,并以此来使用HttpSession 接口为我们提供的方法。

3.2 HttpSession 对象的使用

在创建 HttpSession 对象后,使用该对象进行数据的存取,以进行数据的传递。在此过程中我们常用的方法如下。

(1)void setAttribute(String name,Object value ):进行数据的保存。

(2)Object getAttribute( String name):进行数据的读取。

3.3 HttpSession 对象的结束

在以下 3 种情况下,可以结束 session。

(1)关闭浏览器,关闭 session。

(2)调用 HttpSession 的 invalidate()方法,删除 HttpSession 对象和数据。

(3)两次访问时间间隔大于 session 定义的非活动时间间隔。

在 session 结束时,服务器会清空当前浏览器相关的数据信息。

4 HttpSession 实现新闻系统的用户登录

UserServlet 为处理用户注册以及登录的 Servlet,其代码如下:

package com.example.demo;public class UserServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponseresponse)throws ServletException, IOException {//设置编码格式 // response.setContentType("text/html;charset=UTF-8"); // request.setCharacterEncoding("utf-8"); //接收用户信息 String userName = request.getParameter("username");String password = request.getParameter("password");String email = request.getParameter("email");String method = request.getParameter("method");//调用 Service 方法进行业务逻辑处理 UserServiceImpl userService = new UserServiceImpl();UserDao userDao = new UserDaoImpl();userService.setUserDao(userDao);boolean bLogin = false;User user = new User();user.setUserName(userName);user.setPassword(password);if (method != null && method.equals("addUser")){user.setEmail(email);user.setUserType(Constants.USER_TYPE_COMMON);bLogin = userService.addUser(user);}else{bLogin = userService.isLogin(userName, password);System.out.println("blogin="+bLogin);}if (bLogin){request.getSession().setAttribute("admin",userName);request.getSession().setAttribute("user",user);}//响应页面 request.getRequestDispatcher("index.jsp").forward(request,response);// response.sendRedirect("index.jsp"); }protected void doPost(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {doGet(request, response);}
}

以上代码的黑体部分就是 HttpSession 的使用,用户登录成功后,将用户信息保存到会话中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/596851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaSE】P1~P32 进制,字节,Java代码规范,常量,变量,运算符

目录 IDEA常用快键键和快捷用法一、需要复习的重难点概念1 进制、字节、DOS操作命令语句进制及转化字节DOS系统命令提示符 2 Java 常用代码规范3 常量及常量的打印4 变量数据类型及取值范围变量的概念和使用数据类型转换ASCII码表(128种)基本数据类型极其…

显示所有中国城市需要多少个汉字?

显示所有中国城市需要多少个汉字呢? 需要3678个汉字,看看我怎么知道的。 第一步:先找到中国的所有城市的名称 去哪里找到中国的所有城市的名称呢? 进入中国天气网:http://www.weather.com.cn/ 使用 F12 打开浏览器的调…

记 -bash: docker-compose: command not found 的问题解决

docker-compose: command not found 错误表明系统无法找到 docker-compose 命令。这可能是因为 docker-compose 并未正确安装,或者其可执行文件的路径未包含在系统的 PATH 变量中。 以下是我遇到时解决方法: 确保 Docker 和 Docker Compose 已安装&…

Excelize 入选“2023开源创新榜”优秀开源项目

近日,由中国科协科学技术传播中心、中国计算机学会、中国通信学会、中国科学院软件研究所共同主办,CSDN 承办的 2023 开源创新榜专家评审会在国家科技传播中心成功举办。Excelize 电子表格文档开源基础库入选“2023开源创新榜”优秀开源项目。 评审委员…

#CCSP学习心得总结:2023年新收获CCSP云安全认证

源自:张同学 选择CCSP的原因 选择学习CCSP的原因比较简单,公司这几年开始发力布局云原生和云安全的业务,作为云安全相关知识领域的补充渠道,我对比了CCSP和CCSK,最终选择了综合性较高的CCSP。由于我之前已经拿下了CIS…

【MCAL】AUTOSAR架构下PWM模块配置实践

目录 前言 1.MCAL简介 2. PWM模块详解 2.1 PWM模块概念介绍 2.2 PWM依赖的模块 2.3 PWM频率<

SwiftUI 打造一款可收缩的 HStack(二):对齐+ZStack

概览 在上篇 SwiftUI 打造一款可收缩的 HStack(一):“原汤化原食” 博文里,我们讨论了如何用 HStack 自身来实现可收缩的“HStack”。 而在本篇中,我们将尝试利用 SwiftUI 对齐 + ZStack 的方式完成相同的功能。 在本篇博文中,您将学到以下内容: 概览1. SwiftUI 中的对…

商业综合体能源管理系统功能有哪些?能够为企业带来哪些价值?

随着IT行业的迅猛发展&#xff0c;仅仅实现智能控制已无法满足当前绿色低碳发展的要求&#xff0c;随着智能设备的增多&#xff0c;同时也产生了越来越多的信息孤岛。通过信息技术构建能源管理系统&#xff0c;可以实现先进、智能、经济、可行的商业综合体能源管理解决方案。 …

静态网页设计——校园官网(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 使用技术&#xff1a;HTMLCSSJS 主要内容&#xff1a;对学校官网的结构进行模仿&#xff0c;对布局进行模仿。 主要内容 1、首页 首页以多个div对页面进行分割和布局…

解析为什么Go语言要使用[]rune而不是string来表示中文字符

众所周知&#xff0c;Go语言中有以下这些数据类型。但rune32这个go语言特有的数据类型&#xff0c;比较有意思却经常遭到忽视。所以今天探索学习一下这个数据类型的功能、用法。 Go基本数据类型 布尔&#xff1a;bool 字符串&#xff1a;string 整数&#xff1a; int int8 …

GitHub项目推荐:IDE-3D

项目地址 GitHub - MrTornado24/IDE-3D: [SIGGRAPH Asia 2022] IDE-3D: Interactive Disentangled Editing For High-Resolution 3D-aware Portrait Synthesisx 项目简述 这是一个交互式的3D画图工具。无论是改图还是成图&#xff0c;都能使用。是一个很有意思的项目。 项目…

12.3 【Screen配置】配置winmgr(一)更新中

一&#xff0c;winmgr配置简介 winmgr 部分用于指定与Screen相关的参数。 graphics.conf 配置文件必须包含一个 winmgr 部分&#xff0c;在其中指定global, display,和class参数。 winmgr 部分被标识为由 begin winmgr 和 end winmgr 包围的配置文件部分。 ... begin winmg…

c++ 基础 笔记

1 外部访问就是 实例类后 访问类中变量 class MyClass { public:int publicVar; // 公有变量 protected:int protectedVar; // 受保护变量 private:int privateVar; // 私有变量 };MyClass obj; obj.publicVar 1; // 正确: 公有变量可以在类外部直接访问 obj.protectedVar 2…

安卓和Android是两种不同的操作系统?

实际上&#xff0c;安卓和Android并不是同一种操作系统&#xff01; Android是由Google开发并维护更新的一款操作系统&#xff0c;目前仅能运行在Pixel手机上。 Google Pixel 与 iPhone手机&#xff1a;哪个更好&#xff1f;Google Pixel 与 Apple iPhone哪个手机才是性价比最…

(1)(1.13) SiK无线电高级配置(一)

文章目录 前言 1 监控链接质量 2 诊断范围问题 3 MAVLink协议说明 前言 本文提供 SiK 遥测无线电(SiK Telemetry Radio)的高级配置信息。它面向"高级用户"和希望更好地了解无线电如何运行的用户。 &#xff01;Tip 大多数用户只需要 SiK Radio v2 中提供的基本…

【GlobalMapper精品教程】070:专题地图制作完整操作教程

与其它GIS软件一样,Globalmapper也可以制作出漂亮的地图,本文讲解专题地图制作完整操作流程。 文章目录 一、效果预览二、符号化三、布局编辑1. 新建布局2. 调整页边距3. 添加经纬网4. 插入图名5. 插入指北针6. 插入比例尺7. 插入图例四、导出地图五、总结一、效果预览 在Gl…

74. 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。…

三段式电流保护与自动重合闸MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 前加速、后加速的区别&#xff1a; 前加速是保护装置不判别是永久性故障还是瞬时故障&#xff0c;直接跳闸&#xff0c;然后经重合闸装置来纠正&#xff1b;后加速是保护装置是先判别故障类型有选择性跳闸 …

【2024.01.02】刷算法07

新年首刷 三数之和 感想 说实话我看到这个题目的时候第一个想法就是用四数相加去解决&#xff0c;但是确实没有读题目的完全意思 用的方法是双指针法 假定有三个指针 我们希望找到所有不同的三元组 [nums[i], nums[j], nums[k]]&#xff0c;使得 nums[i] nums[j] nums[k] 0…

C#中文件夹类Directory的常用操作,unity获取streamingAssets下所有的文件夹及文件生成树结构物体

C#中文件夹类Directory的常用操作 .Directory方便我们对文件操作&#xff0c;首先引用命名空间 using System.IO; Directory.CreateDirectory()&#xff1a;用于创建文件&#xff0c;传入路径即可 Directory.CreateDirectory("D:\test");Directory.Delete()&#…