当前位置: 首页 > news >正文

Filter过滤器及HttpServletRequest和HttpServletResponse

拦截器(Interceptor)和过滤器(Filter)的执行顺序

  • tomcat->Filter->Interceptor->Controller

过滤器(Filter)概述?

Filter过滤器是JavaWeb的三大组件之一,三大组件分别为:Servlet程序、Listener监听器、Filter过滤器。
过滤器(Filter)可以在请求到达Servlet之前或响应离开Servlet之前对请求和响应进行过滤和修改。


Filter的生命周期

Filter的生命周期可分为初始化、请求处理、销毁三个阶段。

1.创建阶段:Web服务器启动的时候会创建Filter实例对象,并调用init()方法(只调用一次!!可以进行读取配置文件,建进行数据库连接等操作),完成对象的初始化。

2.执行阶段:当客户端请求目标资源时,服务器会筛选出符合映射条件的Filter,并按照类名的的先后顺序依次执行doFilter() 方法(可对请求进行预处理、检查请求头、修改请求参数、修改相应数据等操作)。

3.销毁阶段:服务器关闭时,Web服务器调用destroy()方法(只调用一次!!可以进行释放资源、关闭数据库连接等操作)销毁Filter对象。


使用方法

@Component
public class MyFilterOne implements Filter {/*** filter对象只创建一次,init方法只执行一次* FilterConfig对象:代表当前filter配置信息*/@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}/*** 完成实际过滤操作,当客户请求访问与过滤器相关联的URL的时候,Servlet过滤器将先执行doFilter方法,FilterChain参数用于访问后续过滤器*/@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {filterChain.doFilter(servletRequest,servletResponse);}/*** filter创建后会保存在内存中,当web应用移除或者服务器停止时才销毁,该方法在Filter的生命周期中仅执行一次,可释放过滤器使用的资源*/@Overridepublic void destroy() {}
}

HttpServletRequest和HttpServletResponse

HttpServletRequest

HttpServletRequest是ServletRequest的子接口,ServletRequest是通用接口,里面定义了与HTTP请求相关方法,包括获取请求参数、请求方法、请求头等。HttpServletRequest接口在ServletRequest的基础上,增加了一些专门处理HTTP请求的方法。

例如,客户端请求的地址是:http://www.xuexi.com/demo/test?name=luxifa&&age=25

HttpServletRequest对象的常用方法

  • getHeader(string name)方法:根据header参数名称获取值
  • getHeaderNames()方法:获取header里面的参数名称
  • getParameterMap()方法:获取请求参数对应的map
  • getParameter(name)方法:根据请求参数的名称获取对应的值
  • getParameterNames():获取所有请求参数的名称的枚举
  • getParameterValues(String name):获取指定名称的请求参数的所有值
  • getRemoteAddr()方法:获取客户端的IP地址
  • getScheme()方法:获取正确的协议,如http协议
  • getServerName()方法:服务器主机名
  • getServerPort()方法:服务器上web应用的访问端口
  • getContextPath()方法:获取域名后的斜杆加工程名,即/demo部分
  • getRemoteAddr()方法:发送请求的客户端主机的IP
  • getRequestURI()方法:将URL的域名和尾随的参数截取掉,剩下的那部分就是URI,即/demo/test
  • getRequestURL()方法:客户请求的url,不包括参数数据;例如http://www.xuexi.com/demo/test
  • getMethod()方法:HTTP请求的的方法名,默认是GET,也可指定PUT或POST
  • getRealPath(“/WEB-INF”)方法:获取虚拟目录的硬盘实际路径
  • getSession():获取与请求关联的会话对象
  • getCookies():获取请求中的所有Cookie
  • getInputStream():获取请求的输入流,用于读取请求体的内容

HttpServletRequest由Servlet容器在每次接收到HTTP请求时创建,开发者无需手动创建。在Servlet的doGet()、doPost()等方法中,可以通过方法的HttpServletRequest参数获取请求的相关信息


HttpServletResponse

HttpServletResponse用来封装HTTP响应的信息和操作。HttpServletResponse是ServletResponse的子接口,ServletResponse可用于处理任何类型响应,可进行获取输出流、设置相应的内容类型等操作。HttpServletResponse专门用来处理HTTP类型的响应。

一般,使用HttpServletResponse处理HTTP请求响应,使用HttpServletResponse处理其他协议的响应或自定义响应。

HttpServletResponse对象常用功能:

  • 设置响应头
  • 设置响应状态码
  • 设置响应内容类型
  • 获取写字符流
  • 获取输出流
  • 设置重定向
  • 设置响应缓存
  • 设置错误页面
  • 设置Cookie
HttpServletResponse  response;

设置响应头

  • 可使用setHeader()方法设置响应头,设置的响应头最终会发送给客户端浏览器。
  • response.setHeader(“content-type”,
    “text/html;charset=utf-8”):设置content-type响应头,告诉浏览器响应内容为html类型,编码为utf-8。
  • 还可response.setContentType(“application/json; charset=utf-8”);
  • 设置response字符流编码为utf-8:response.setCharaceterEncoding(“utf-8”);
  • addheader(name,value):添加头信息。键可以重复

设置响应状态码

  • response.setContentType(“text/html;charset=utf-8”):等同于response.setHeader(“content-type”,
    “text/html;charset=utf-8”);
  • response.setCharacterEncoding(“utf-8”):设置字符响应流的字符编码为utf-8;
  • response.setStatus(200):设置状态码;
  • response.sendError(404,“资源不存在”):当发送错误状态码时,Tomcat会跳转到固定的错误页面,但可以显示错误信息。

设置响应内容类型

  • response.setContentType(“application/json; charset=utf-8”); 响应内容类型为json数据
  • response.setContentType(“text/html; charset=utf-8”); 响应内容类型为HTML文档

获取写字符流

  • PrintWriter out = response.getWriter();调用out 的write()方法可写数据

获取输出流

  • ServletOutputStream out = response.getOutputStream()

如果响应正文内容为字符,使用response.getWriter(),如果响应内容是字节,例如下载,则使用response.getOutputStream()。
在一个请求中,不能同时使用这两个流!要么你使用repsonse.getWriter(),要么使用response.getOutputStream(),但不能同时使用,否则会抛IllegalStateException异常。

设置重定向

  • 假设访问http://www.a.com时,浏览器地址栏中的URL变成http://www.b.com,这就是重定向即重定向是服务器通知浏览器去访问另一个地址,即再发出另一个请求。
  • 使用sendRedirect()方法

设置响应缓存

  • 可用setDateHeader()、setIntHeader()和addDateHeader()等方法设置响应的缓存控制信息,如缓存验证、设置过期时间等。

设置错误页面

  • sendError()方法可将请求重定向到指定的错误页面。

设置Cookie

  • Cookie newCookie=new Cookie(String name,String value);然后调用addCookie()方法

参考博客:
https://blog.csdn.net/Go_Joe/article/details/128535136
https://blog.csdn.net/hanziang1996/article/details/78967400
https://blog.csdn.net/baidu_32935221/article/details/130160185
https://blog.csdn.net/m0_37834446/article/details/81385843
https://blog.csdn.net/u013089490/article/details/83654899

相关文章:

Filter过滤器及HttpServletRequest和HttpServletResponse

拦截器(Interceptor)和过滤器(Filter)的执行顺序 tomcat->Filter->Interceptor->Controller 过滤器(Filter)概述? Filter过滤器是JavaWeb的三大组件之一,三大组件分别为&…...

02-打包代码与依赖

打包代码与依赖说明 在开发中,我们写的应用程序通常需要依赖第三方的库(即程序中引入了既不在 org.apache.spark包,也不再语言运行时的库的依赖),我们就需要确保所有的依赖在Spark应用运行时都能被找到 对于Python而…...

Kotlin(五) 循环语句

目录 For循环 关键字 until step downTo Java中主要有两种循环语句:while循环和for循环。而Kotlin也提供了while循环和for循环,其中while循环不管是在语法还是使用技巧上都和Java中的while循环没有任何区别,因此我们就直接跳过不进行讲解…...

数字孪生产品:数字化时代的变革引擎

数字孪生技术,作为一项前沿的科技创新,正在不断改变我们的世界。它为各行各业的发展提供了无限的可能性,成为了当今数字化时代的一大亮点。数字孪生产品,作为数字孪生技术的具体应用,将在未来发挥越来越重要的作用。 数…...

对接西部数据Western Digital EDI 系统

近期我们为国内某知名电子产品企业提供EDI解决方案,采用知行之桥 EDI 系统作为核心组件,成功与西部数据Western Digital(简称西数)建立EDI连接,实现数据安全且自动化传输。 EDI实施需求 EDI连接 传输协议:A…...

ClickHouse进阶(十):Clickhouse数据查询-4

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容! 🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 📌订阅…...

FPGA原理与结构——FIFO IP核的使用与测试

一、前言 本文介绍FIFO Generator v13.2 IP核的具体使用与例化,在学习一个IP核的使用之前,首先需要对于IP核的具体参数和原理有一个基本的了解,具体可以参考: FPGA原理与结构——FIFO IP核原理学习https://blog.csdn.net/apple_5…...

ABB CMA120 3DDE300400面板

人机界面:ABB CMA120 3DDE300400 面板通常具有用户友好的人机界面,可用于监视和控制连接设备和系统的操作。 图形显示:该面板通常具有高分辨率的液晶显示屏,用于显示图形界面和实时数据,以便操作员更容易理解和管理工…...

【代码随想录day25】动态规划:01背包理论基础

题目 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 代码 dp[i][j]: 表示从0~i个物品中选物品放到容量为j的背包中所能获得的最大价值 …...

Python Opencv实践 - 轮廓检测

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/map.jpg") print(img.shape) plt.imshow(img[:,:,::-1])#Canny边缘检测 edges cv.Canny(img, 127, 255, 0) plt.imshow(edges, cmapplt.cm.gray)#查找轮廓 #c…...

c#保留两位小数

1.使用ToString()方法和格式字符串 double number 3.1415926; string result number.ToString(“F2”); // 将number转换为字符串,并保留两位小数 Console.WriteLine(result); // 输出结果为 “3.14” 2.使用字符串插值和格式字符串 double number 3.1415926;…...

[machineLearning]非监督学习unsupervised learning

1.什么是非监督学习 常见的神经网络是一种监督学习,监督学习的主要特征即为根据输入来对输出进行预测,最终会得到一个输出数值.而非监督学习的目的不在于输出,而是在于对读入的数据进行归类,选取特征,打标签,通过对于数据结构的分析来完成这些操作, 很少有最后的输出操作. 从…...

C语言深入理解指针(非常详细)(四)

目录 字符指针变量数组指针变量数组指针变量是什么数组指针变量怎么初始化 二维数组传参的本质函数指针变量函数指针变量的创建函数指针变量的使用代码typedef关键字 函数指针数组转移表 字符指针变量 字符指针在之前我们有提到过,(字符)&am…...

知识库建设:从0到1搞定知识库建设的方法论分享

如果我们想要搭建一个知识库,前提是我们要明确知道这个知识库是干什么用的,只有了解知识库的应用场景才能知道如何去建设知识库。 知识库建设 以常见的电商客服为例,客户会经常咨询什么时候发货,怎么退货,怎么换货………...

SpringBoot+Vue 的留守儿童系统的研究与实现,2.0 版本,附数据库、教程

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1.研究背景2. 技术栈3.系统分析4系统设计5系统的详细设计与实现5.1系统功能模块5.2管理员功能模块…...

28.考试

Description 小学期马上就要结束了,为了检验大家的学习成果,老师进行了一次考试。然而小徐前两周半都忙于练习篮球,几乎没有学习,因此考试时很可能做不完所有题目。 但小徐仍然想要拿到尽可能高的分数,因此在做题时需要…...

浏览器窗口间的通信

一、汇总 二、同源策略 三、webSocket (无跨域限制) 优点:无跨域限制 缺点:成本高 四、客户端存储 1、localStorage onStorage 例子: 2、定时器 客户端存储 例子: 缺点: 五、postMessage (无跨域…...

MATLAB 的 plot 绘图

文章目录 SyntaxDescriptionplot(X,Y)plot(X,Y,LineSpec)plot(X1,Y1,…,Xn,Yn)plot(X1,Y1,LineSpec1,...,Xn,Yn,LineSpecn)plot(Y)plot(Y,LineSpec)plot(tbl,xvar,yvar)plot(tbl,yvar)plot(ax,___)plot(___,Name,Value)p plot(___) plot: 2-D line plot Syntax plot(X,Y)plo…...

SpringBoot项目--电脑商城【获取省市区列表】

1.易错点 1.错误做法 新增收货地址页面的三个下拉列表的内容展示没有和数据库进行交互,而是通过前端实现的(将代码逻辑放在了distpicker.data.js文件中),实现方法是在加载新增收货地址页面时加载该js文件,这种做法不可取 2.正确做法 把这些数据保存到数据库中,用户点击下拉…...

使用git把本地项目关联远程代码仓库,并推送到远程仓库

你在本地新建了一个项目,写好了代码,但是没有关联远程仓库,怎么关联并上传呢? 你要先去gitee创建一个代码仓库,然后复制http地址。 首次提交项目代码到一个新建的远程仓库: 1、通过命令 git init 把这个…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

三体问题详解

从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...

多模态大语言模型arxiv论文略读(110)

CoVLA: Comprehensive Vision-Language-Action Dataset for Autonomous Driving ➡️ 论文标题&#xff1a;CoVLA: Comprehensive Vision-Language-Action Dataset for Autonomous Driving ➡️ 论文作者&#xff1a;Hidehisa Arai, Keita Miwa, Kento Sasaki, Yu Yamaguchi, …...

Three.js进阶之粒子系统(一)

一些特定模糊现象&#xff0c;经常使用粒子系统模拟&#xff0c;如火焰、爆炸等。Three.js提供了多种粒子系统&#xff0c;下面介绍粒子系统 一、Sprite粒子系统 使用场景&#xff1a;下雨、下雪、烟花 ce使用代码&#xff1a; var materialnew THRESS.SpriteMaterial();//…...

链结构与工作量证明7️⃣:用 Go 实现比特币的核心机制

链结构与工作量证明:用 Go 实现比特币的核心机制 如果你用 Go 写过区块、算过哈希,也大致理解了非对称加密、数据序列化这些“硬核知识”,那么恭喜你,现在我们终于可以把这些拼成一条完整的“区块链”。 不过别急,这一节我们重点搞懂两件事: 区块之间是怎么连接成“链”…...