ServletContext,Cookie,HttpSession的使用

ServletContext对象

ServletContext对象官方也称servlet上下文。服务器会为每一个Web应用创建一个ServletContext对象,这个对象全局唯一,而且Web应用中所有的Servlet都共享这个对象。

ServletContext对象的作用

相对路径转绝对路径

servletContext.getRealPath("Path");

该方法可以将一个相对路径转成绝对路径,在文件的上传和下载时需要用到该方法作为路径的转换。

示例:

package com.test;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;public class FileServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//使用ServletContext对象将相对路径转成绝对路径String path="image\\girl.jpg";//获取ServletContext对象ServletContext servletContext = this.getServletContext();String realPath=servletContext.getRealPath(path);System.out.println(realPath);//  先上传文件File file = new File(realPath);//实现文件的下载resp.addHeader("Content-Disposition","attachment;filename="+new String(file.getName().getBytes("gbk"),"ISO-8859-1"));//思路是:先以windows系统的GBK编码将字符串转成字节,再以浏览器的ISO-8859-1编码将字节转成字符try(InputStream is = new FileInputStream(file);OutputStream os = resp.getOutputStream();){//创建缓冲数组byte[] buffer = new byte[1024];int temp;while ((temp=is.read(buffer))!=-1){os.write(buffer,0,temp);}os.flush();}}
}
获取容器的基本附加信息

ServletContext简用sc表示

sc.getServerInfo();返回Servlet容器的名称和版本号

sc.getMajorVersion();返回Servlet容器所支持Servlet的主版本号

sc.getMinorVersion();返回Servlet容器所支持的Servlet的副版本号

web.xml配置

    <servlet><servlet-name>baseInfo</servlet-name><servlet-class>com.test.GetBaseInfoServlet</servlet-class></servlet><servlet-mapping><servlet-name>baseInfo</servlet-name><url-pattern>/baseInfo.do</url-pattern></servlet-mapping>

代码:

        //设置响应编码resp.setContentType("text/plain;charset=utf-8");//获取ServletContext对象ServletContext sc = this.getServletContext();//回Servlet容器的名称和版本号String serverInfo = sc.getServerInfo();//返回Servlet容器所支持Servlet的主版本号int majorVersion = sc.getMajorVersion();//返回Servlet容器所支持的Servlet的副版本号int minorVersion = sc.getMinorVersion();try(PrintWriter pw = resp.getWriter();){pw.println("servlet容器:"+serverInfo);//servlet容器:Apache Tomcat/9.0.80pw.println("支持的Servlet版本:"+majorVersion+"."+minorVersion);//支持的Servlet版本:4.0pw.flush();}
获取web.xml文件中的信息
   <context-param><param-name>name</param-name><param-value>张三</param-value></context-param><context-param><param-name>age</param-name><param-value>20</param-value></context-param>

param-name:相当于key,param-value:相当于value

sc.getInitParameter("key");

读取web.xml文件标签中的配置信息

sc.getInitParameterNames();

读取web.xml文件中所有的param-name标签中的值

代码示例:

        //设置响应编码格式resp.setContentType("text/plain;charset=utf-8");//获取ServletContext对象ServletContext sc = this.getServletContext();//Enumeration<String> initParameterNames = sc.getInitParameterNames();try(PrintWriter pw =resp.getWriter()){while (initParameterNames.hasMoreElements()){String key = initParameterNames.nextElement();String value = sc.getInitParameter(key);pw.println("key = "+key+",value : "+value);}pw.flush();}

全局容器

即将数据放到全局容器后不同的servlet都可以进行访问获取。

sc.setAttribute("key","ObjectValue");向全局容器添加数据

sc.getAttribute("key");从全局容器获取数据

sc.removeAttribute("key");从全局容器移除数据

代码示例:

@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置响应编码格式resp.setContentType("text/plain;charset=utf-8");//获取ServletContext对象ServletContext sc = this.getServletContext();String username = (String) sc.getAttribute("username");String password = (String)sc.getAttribute("password");try(PrintWriter pw =resp.getWriter()){pw.println("username:"+username);pw.println("password:"+password);pw.flush();}}@Overridepublic void init() throws ServletException {//全局信息一般是在容器初始化的时候添加的ServletContext sc= this.getServletContext();sc.setAttribute("username","root");sc.setAttribute("password","123456");}

ServletContext生命周期

当容器启动时就会创建ServletContext对象,并一直缓存该对象,直到容器关闭后该对象生命周期才结束。

ServletContext的生命周期很长,使用全局容器时不建议存放业务数据。

ServletConfig对象

ServletConfig对象对应web.xml文件中的节点,当Tomcat初始化一个Servlet时,会将该Servlet的配置信息,封装到一个ServletConfig对象中,我们可以通过这个对象获取节点中的配置信息,只能获取当前Servlet中的配置信息

    <servlet><servlet-name>servletConfig</servlet-name><servlet-class>com.test.GetServletConfig</servlet-class><init-param><param-name>username</param-name><param-value>张三</param-value></init-param><init-param><param-name>password</param-name><param-value>123456</param-value></init-param></servlet><servlet-mapping><servlet-name>servletConfig</servlet-name><url-pattern>/servletConfig.do</url-pattern></servlet-mapping>

init-param标签只能在servlet标签里,多个name-value是这样并列的。

代码:

       //设置响应编码resp.setContentType("text/plain;charset=utf-8");ServletConfig servletConfig = this.getServletConfig();Enumeration<String> names = servletConfig.getInitParameterNames();try(PrintWriter pw = resp.getWriter()){while (names.hasMoreElements()){String name=names.nextElement();String value=servletConfig.getInitParameter(name);pw.println("name = "+name+",value = "+value);}pw.flush();}

Cookie对象

Cookie对象和HttpSession对象的作用都是维护客户端浏览器与服务段的会话状态的对象。

Cookie是通过客户端浏览器实现会话的维持,支持跨二级域名

HttpSession是通过服务端来实现会话状态的维持

特点

  • 使用字符串存储数据
  • 使用key与value结果存储数据
  • 单个Cookie存储数据大小限制在4097个字节
  • Cookie存储的数据不支持中文,Servlet4.0支持
  • Cookie是与域名绑定所以不支持跨一级域名访问
  • Cookie对象是保存在客户端浏览器或系统磁盘中的
  • Cookie分为持久化Cookie和状态Cookie
  • 浏览器在保存同一域名所返回的Cookie数量是有限的,不同浏览器所支持的数量不同,chrome浏览器为50个。
  • 浏览器每次请求时都会把当前访问的域名相关的Cookies在请求中提交到服务端。

Cookie对象的创建

cookie默认会随浏览器的关闭而销毁

//创建Cookie
Cookie cookie = new Cookie("key","value");
//添加Cookie
resp.addCookie(cookie);

代码示例

        //创建CookieCookie cookie = new Cookie("word","helloWorld");//将cookie对象写回给客户端浏览器resp.addCookie(cookie);resp.setContentType("text/plain;charset=utf-8");try(PrintWriter pw = resp.getWriter()){pw.println("name:"+cookie.getName());pw.println("value:"+cookie.getValue());pw.println("Cookie创建好了");pw.flush();}

获取Cookie中的数据

浏览器每次请求时都会把与当前域名相关的Cookie在请求中提交到服务端,通过HttpServletResponse对象获取Cookie,返回Cookie数组

Cookie[] cookies = request.getCookies()

代码示例:

       resp.setContentType("text/plain;charset=utf-8");//获取CookieCookie[] cookies = req.getCookies();try(PrintWriter pw = resp.getWriter()) {for (int i = 0; i < cookies.length; i++) {String name = cookies[i].getName();String value = cookies[i].getValue();pw.println("name:"+name);pw.println("value:"+value);}pw.flush();}
解决Cookie不支持中文问题

在Servlet4.0版本后的Cookie中name不能使用中文,但是value可以使用中文。

如果存储的数据里面含有中文,代码会直接出现异常,我们可以对含有中文的数据进行重新编码来解决该问题。

ULREncoder.encode("content","code");

将内容按照指定的编码方式做URL编码处理。

URLDecoder.decode("content","code")

将内容按照执行的编码做URL解码处理

代码示例:

//创建CookieCookie cookie = new Cookie(URLEncoder.encode("姓名","utf-8"), URLEncoder.encode("张三","utf-8"));//设置cookie有效时间cookie.setMaxAge(60);

解码:

//进行解码处理pw.println("name:"+ URLDecoder.decode(name,"utf-8"));pw.println("value:"+URLDecoder.decode(value,"utf-8"));

编码和解码的编码格式必须是一样的。

状态Cookie和持久化Cookie

状态cookie:Cookie对象仅仅会被缓存在浏览器所在的内存中,当浏览器关闭后Cookie对象也就会被销毁。

持久化Cookie:浏览器对Cookie做持久化处理,基于文件形式保存Cookie在系统的执行目录中。

当Cookie创建后默认是状态Cookie,可以使用cookie.setMaxAge();方法设置失效时间,单位为秒

一旦设置了失效时间,该Cookie就变成了持久化Cookie.浏览器就会将该Cookie持久化到磁盘里,当失效时间到达后删除。

注意:Cookie对于存储内容是基于明文方式存储的,安全性低,不要存放敏感数据,

在servlet4.0虽然支持中文,建议对Cookie中存放的数据做编码处理,可提高安全性。

HttpSession对象

特点:

保存在服务端,使用key与value结构存储数据,key是字符串类型,value是Object类型

存储数据大小没有限制

HttpSession对象的创建

通过request.getSession()方法创建

客户端浏览器在请求服务端资源时,

如果请求中没有jsessionid,getSession()方法将会为这个客户端浏览器创建一个新的HttpSession对象,并为这个HttpSession对象生成jsessionid,在响应中通过状态Cookie写回给客户端浏览器,

如果在请求中包含了jsessionid,getSession()方法则是根据这个ID返回与这个客户端浏览器对应的HttpSession对象。

getSession()方法重载方法getSession(true|false);

当参数为true时与getSession()方法相同,

当参数为false时则只去根据jsessionid查找是否有与这个客户端浏览器对应的HttpSession对象,如果有则返回,如果没有则不会创建新的HttpSession对象。

HttpSession对象常用方法

方法描述
setAttribute("key",value)将数据存储到HttpSession对象中
getAttribute("key")根据key获取HttpSession中的数据,返回Object
getAttributeNames()获取HttpSession中所有的key,返回枚举类型
removeAttribute("key")根据key删除HttpSession中的数据
getId()获取当前HttpSession的SessuonID,返回字符串类型

通过HttpSession对象存数据

        resp.setContentType("text/plain;charset=utf-8");//创建HttpSession对象HttpSession session = req.getSession();//添加数据session.setAttribute("name","jack");session.setAttribute("age",30);String sessionId = session.getId();System.out.println(sessionId);try(PrintWriter pw = resp.getWriter()){pw.println(sessionId);pw.println("存好数据了");pw.flush();}

通过HttpSession取数据

        resp.setContentType("text/plain;charset=utf-8");//创建HttpSession对象HttpSession session = req.getSession();//获取所有的name
//        Enumeration<String> attributeNames = session.getAttributeNames();try(PrintWriter pw = resp.getWriter()) {
//            while (attributeNames.hasMoreElements()) {
//                String name = attributeNames.nextElement();
//            }//通过key获取数据pw.println(session.getAttribute("name"));pw.println(session.getAttribute("age"));pw.flush();}

HttpSession对象的销毁方式

  • 通过web.xml文件指定销毁时间
  • 通过HttpSession对象中的invalidate()方法销毁当前HttpSession对象

web.xml文件指定超时时间,当达到超时时间后容器就会销毁该HttpSession对象,单位为分钟

    <session-config><session-timeout>1</session-timeout></session-config>

时间计算是根据最后一次访问请求时间作为起始时间的,只要用户继续访问,服务器就会更新HttpSession对象的最后访问时间。

如果是在Tomcat的web.xml配置了超时时间,相当于配置了全局的HttpSession超时时间,如果同时也在web项目中配置了超时时间,则会以web项目中的超时时间为准。

invalidate()是HttpSession对象中提供的用于销毁当前HttpSession的方法。

HttpSession对象的生命周期

HttpSession对象生命周期中没有个固定的创建时间和摧毁时间。什么时候创建取决于什么时候调

用getSession(),HttpSession对象的销毁时间取决于超时时间以及调用invalidate();

如果没有超过超时时间或者通过invalidate()摧毁,则会一直存在。

默认超时时间为30分钟。

HttpSession与Cookie的区别

  • cookie数据存在浏览器或者系统的文件里,HttpSession中的数据存放在服务器中
  • cookie是不安全的,而HttpSession是安全的
  • 单个cookie存储数据不能超过4k,很多浏览器都限制一个域名保存cookie的数量,HttpSession没有容量以及数量的限制

使用建议:

HttpSession中的数据存放在服务端的,安全性比较高。我们可以在HttpSession对象中存储数据,但是由于它的生命周期不固定,不建议存放业务数据,一般用来存放用户登录信息。

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

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

相关文章

如何封装一个可取消的 HTTP 请求?

前言 你可能会好奇什么样的场景会需要取消 HTTP 请求呢&#xff1f; 确实在实际的项目开发中&#xff0c;可能会很少有这样的需求&#xff0c;但是不代表没有&#xff0c;比如&#xff1a; 假如要实现上述这个公告栏&#xff0c;每点击一个 tab 按钮就会切换展示容器容器中…

前端笔试新问题总结

记录总结下最近遇到的前端笔试新问题 目录 一、操作数组方法 1.Array.isArray(arr) 2.Object.prototype.toString.call(arr) "[object Array]" 3.arr instanceof Array 1&#xff09;跨帧问题 2&#xff09;修改Array.prototype 3&#xff09;模拟数组的对象…

玩转Hugging Face/魔搭社区/魔乐社区”教程

2.1 HF 平台 2.1.1 注册Hugging Face 平台 &#xff08;需要魔法上网&#xff09; Hugging Face 最初专注于开发聊天机器人服务。尽管他们的聊天机器人项目并未取得预期的成功&#xff0c;但他们在GitHub上开源的Transformers库却意外地在机器学习领域引起了巨大轰动。如今&…

Chrome与夸克谁更节省系统资源

在当今数字化时代&#xff0c;浏览器已经成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;我们都依赖于浏览器来访问互联网。然而&#xff0c;不同的浏览器在性能和资源消耗方面存在差异。本文将探讨Chrome和夸克两款浏览器在系统资源消耗方面的表现…

【OJ题解】C++实现反转字符串中的每个单词

&#x1f4b5;个人主页: 起名字真南 &#x1f4b5;个人专栏:【数据结构初阶】 【C语言】 【C】 【OJ题解】 题目要求&#xff1a;给定一个字符串 s &#xff0c;你需要反转字符串中每个单词的字符顺序&#xff0c;同时仍保留空格和单词的初始顺序。 题目链接: 反转字符串中的所…

Vue 学习随笔系列十三 -- ElementUI 表格合并单元格

ElementUI 表格合并单元格 文章目录 ElementUI 表格合并单元格[TOC](文章目录)一、表头合并二、单元格合并1、示例代码2、示例效果 一、表头合并 参考&#xff1a; https://www.jianshu.com/p/2befeb356a31 二、单元格合并 1、示例代码 <template><div><el-…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)4.3-4.4

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第四周 特殊应用&#xff1a;人脸识别和神经风格转换&#xff08;Special applications: Face recognition &Neural style transfer&#xff09;4.3 Siamese 网络&#xff08;Siamese net…

vue data变量之间相互赋值或进行数据联动

摘要&#xff1a; 使用vue时开发会用到data中是数据是相互驱动&#xff0c;经常会想到watch,computed&#xff0c;总结一下&#xff01; 直接赋值&#xff1a; 在 data 函数中定义的变量可以直接在方法中进行赋值。 export default {data() {return {a: 1,b: 2};},methods: {u…

安装Blender并使用

前言 该系列记录了如何用Blenderpro来构建自己的场景数据集&#xff0c;从环境搭建到后期构建数据集的整个流程 本文章是第一部分&#xff0c;BlenderPrc2的安装以及环境配置 部分参考https://blog.csdn.net/weixin_49521551/article/details/121573334 官方文档https://dlr…

百度SEO分析实用指南 提升网站搜索排名的有效策略

内容概要 在数字化时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为提升网站曝光度的关键工具。本指南将带您了解SEO的基本知识&#xff0c;帮助您在复杂的网络环境中立足。我们将从关键词优化开始&#xff0c;重点讲解如何选择合适的关键词来提高搜索引擎排…

【蔬菜识别】Python+深度学习+CNN卷积神经网络算法+TensorFlow+人工智能+模型训练

一、介绍 蔬菜识别系统&#xff0c;本系统使用Python作为主要编程语言&#xff0c;通过收集了8种常见的蔬菜图像数据集&#xff08;‘土豆’, ‘大白菜’, ‘大葱’, ‘莲藕’, ‘菠菜’, ‘西红柿’, ‘韭菜’, ‘黄瓜’&#xff09;&#xff0c;然后基于TensorFlow搭建卷积神…

ESP8266 自定义固件烧录-Tcpsocket固件

一、固件介绍 固件为自定义开发的一个适配物联网项目的开源固件&#xff0c;支持网页配网、支持网页tcpsocket服务器配置、支持串口波特率设置。 方便、快捷、稳定&#xff01; 二、烧录说明 固件及工具打包下载地址&#xff1a; https://download.csdn.net/download/flyai…

探秘机器学习算法:智慧背后的代码逻辑

1、 线性回归 线性回归是预测连续变量的一种简单而有效的方法。其数学模型假设因变量 y 与自变量 x 之间存在线性关系&#xff0c;用公式表示为&#xff1a; ​ Python代码实现 import numpy as np from sklearn.linear_model import LinearRegression import matplotlib.…

【合肥工业大学】操作系统 习题解析 作业答案(仅作学习与交流/侵删)

第一章习题解析 1&#xff0e;设计现代OS的主要目标是什么&#xff1f; 答&#xff1a;&#xff08;1&#xff09;有效性 &#xff08; 2&#xff09;方便性 &#xff08; 3&#xff09;可扩充性 &#xff08; 4&#xff09;开放性 2&#xff0e; OS 的作用可表现在哪几个方…

要在微信小程序中让一个 `view` 元素内部的文字水平垂直居中,可以使用 Flexbox 布局

文章目录 主要特点&#xff1a;基本用法&#xff1a;常用属性&#xff1a; 要在微信小程序中让一个 view 元素内部的文字水平垂直居中&#xff0c;可以使用 Flexbox 布局。以下是如何设置样式的示例&#xff1a; .scan-button {display: flex; /* 启用 Flexbox 布局 */justify…

JSON交互处理

目录 一、什么是JSON 二、JSON和JavaScript对象互转 ​三、Controller返回JSON数据 3.1 使用Jackson 编写Controller 1. 一个对象 2. 多个对象 3. 输出时间对象 4. 优化&#xff1a;抽取为工具类 一、什么是JSON Json是JavaScript对象的字符串表示法&#xff0c;它用…

WPF+MVVM案例实战(十二)- 3D数字翻牌计时实现

文章目录 1、运行效果2、功能实现1、文件创建2、控件代码实现3、控件引用与菜单实现1.引用用户控件2.按钮菜单3、计时器界面实现4、源代码获取1、运行效果 3D数字翻牌计时 2、功能实现 1、文件创建 打开项目 Wpf_Examples ,在用户控件 UserControlLib 中创建 NumberFoldi…

无人机多机编队控制算法详解!

一、主要算法类型 长机-僚机法&#xff08;Leader-Follower&#xff09; 原理&#xff1a;通过设定一架无人机作为长机&#xff08;领航者&#xff09;&#xff0c;其他无人机作为僚机&#xff08;跟随者&#xff09;&#xff0c;僚机根据长机的信息来调整自身的飞行状态&#…

RL学习笔记-表格型方法

参考资料&#xff1a;蘑菇书&#xff1b;《世界冠军带你从零实践强化学习》B站课程 Q表格 前面讲马尔可夫过程的时候提到过Q函数&#xff0c;Q函数是在某状态s下采取某动作a得到的平均奖励&#xff08;状态动作价值&#xff09;。Q表格就是在状态和动作两个维度上可视化的一张二…

基于SSM+微信小程序的订餐管理系统(点餐2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的订餐管理系统实现了管理员和用户。管理端实现了 首页、个人中心、用户管理、菜品分类管理、菜品信息管理、订单信息管理、配送信息管理、菜品评价管理、订单投诉管理、…