当前位置: 首页 > 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 把这个…...

Spring+MyBatis使用collection标签的两种使用方法

目录 项目场景: 实战操作: 1.创建菜单表 2.创建实体 3.创建Mapper 4.创建xml 属性描述: 效率比较: 项目场景: 本文说明了Spring BootMyBatis使用collection标签的两种使用方法 1. 方法一: 关联查询 2. 方法…...

k8s集群中集群方式安装nacos

1、前提条件 一个k8s集群,其中有三个master 节点,这三个节点的标签名称为etcd 三个master节点的ip 分别为:192.165.187.170 、192.165.187.171、192.165.187.172一个mysql 数据库, 数据库的ip 为:192.165.187.180 用户…...

极客时间:数据结构与算法之美【学习笔记+思考实践】

本篇是 《极客时间:数据结构与算法之美》课程的学习笔记和带有自己的一些思考实践。原文学习链接如下:https://time.geekbang.org/column/intro/100017301 开篇词 | 从今天起,跨过“数据结构与算法”这道坎01 | 为什么要学习数据结构和算法&a…...

基于视觉重定位的室内AR导航项目思路(2):改进的建图和定位分离的项目思路

文章目录 一、建图二、定位首先是第一种方法:几何方法其次是第二种方法:图像检索方法最后是第三种方法:深度学习方法 前情提要: 是第一次做项目的小白,文章内的资料介绍如有错误,请多包含! 一、…...

nodejs+vue+elementui精品课程网站设计

前端技术:nodejsvueelementui基于nodejs语言、vue.js框架、B/S架构、Mysql数据库设计并实现了精品课程网站设计。系统主要包括首页、个人中心、用户管理、课程信息管理、课程分类管理、学习论坛、在线试题管理、试题管理、系统管理、考试管理等功能模块。 本文首先介…...

40个Linux常用命令组合

1.删除0字节文件 find -type f -size 0 -exec rm -rf {} \; 2.查看进程 按内存从大到小排列 ps -e -o "%C : %p : %z : %a"|sort -k5 -nr 3.按cpu利用率从大到小排列 ps -e -o "%C : %p : %z : %a"|sort -nr 4.打印说cache里的URL grep -r -a jpg …...

NIFI关于Variables的使用

说明 NIFI中的变量(variables)和参数(parameters)在引用的时候是有区别的。 参数的引用是使用#{参数名}的形式。 变量是使用${变量名}的形式来引用。 nifi版本:1.23.2(docker镜像) Variable…...

2、VRP基础

本节我们介绍华为设备的VRP系统平台的一些基本知识,为以后学习路由交换的配置命令做好基本的准备。在这里,为软考网络工程师做准备,只需要了解其中比较基础的即可,包括VRP是什么、提供了哪些用户界面、VRP的用户级别、基本的配置视…...

docker容器运行成功但无法访问,原因分析及对应解决方案(最新,以Tomcat为例,亲测有效)

原因分析: 是否能访问当运行docker容器虚拟机(主机)地址 虚拟机对应的端口号是否开启或者防墙是否关闭 端口映射是否正确(这个是我遇到的) tomcat下载的是最新版,docker运行后里面是没有东西的&am…...

第15章 秒杀商品隔离解决方案

mini商城第15章 秒杀商品隔离解决方案 一、课题 商品秒杀-热门数据实时收集 二、回顾 1、掌握热门分析收集方案 2、Lua高级语法 3、Kafka使用 4、Lua垂直日志收集 5、Apache Druid大数据实时处理系统 三、目标 1、MyBatis查询Apache Druid 常规查询 复杂查询 2、热门…...