JavaWeb-Servlet服务连接器(终)

上一篇文章JavaWeb-Servlet服务连接器(三)_Alphamilk的博客-CSDN博客

目录

1.ServletContext通信

会话技术Cookie与Session

1.Cookie

2.Session


1.ServletContext通信

概念:代表了整个web应用,用于与服务器实现通信

可以通过以下方法获取该对象

方法描述
request.getServletContext()返回与给定请求关联的Servlet上下文对象。
this.getServletContext()返回当前Servlet的上下文对象。它是通过servlet类自动继承的方法,可以在当前servlet中直接调用。

获取的对象可以实现以下功能

获取MIME类型(互联网通信时候用到的文件类型)

方法描述
request.getServletContext().getMimeType(String file)返回给定文件的 MIME 类型。可以通过请求的 Servlet 上下文对象调用,传入文件路径或文件名作为参数。
this.getServletContext().getMimeType(String file)返回给定文件的 MIME 类型。可以在当前 Servlet 中直接调用,传入文件路径或文件名作为参数。

常见的MIME类型

MIME类型描述
text/plain纯文本
text/htmlHTML文档
text/cssCSS样式表
application/jsonJSON数据
application/xmlXML数据
application/pdfAdobe PDF文件
application/mswordMicrosoft Word文档
image/jpegJPEG图像
image/pngPNG图像

案例代码:

package com.company;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/ContextDemo")
public class ServletContextdemo extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        定义文件名String filename = "javaWeb.jpg";//      通过request创建对象ServletContext context = req.getServletContext();
//        通过HttpServlet本身的方法创建ServletContextServletContext context1 = this.getServletContext();
//        获取文件名的mimeType类型String mimeType = context.getMimeType(filename);System.out.println("FileName:"+filename+" MIMEType:"+mimeType);}
//    方法统一@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}
}

2. 域对象(实现共享数据)

通过以下方法实现

方法描述
setAttribute(String name, Object obj)将给定名称和对象绑定在当前范围内(如servlet上下文、会话或请求)。
getAttribute(String name)返回与给定名称关联的对象,如果没有找到则返回null。
remove(String name)从当前范围中删除具有给定名称的属性,并返回被删除的属性值,如果没有找到则返回null。

 案例代码:

设置共享变量类

package com.company;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/Contextdemo3")
public class Contextdemo3 extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext context = this.getServletContext();
//        创建共享变量context.setAttribute("msg","HelloWorld");System.out.println("访问ContextDemo3");}
//    方法统一@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}
}

获取共享变量类

package com.company;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/Contextdemo4")
public class Contextdemo4 extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext context = this.getServletContext();
//        获取共享变量Object msg =context.getAttribute("msg");System.out.println("访问ContextDemo4");
//        如果消息可以进行转型字符串则转型为字符串if (msg instanceof String){System.out.println((String) msg);}}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}
}

 3.获取文件的真实路径

方法名描述
getRealPath(String path)获取指定路径下资源在服务器文件系统中的真实路径

案例代码:

就以刚才javaWeb.jpg举例,找到其在服务器中的位置

package com.company;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/ContextDemo2")
public class ContextDemo2 extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        使用HttpServlet创建对象ServletContext context = this.getServletContext();
//        通过相对于部署的 Web 应用程序的根目录的路径来获取真实路径String realpath = context.getRealPath("/src/javaWeb.jpg");System.out.println("在服务器中存放的路径是:"+realpath);}
//        方法统一@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}
}

 对比可以发现确实是在该位置


会话技术Cookie与Session

1.Cookie

cookie是客户端的会话数据,并且将数据保存到客户端浏览器,可以保存一些并不重要的信息,比如购物车网站,当选好购物的商品的时候如果关闭了浏览器,如果没有Cookie技术则会丢失购买记录,需要重新进行购物。

Cookie的创建、设置、获取

方法名描述
Cookie(String name, String value)创建一个新的 Cookie 对象,使用给定的名称和值
response.addCookie(Cookie cookie)将指定的 Cookie 添加到响应中
response.getCookies()获取响应中包含的所有 Cookie,并将其以数组形式返回

Cookie生命周期

每一个Cookie都有一定的生命周期,当超过有效时间时候就会失效,默认情况下,Cookie的创建生命周期直到客户端的浏览器关闭就失效,而如果不存在失效的情况下太多的Cookie被浏览器保存下来会造成大量的资源占用。可以通过以下方法控制生命周期

方法名描述
setMaxAge(int seconds)设置 Cookie 的最大存活时间(以秒为单位)。
- 当 seconds 为 0 时,表示该 Cookie 将立即过期并从客户端删除。
- 当 seconds 为负数时,表示该 Cookie 是一个会话 Cookie,只在用户会话期间有效,关闭浏览器后将被删除。
- 当 seconds 大于0时,表示该 Cookie 将在指定的秒数后过期。

创建Cookie的案例代码:

设置Cookie类(案例情景:在成功登陆一些网站时候,就授予Cookie用以可以记录用户的操作)

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        创建一个Cookie表示购物袋中有一辆兰博基尼,并且传入多个cookieCookie cookie = new Cookie("shoppingMap","Lamborghini");Cookie cookie1 = new Cookie("login-id","1234");
//        第一个保留七天数据,第二个默认处理cookie.setMaxAge(60*60*7);resp.addCookie(cookie);resp.addCookie(cookie1);}
//    方法统一处理@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}
}

访问Cookie类

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/CookieDemo2")
public class CookieDemo2 extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Cookie cookies[] = req.getCookies();
//        输出所有的Cookie数据for (Cookie c:cookies) {String name = c.getName();String value = c.getValue();System.out.println("CookieName:"+name+" CookieValue:"+value);}}
//    统一方法处理@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}
}

查看发送的数据包:

Cookie的特点与作用

特点:

  1. cookie的内容存储在客户端的浏览器上
  2. 浏览器对单个cookie的大小有限制,并且对同一个域名的cookie的数量也有限制

作用:

  1. cookie常用于存储少量不太敏感的数据
  2. 在未登陆的情况下能够实现服务器对用户的身份识别

注意:cookie不应该用于记录用户的登陆的唯一标识,因为如果有人通过伪造cookie的方式(比如sql注入,或者csrf外部绕过)从而登陆到相关的网站,并对用户的信息进行非法修改,造成损失


2.Session

Seesion也是一门服务器的会话技术,但是相比与Cookie,其数据保存在服务器中。一般用来识别与跟踪用户的状态信息。

Session的创建、使用

方法描述
HttpSession session = request.getSession()创建或获取当前请求的 HttpSession 对象,如果不存在则会创建一个新的。
session.getAttribute(String name)获取指定名称的属性值,返回一个 Object 类型的值。
session.setAttribute(String name, Object value)设置指定名称的属性值,将 Object 类型的值存储到 Session 中。
session.removeAttribute(String name)移除指定名称的属性值。

案例代码:创建session对象并赋值

创建类

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;@WebServlet("/SessionDemo1")
public class SessionDemo1 extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        创建SessionHttpSession session = req.getSession();session.setAttribute("用户name","AlphaMilk");System.out.println("设置session成功");}
//    方法统一@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}
}

获取session类:

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/SessionDemo2")
public class SessionDemo2 extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        告诉浏览器服务器的编码方式是utf-8resp.setHeader("content-type","text/html;charset=utf-8");
//        获取请求头的session对象HttpSession session = req.getSession();
//        创建输出流,将session内容输出到浏览器中PrintWriter writer = resp.getWriter();writer.write("<h1>欢迎用户"+session.getAttribute("用户id")+"</h1>");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}
}

 问题引出:如果客户端浏览器不小心关闭,再次开启浏览器获取到的session将是不同的对象。那么该如何解决这个问题呢?

Session 的实现通常依赖于 Cookie。每次创建 Session 时,会生成一个对应的 Cookie,其中包含了一个称为 JSESSIONID 的标识符,用于唯一标识该 Session 对象。

在客户端发起请求时,浏览器会自动将该 Cookie 携带到服务器端,服务器通过解析 Cookie 中的 JSESSIONID,就能够找到对应的 Session 对象,从而实现状态的保持和用户身份的识别。

 实现session持久化

解决方法本质就是创建一个一模一样的cookie中JSESSIONID和值

案例代码:

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;@WebServlet("/SessionDemo3")
public class SessionDemo3 extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        创建session对象HttpSession session = req.getSession();
//        创建对应的cookie对象Cookie cookie = new Cookie("JSESSIONID",session.getId());
//        设置生命周期cookie.setMaxAge(60*60);resp.addCookie(cookie);
//        获取session对象的idSystem.out.println(req.getSession().getId());}
//    实现方法统一@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}
}

第一次获取然后关闭浏览器重新获取id

Session的销毁

  • 服务器关闭
  • session调用invalidate()
  • session修改默认失效时间

        session的默认失效时间是30分钟如果想要修改需要在项目的总web.xml配置中设置 

<session-config><session-timeout>30</session-timeout>
</session-config>


下一篇文章:

JavaWeb-Filter过滤器_Alphamilk的博客-CSDN博客

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

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

相关文章

docker-php扩展

生成扩展骨架 环境&#xff1a;docker-compose、php74 1.本地要有一份 php-src git clone https://github.com/php/php-src.git cd php-src git checkout PHP-7.4.52.\www\php-src\ext可以看到有一个 ext_skel.php 文件 3.通过ext_skel.php脚本创建了一个hello扩展&#xf…

同步请求和异步请求

同步请求和异步请求是在网络编程中常用的两种通信模式&#xff0c;它们有以下区别&#xff1a; 同步请求&#xff1a; 在发送一个请求后&#xff0c;程序会一直等待服务器返回响应&#xff0c;期间无法进行其他操作。请求发出后&#xff0c;程序会阻塞在请求处&#xff0c;直…

变压器故障诊断(python代码,逻辑回归/SVM/KNN三种方法同时使用,有详细中文注释)

视频效果&#xff1a;变压器三种方法下故障诊断Python代码_哔哩哔哩_bilibili代码运行要求&#xff1a;tensorflow版本>2.4.0,Python>3.6.0即可&#xff0c;无需修改数据路径。 1.数据集介绍&#xff1a; 采集数据的设备照片 变压器在电力系统中扮演着非常重要的角色。…

【Spring源码】小白速通解析Spring源码,从0到1,持续更新!

Spring源码 参考资料 https://www.bilibili.com/video/BV1Tz4y1a7FM https://www.bilibili.com/video/BV1iz4y1b75q bean工厂 DefaultListableBeanFactory&#xff08;最原始&#xff09; bean的生命周期 创建&#xff08;实例化&#xff09;–>依赖注入–>-初始化…

【数据结构】循环队列

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Java课题笔记~ 整合第三方技术

1. 整合JUnit 问题导入 回忆一下Spring整合JUnit的步骤&#xff1f; 1.1 Spring整合JUnit&#xff08;复习&#xff09; 1.2 SpringBoot整合JUnit 【第一步】添加整合junit起步依赖(可以直接勾选) <dependency><groupId>org.springframework.boot</groupId…

1.SpringMVC接收请求参数及数据回显:前端url地址栏传递参数通过转发显示在网页

1、SpringMVC 处理前端提交的数据 1.1 提交的域名和处理方法的参数不一致&#xff0c;使用注解解决 1.2 提交的域名和处理方法的参数不一致&#xff0c;使用注解解决 1.3 提交的是一个对象 2、前端url地址栏传递的是一个参数 请求地址url&#xff1a;http://localhost:8080/s…

如何运用小程序技术闭环运营链路?

如何通过线上小程序获取用户线索&#xff0c;提高企业抗风险能力&#xff0c;建立有效的营销数字化系统一直是困扰每一个小程序开发者与运营者的问题。 当我们选择使用小程序设计自己的运营流程时&#xff0c;从「推广」到「转化」&#xff0c;再到最终的「留存」都是运营过程…

React 全栈体系(二)

第二章 React面向组件编程 一、基本理解和使用 1. 使用React开发者工具调试 2. 效果 2.1 函数式组件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>1_函数式组件</title> </head> &l…

Qt应用开发(基础篇)——选项卡窗口 QTabWidget

一、前言 QTabWidget类继承于QWidget&#xff0c;是一个拥有选项卡的窗口部件。 QTabWidget类有一个选项卡栏QTabBar和一个页面区域&#xff0c;用来显示和选项卡相关联的界面。用户通过点击选项卡或者自定义快捷方式(ALTKey)切换页面。 二、QTabWidget类 1、count 该属…

文本挖掘 day5:文本挖掘与贝叶斯网络方法识别化学品安全风险因素

文本挖掘与贝叶斯网络方法识别化学品安全风险因素 1. Introduction现实意义理论意义提出方法&#xff0c;目标 2. 材料与方法2.1 数据集2.2 数据预处理2.3 关键字提取2.3.1 TF-IDF2.3.2 改进的BM25——BM25WBM25BM25W 2.3.3 关键词的产生(相关系数) 2.4 关联规则分析2.5 贝叶斯…

Pytorch源码搜索与分析

PyTorch的的代码主要由C10、ATen、torch三大部分组成的。其中&#xff1a; C10 C10&#xff0c;来自于Caffe Tensor Library的缩写。这里存放的都是最基础的Tensor库的代码&#xff0c;可以运行在服务端和移动端。PyTorch目前正在将代码从ATen/core目录下迁移到C10中。C10的代…

【Java 回忆录】Java全栈开发笔记文档

这里能学到什么&#xff1f; 实战代码文档一比一记录实战问题和解决方案涉及前端、后端、服务器、运维、测试各方面通过各方面的文档与代码&#xff0c;封装一套低代码开发平台直接开腾讯会议&#xff0c;实实在线一起分享技术问题核心以 Spring Boot 作为基础框架进行整合后期…

大数据Flink学习圣经:一本书实现大数据Flink自由

学习目标&#xff1a;三栖合一架构师 本文是《大数据Flink学习圣经》 V1版本&#xff0c;是 《尼恩 大数据 面试宝典》姊妹篇。 这里特别说明一下&#xff1a;《尼恩 大数据 面试宝典》5个专题 PDF 自首次发布以来&#xff0c; 已经汇集了 好几百题&#xff0c;大量的大厂面试…

记一次较为详细的某CMS代码审计

前言 本次审计的话是Seay昆仑镜进行漏洞扫描 Seay的话它可以很方便的查看各个文件&#xff0c;而昆仑镜可以很快且扫出更多的漏洞点&#xff0c;将这两者进行结合起来&#xff0c;就可以发挥更好的效果。 昆仑镜官方地址 https://github.com/LoRexxar/Kunlun-M 环境 KKC…

前端笔试+面试分享

以下是个人线下面试遇到的真实的题&#xff0c;仅供参考和学习 1. css 选择符有哪些&#xff1f;哪些属性可以继承&#xff1f;优先级算法加何计算&#xff1f; CSS选择符有很多种&#xff0c;例如类型选择器、类选择器、ID选择器、属性选择器、伪类选择器、伪元素选择器等。 …

前端常用算法(一):防抖+节流

目录 第一章 防抖 1.1 防抖&#xff08;debounce&#xff09;简介 1.2 应用场景 1.3 实现思路 1.4 手撕防抖代码 第二章 节流 2.1 节流&#xff08;throttle&#xff09;简介 2.2 应用场景 2.3 实现思路 2.4 手撕节流代码&#xff08;方法&#xff1a;时间戳和计时器…

简单的洗牌算法

目录 前言 问题 代码展现及分析 poker类 game类 Text类 前言 洗牌算法为ArrayList具体使用的典例&#xff0c;可以很好的让我们快速熟系ArrayList的用法。如果你对ArrayList还不太了解除&#xff0c;推荐先看本博主的ArrayList的详解。 ArrayList的详解_WHabcwu的博客-CSD…

数据结构——链表详解

链表 文章目录 链表前言认识链表单链表结构图带头单循环链表结构图双向循环链表结构图带头双向循环链表结构图 链表特点 链表实现(带头双向循环链表实现)链表结构体(1) 新建头节点(2) 建立新节点(3)尾部插入节点(4)删除节点(5)头部插入节点(6) 头删节点(7) 寻找节点(8) pos位置…

C语言之feof与fgetc应用实例(八十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…