java spring 拦截器和过滤器+过滤器处理数据

java spring 拦截器和过滤器+过滤器处理数据

  • 介绍
      • Spring拦截器(Interceptor)
        • 导入依赖
        • 完整代码
      • Java过滤器(Filter)
        • 完整代码分为 2 个文件,请看下面
          • BodyReaderHttpServletRequestWrapper.java
          • MyFilter.java
      • Spring过滤器和拦截器的区别

介绍

在Spring框架中,拦截器和过滤器都是用于处理HTTP请求的生命周期中的特定时刻。它们都可以用来拦截请求和响应,并在它们到达目标处理器之前或之后进行一些操作。在本教程中,我们将探讨拦截器和过滤器的区别以及如何使用它们来处理数据。

Spring拦截器(Interceptor)

Spring拦截器是Spring框架特有的,用于在Spring MVC请求处理的前后添加自定义逻辑。拦截器通常用于以下场景:

  • 认证和授权
  • 日志记录
  • 事务管理
  • 请求和响应的修改
    拦截器的工作流程包括:
  • preHandle:在请求处理之前调用,可以用来添加额外的验证或修改请求。
  • postHandle:在请求处理之后,但在视图渲染之前调用,可以用来添加额外的模型数据或修改视图。
  • afterCompletion:在整个请求结束后调用,可以用来进行资源清理。
    拦截器通过Spring的配置文件或注解进行配置。
导入依赖
import org.springframework.stereotype.Component;

导入 Spring的@Component注解,意味着这个类会被Spring的IoC容器自动识别为一个组件,并将其注册到容器中。拦截器实例会随着容器的启动而被创建。

import org.springframework.web.servlet.HandlerInterceptor;

导入了HandlerInterceptor接口,这个接口定义了拦截器的三种方法:preHandle()postHandle()afterCompletion(),该类将实现这些方法。

import org.springframework.web.servlet.ModelAndView;

导入了ModelAndView类,它通常在拦截器的postHandle()方法中被使用,用来访问模型数据和视图信息。

完整代码

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;@Component
public class Interceptor implements HandlerInterceptor {/*** 拦截器** @param httpServletRequest* @param httpServletResponse* @param o* @return* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {try {String requestUrl = httpServletRequest.getRequestURI();Map<String, String[]> originRequestMap = httpServletRequest.getParameterMap();System.out.println("拦截器执行,参考 class ActionHandle");} catch (Exception e) {}return true;}@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {}
}

Java过滤器(Filter)

Java过滤器是Java EE规范的一部分,用于在Servlet容器中处理请求和响应。过滤器通常用于以下场景:

  • 认证和授权
  • 日志记录
  • 事务管理
  • 数据压缩
  • 缓冲区管理
    过滤器的工作流程包括:
  • doFilter:过滤器的核心方法,对请求和响应进行处理。
  • init:在过滤器首次使用前调用,可以用来初始化过滤器。
  • destroy:在过滤器不再使用时调用,可以用来释放资源。
    过滤器通过web.xml配置文件进行配置,或者通过Java配置注解进行配置。
完整代码分为 2 个文件,请看下面
BodyReaderHttpServletRequestWrapper.java
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
import java.net.URLDecoder;
import java.util.*;public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {private Map<String, String[]> paramsMap;@Overridepublic Map getParameterMap() {return paramsMap;}@Overridepublic String getParameter(String name) {String[] values = paramsMap.get(name);if (values == null || values.length == 0) {return null;}return values[0];}@Overridepublic String[] getParameterValues(String name) {return paramsMap.get(name);}@Overridepublic Enumeration getParameterNames() {return Collections.enumeration(paramsMap.keySet());}private String getRequestBody(InputStream stream) {String line = "";StringBuilder body = new StringBuilder();int counter = 0;// 读取POST提交的数据内容BufferedReader reader = new BufferedReader(new InputStreamReader(stream));try {while ((line = reader.readLine()) != null) {if (counter > 0) {body.append("rn");}body.append(line);counter++;}} catch (IOException e) {e.printStackTrace();}return body.toString();}private HashMap<String, String[]> getParamMapFromPost(HttpServletRequest request) {String body = "";try {body = getRequestBody(request.getInputStream());} catch (IOException e) {e.printStackTrace();}HashMap<String, String[]> result = new HashMap<String, String[]>();if (null == body || 0 == body.length()) {return result;}return parseQueryString(body);}// 自定义解码函数private String decodeValue(String value) {if (value.contains("%u")) {return Encodes.urlDecode(value);} else {try {return URLDecoder.decode(value, "UTF-8");} catch (UnsupportedEncodingException e) {// 非UTF-8编码return "";}}}public HashMap<String, String[]> parseQueryString(String s) {String valArray[] = null;if (s == null) {throw new IllegalArgumentException();}HashMap<String, String[]> ht = new HashMap<String, String[]>();StringTokenizer st = new StringTokenizer(s, "&");while (st.hasMoreTokens()) {String pair = (String) st.nextToken();int pos = pair.indexOf('=');if (pos == -1) {continue;}String key = pair.substring(0, pos);String val = pair.substring(pos + 1, pair.length());if (ht.containsKey(key)) {String oldVals[] = (String[]) ht.get(key);valArray = new String[oldVals.length + 1];for (int i = 0; i < oldVals.length; i++) {valArray[i] = oldVals[i];}valArray[oldVals.length] = decodeValue(val);} else {valArray = new String[1];valArray[0] = decodeValue(val);}ht.put(key, valArray);}return ht;}private Map<String, String[]> getParamMapFromGet(HttpServletRequest request) {return parseQueryString(request.getQueryString());}public String getBody() {return new String(body);}// 报文private final byte[] body;public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {super(request);body = readBytes(request.getInputStream());///*if ("POST".equals(request.getMethod().toUpperCase())) {paramsMap = getParamMapFromPost(this);} else {paramsMap = getParamMapFromGet(this);}*/}@Overridepublic BufferedReader getReader() throws IOException {return new BufferedReader(new InputStreamReader(getInputStream()));}@Overridepublic ServletInputStream getInputStream() throws IOException {final ByteArrayInputStream bais = new ByteArrayInputStream(body);return new ServletInputStream() {@Overridepublic int read() throws IOException {return bais.read();}@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}@Overridepublic void setReadListener(ReadListener arg0) {}};}private static byte[] readBytes(InputStream in) throws IOException {BufferedInputStream bufin = new BufferedInputStream(in);int buffSize = 1024;ByteArrayOutputStream out = new ByteArrayOutputStream(buffSize);byte[] temp = new byte[buffSize];int size = 0;while ((size = bufin.read(temp)) != -1) {out.write(temp, 0, size);}bufin.close();byte[] content = out.toByteArray();return content;}}
MyFilter.java

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject; 
import 这里填路径.BodyReaderHttpServletRequestWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.*;@Component
public class MyFilter implements Filter {@Autowiredpublic RedisCache redisCache;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}/*** 获取配置信息*/public String getSysConfig(String configKey) {return redisCache.getCacheObject(CacheConstants.SYS_CONFIG_KEY + configKey);}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {ServletRequest requestWrapper = null;String param = "";if (request instanceof HttpServletRequest) {HttpServletRequest httpServletRequest = (HttpServletRequest) request;String method = httpServletRequest.getMethod().toUpperCase();String type = httpServletRequest.getContentType();if ("PUT".equals(method) && "application/json;charset=UTF-8".equalsIgnoreCase(type)) {requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request);}}if (requestWrapper == null) {Map<String, String[]> originRequestMap = request.getParameterMap();Map<String, String> requestMap = new HashMap<String, String>();for (String key : originRequestMap.keySet()) {String[] values = originRequestMap.get(key);requestMap.put(key, values[0]);}param = JSON.toJSONString(requestMap);} else {// 获取请求中的流,将取出来的字符串,修改字符串,再次转换成流,然后把它放入到新request对象中param = ((BodyReaderHttpServletRequestWrapper) requestWrapper).getBody();JSONObject jsonObject = JSONObject.parseObject(param);for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {String key = entry.getKey();Object value = entry.getValue();// 这里可以做判断,把参数修改,实现业务}param = jsonObject.toJSONString();// 将修改后的param重新转换为流,放入新的请求对象中byte[] bytes = param.getBytes(StandardCharsets.UTF_8);ByteArrayInputStream bis = new ByteArrayInputStream(bytes);requestWrapper = new HttpServletRequestWrapper((HttpServletRequest) request) {@Overridepublic ServletInputStream getInputStream() throws IOException {return new CustomServletInputStream(bis);}@Overridepublic BufferedReader getReader() throws IOException {return new BufferedReader(new InputStreamReader(bis));}};}System.out.println("过滤器:" + param);//放行if (requestWrapper == null) {chain.doFilter(request, response);} else {chain.doFilter(requestWrapper, response);}}@Overridepublic void destroy() {}private static class CustomServletInputStream extends ServletInputStream {private final ByteArrayInputStream inputStream;public CustomServletInputStream(ByteArrayInputStream bis) {this.inputStream = bis;}@Overridepublic int read() throws IOException {return inputStream.read();}@Overridepublic boolean isFinished() {return inputStream.available() == 0;}@Overridepublic boolean isReady() {return true; // Always ready to read}@Overridepublic void setReadListener(ReadListener listener) {// No async support in this example}}
}

具体使用的时候参考代码中的注释:“这里可以做判断,把参数修改,实现业务”

这个位置可以通过调试来一步步理解。
在这里插入图片描述

Spring过滤器和拦截器的区别

  • 配置位置
    • 过滤器通常在web.xml中配置。
    • 拦截器可以在Spring的配置文件中配置,也可以使用注解进行配置。
  • 应用范围
    • 过滤器可以应用于Servlet层面的所有请求,不仅限于Spring MVC。
    • 拦截器仅应用于Spring MVC请求。
  • 粒度
    • 过滤器的工作粒度更细,可以处理请求和响应的各个阶段。
    • 拦截器的工作粒度稍粗,主要针对请求的处理流程。
  • 功能
    • 过滤器主要用于通用的事务管理和安全性控制。
    • 拦截器主要用于Spring MVC中的请求处理,如日志记录、权限验证等。

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

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

相关文章

DataWhale-吃瓜教程学习笔记 (五)

学习视频&#xff1a;第4章-决策树_哔哩哔哩_bilibili 西瓜书对应章节&#xff1a; 第四章 4.1&#xff1b;4.2 文章目录 决策树算法原理- 逻辑角度- 几何角度 ID3 决策树- 自信息- 信息熵 &#xff08;自信息的期望&#xff09;- 条件熵 &#xff08; Y 的信息熵关于概率分布 …

python selenium 打开网页

selenium工具类 - 文件名 seleniumkit.py 代码如下 # -*- coding:utf-8 _*-from selenium import webdriverimport os import timefrom selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from seleniu…

Ascend基于自定义算子工程的算子开发

环境准备 见https://gitee.com/zaj1414904389/ascend-tutorial.git 工程创建 CANN软件包中提供了工程创建工具msopgen&#xff0c;开发者可以输入算子原型定义文件生成Ascend C算子开发工程 [{"op": "AddCustom","input_desc": [{"name…

CVPR2024 轨迹预测系列(一)

CVPR2024 轨迹预测系列&#xff08;一&#xff09; 文章目录 CVPR2024 轨迹预测系列&#xff08;一&#xff09;一、Adapting to Length Shift: FlexiLength Network for Trajectory Prediction.1、Abstract2、FlexiLength Network3、Datasets4、Experiments5、Implementation …

分类预测 | PSO-PNN基于粒子群算法优化概率神经网络的数据分类预测(Matlab)

分类预测 | ZOA-PCNN-AT-SVM斑马优化并行卷积-支持向量机融合注意力机制的故障识别 目录 分类预测 | ZOA-PCNN-AT-SVM斑马优化并行卷积-支持向量机融合注意力机制的故障识别分类效果基本描述程序设计参考资料 分类效果 基本描述 1.PSO-PNN基于粒子群算法优化概率神经网络的数据…

长鑫存储母公司斥资24亿美元发展国产HBM

国产DRAM厂商长鑫存储母公司睿力集成计划投资24亿美元在上海建一座高端封装工厂。据报道&#xff0c;该工厂将专注于高带宽存储器&#xff08;HBM&#xff09;芯片的封装&#xff0c;预计到2026年中开始投入生产。长鑫存储将利用来自多方投资者的资金进行建设&#xff0c;其中包…

鼠尾草(洋苏草)

鼠尾草&#xff08;Salvia japonica Thunb.&#xff09;&#xff0c;又名洋苏草、普通鼠尾草、庭院鼠尾草&#xff0c;属于唇形科鼠尾草属多年生草本植物。鼠尾草以其独特的蓝紫色花序和长而细密的叶片为特点&#xff0c;常用于花坛、庭院和药用植物栽培。 鼠尾草的名字源自于…

江科大笔记—读写内部闪存FLASH读取芯片ID

读写内部闪存FLASH 右下角是OLED&#xff0c;然后左上角在PB1和PB11两个引脚&#xff0c;插上两个按键用于控制。下一个代码读取芯片ID&#xff0c;这个也是接上一个OLED&#xff0c;能显示测试数据就可以了。 STM32-STLINK Utility 本节的代码调试&#xff0c;使用辅助软件…

Langchain-实战篇-搭建本地问答机器人-01

项目背景 在这个快节奏的职场世界里&#xff0c;我们每个人都可能在某个时刻&#xff0c;化身为一头辛勤的牛或一匹奔腾的马&#xff0c;面对入职签合同时的迷茫&#xff0c;或是离职时的纠纷&#xff0c;心中难免会涌现出各种疑问。比如&#xff1a; "这份合同里的条款…

Python在Excel中设置数字格式和获取应用数字格式后的值

目录 安装Python Excel库 Python在Excel中设置数字格式 Python获取Excel中应用数字格式的单元格的显示值 总结 Excel 数字格式是用于控制单元格中数字显示方式的一组规则或代码。通过设置不同的数字格式&#xff0c;可以定义数字的显示方式&#xff0c;如小数位数、货币符号…

Java对应C++ STL的用法

sort&#xff1a; 1&#xff1a;java.util.Arrays中的静态方法Arrays.sort()方法&#xff0c;针对基本数据类型和引用对象类型的数组元素排序 2&#xff1a;java.util.Collections中的静态方法的Collections.sort()方法&#xff0c;针对集合框架中的动态数组&#xff0c;链表&…

iOS17系统适配

iOS17 新功能 文章目录 iOS17 新功能iOS17支持哪几款机型Xcode15新特性iOS17-开发适配指南 横屏待机 在iOS 17中&#xff0c;还带来了横屏待机功能&#xff0c;苹果将这个新功能命名为“Standby”模式&#xff0c;为 iPhone 带来了全新的玩法。iPhone启用之后&#xff0c;默认情…

1-Pandas是什么

Pandas是什么 Pandas 是一个开源的第三方 Python 库&#xff0c;从 Numpy 和 Matplotlib 的基础上构建而来&#xff0c;享有数据分析“三剑客之一”的盛名&#xff08;NumPy、Matplotlib、Pandas&#xff09;。Pandas 已经成为 Python 数据分析的必备高级工具&#xff0c;它的…

PyTorch Tensor进阶操作指南(二):深度学习中的关键技巧

本文主要讲tensor的裁剪、索引、降维和增维 Tensor与numpy互转、Tensor运算等&#xff0c;请看这篇文章 目录 9.1、首先看torch.squeeze()函数&#xff1a; 示例9.1&#xff1a;&#xff08;基本的使用&#xff09; 小技巧1&#xff1a;如何看维数 示例9.2&#xff1a;&a…

安全架构概述_1.信息安全面临的威胁

在当今以计算机、网络和软件为载体的数字化服务几乎成为人类赖以生存的手段。与之而来的计算机犯罪呈现指数上升趋势&#xff0c;因此&#xff0c;信息的可用性、完整性、机密性、可控性和不可抵赖性等安全保障显得尤为重要&#xff0c;而满足这些诉求&#xff0c;离不开好的安…

Vulnhub-AdmX

主机发现 靶机 &#xff1a; 192.168.145.131131 这台主机 存活 端口扫描 nmap -sV -O -p 1-65535 192.168.145.131 存在 80 端口 &#xff0c;这里连ssh 端口都没了 80 端口存在 Apache httpd 2.4.1 存在 Apache 默认页面 像这种页面 &#xff0c;没有什么具体的价值 扫描一…

嵌入式Linux系统编程 — 4.6 atoi、strtol等函数实现字符串与数字转换

目录 1 字符串转整形数据 1.1 函数功能 1.2 示例程序 2 字符串转浮点型数据 2.1 函数介绍 2.2 示例程序 3 数字转字符串 3.1 函数介绍 3.2 函数原型 在编程中&#xff0c;经常会需要将数字组成的字符串转换为相应的数字、或者将数字转换为字符串&#xff0c;在 C 函数…

连环计 | 第6集 | 百姓有倒悬之危,君臣有累卵之急 | 貂蝉 | 三国演义 | 逐鹿群雄

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f4cc;这篇博客分享的是《三国演义》文学剧本第Ⅰ部分《群雄逐鹿》的第6️⃣集《连环计》的经典语句和文学剧本全集台词 文章目录 1.经典语句2.文学剧本台词 …

LabVIEW材料样本结构缺陷检测

本文介绍了一种基于LabVIEW的实验室振动特性分析测试装置&#xff0c;通过分析振动特性来检测结构缺陷。文章详细描述了具体案例、硬件型号、工作原理、软件功能以及注意事项。 硬件型号 振动传感器&#xff1a;PCB Piezotronics 352C33加速度计 数据采集卡&#xff1a;NI PXI…

python(基础语法,pandas,numpy,正则表达式,数据预处理)

python学习推荐网址&#xff1a; 白月黑羽 一、语法基础 目标&#xff1a; • list、tuple、set、dict的基本用法 • 内置函数 len&#xff08;&#xff09;&#xff0c; eval&#xff08;&#xff09;&#xff0c;range&#xff08;&#xff09;&#xff0c;sort&#xff08;…