返回顶部
首页 > 资讯 > 后端开发 > Python >使用RequestBodyAdvice实现对Http请求非法字符过滤
  • 204
分享到

使用RequestBodyAdvice实现对Http请求非法字符过滤

2024-04-02 19:04:59 204人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

RequestBodyAdvice对Http请求非法字符过滤 利用RequestBodyAdvice对HTTP请求参数放入body中的参数进行非法字符过滤。 要求:spring 4.

RequestBodyAdvice对Http请求非法字符过滤

利用RequestBodyAdvice对HTTP请求参数放入body中的参数进行非法字符过滤。

要求:spring 4.2+

额外的pom.xml


<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
 
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastJSON</artifactId>
<version>1.2.44</version>
</dependency>

代码


package com.niugang.controller;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.WEB.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice;  
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;

@ControllerAdvice(basePackages = "com.niugang")
public class MyRequestBodyAdvice implements RequestBodyAdvice {
private final static Logger logger = LoggerFactory.getLogger(MyRequestBodyAdvice.class);
  
@Override
public boolean supports(MethodParameter methodParameter, Type targetType,
Class<? extends HttpMessageConverter<?>> converterType) {
return true;
}

@Override
public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter,
Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
return body;
} 
 
@Override
public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,
Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
  
try {
return new MyHttpInputMessage(inputMessage);
} catch (Exception e) {
e.printStackTrace();
return inputMessage; 
}
}
@Override
public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,
Class<? extends HttpMessageConverter<?>> converterType) {
return body;
} 
 
class MyHttpInputMessage implements HttpInputMessage {
private HttpHeaders headers;
private InputStream body;
              @SuppressWarnings("unchecked")
public MyHttpInputMessage(HttpInputMessage inputMessage) throws Exception {
String string = IOUtils.toString(inputMessage.getBody(), "UTF-8");
Map<String, Object> mapJson = (Map<String, Object>) JSON.parseObject(string, Map.class);
Map<String, Object> map = new HashMap<String, Object>();
Set<Entry<String, Object>> entrySet = mapJson.entrySet();
for (Entry<String, Object> entry : entrySet) {
String key = entry.geTKEy();
Object objValue = entry.getValue();
    if (objValue instanceof String) {
String value = objValue.toString();
map.put(key, filterDangerString(value));
} else { // 针对结合的处理
@SuppressWarnings("rawtypes")
List<HashMap> parseArray = JSONArray.parseArray(objValue.toString(), HashMap.class);
List<Map<String, Object>> listMap = new ArrayList<Map<String, Object>>();
for (Map<String, Object> innerMap : parseArray) {
Map<String, Object> childrenMap = new HashMap<String, Object>();
Set<Entry<String, Object>> elseEntrySet = innerMap.entrySet();
for (Entry<String, Object> en : elseEntrySet) {
              String innerKey = en.getKey();
Object innerObj = en.getValue();
if (innerObj instanceof String) {
String value = innerObj.toString();
childrenMap.put(innerKey, filterDangerString(value));
}  
}
listMap.add(childrenMap);
}
map.put(key, listMap);
}
}
this.headers = inputMessage.getHeaders();
this.body = IOUtils.toInputStream(JSON.toJSONString(map), "UTF-8");
}
 
@Override
public InputStream getBody() throws IOException {
return body;
}
 
@Override
public HttpHeaders getHeaders() {
return headers;
}
}
private String filterDangerString(String value) {
if (value == null) {
return null;
}
value = value.replaceAll("\\|", "");
value = value.replaceAll("&", "");
value = value.replaceAll(";", "");
value = value.replaceAll("@", "");
value = value.replaceAll("'", "");
value = value.replaceAll("\\'", "");
value = value.replaceAll("<", "");
value = value.replaceAll("-", "");
value = value.replaceAll(">", "");
value = value.replaceAll("\\(", "");
value = value.replaceAll("\\)", "");
value = value.replaceAll("\\+", "");
value = value.replaceAll("\r", "");
value = value.replaceAll("\n", "");
value = value.replaceAll("script", "");
value = value.replaceAll("select", "");
value = value.replaceAll("\"", "");
value = value.replaceAll(">", "");
value = value.replaceAll("<", "");
value = value.replaceAll("=", "");
value = value.replaceAll("/", "");
return value;
}
}

对于以上的配置Controller接收参数需要加@RequestBody。

测试

过滤后的数据

自定义RequestBodyAdvice过滤Json表情符号



@ControllerAdvice
@Slf4j
public class FilterEmojiRequestBodyAdvice implements RequestBodyAdvice {
    @Override
    public boolean supports(MethodParameter methodParameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
        Annotation[] annotations = methodParameter.getParameterAnnotations();
        for (Annotation ann : annotations) {
            Validated validatedAnn = AnnotationUtils.getAnnotation(ann, Validated.class);
            if (validatedAnn != null || ann.annotationType().getSimpleName().startsWith("Valid")) {
                return true;
            }
        }
        return false;
    }
    @Override
    public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
        return inputMessage;
    }
    @Override
    public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
        try {
            this.filterEmojiAfterBody(body);
        } catch (Exception e) {
            log.info("过滤表情异常:{}", e);
        }
        return body;
    }
    private void filterEmojiAfterBody(Object body) throws IllegalAccessException {
        if (null != body) {
            Field[] fields = ReflectUtil.getFields(body.getClass());
            for (int i = 0; i < fields.length; i++) {
                Field field = fields[i];
                if (field.isAnnotationPresent(Valid.class)) {
                    field.setAccessible(true);
                    this.filterEmojiAfterBody(field.get(body));
                }
                if (field.isAnnotationPresent(FilterEmoji.class)) {
                    field.setAccessible(true);
                    Object value = field.get(body);
                    if (value instanceof String) {
                        String str = filterEmoji(value.toString());
                        field.set(body, str);
                    }
                }
            }
        }
    }
    @Override
    public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
        return body;
    }
    
    public static String filterEmoji(String source) {
        if (StringUtils.isEmpty(source)) {
            return "";
        }
        if (!containsEmoji(source)) {
            return source;//如果不包含,直接返回
        }
        StringBuilder buf = new StringBuilder();
        int len = source.length();
        for (int i = 0; i < len; i++) {
            char codePoint = source.charAt(i);
            if (isNotEmojiCharacter(codePoint)) {
                buf.append(codePoint);
            }
        }
        return buf.toString().trim();
    }
    
    public static boolean containsEmoji(String source) {
        if (StringUtils.isBlank(source)) {
            return false;
        }
        int len = source.length();
        for (int i = 0; i < len; i++) {
            char codePoint = source.charAt(i);
            if (!isNotEmojiCharacter(codePoint)) {
                //判断到了这里表明,确认有表情字符
                return true;
            }
        }
        return false;
    }
    
    public static boolean isNotEmojiCharacter(char codePoint) {
        return (codePoint == 0x0) ||
                (codePoint == 0x9) ||
                (codePoint == 0xA) ||
                (codePoint == 0xD) ||
                ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) ||
                ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) ||
                ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 使用RequestBodyAdvice实现对Http请求非法字符过滤

本文链接: https://lsjlt.com/news/129374.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用RequestBodyAdvice实现对Http请求非法字符过滤
    RequestBodyAdvice对Http请求非法字符过滤 利用RequestBodyAdvice对HTTP请求参数放入body中的参数进行非法字符过滤。 要求:spring 4....
    99+
    2024-04-02
  • 如何用RequestBodyAdvice实现对Http请求非法字符过滤
    这篇文章主要介绍“如何用RequestBodyAdvice实现对Http请求非法字符过滤”,在日常操作中,相信很多人在如何用RequestBodyAdvice实现对Http请求非法字符过滤问题上存在疑惑,小编查阅了各式资料,整理出简单好用的...
    99+
    2023-06-20
  • 使用注解+RequestBodyAdvice实现http请求内容加解密方式
    注解主要用来指定那些需要加解密的controller方法 实现比较简单 @Target({ElementType.METHOD}) @Retention(RetentionPol...
    99+
    2024-04-02
  • 怎么用注解+RequestBodyAdvice实现http请求内容加解密方式
    这篇文章主要介绍“怎么用注解+RequestBodyAdvice实现http请求内容加解密方式”,在日常操作中,相信很多人在怎么用注解+RequestBodyAdvice实现http请求内容加解密方式问题上存在疑惑,小编查阅了各式资料,整理...
    99+
    2023-06-20
  • Filter怎么利用http请求实现绕过
    Filter怎么利用http请求实现绕过?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。http请求绕过Filter的实例场景:两个web服务器,A当做服务端,B...
    99+
    2023-05-31
    http filter
  • PHP中使用路由中间件实现请求的过滤与处理
    随着Web应用的发展,处理请求的方式也在不断演进。传统的方式是将所有的请求通过一个单一的处理入口进行处理,这样不仅增加了入口文件的复杂度,也不便于对不同类型的请求进行细粒度的处理。为了解决这个问题,引入了路由中间件的概念。什么是路由中间件?...
    99+
    2023-10-21
    路由中间件 请求过滤 处理编程
  • Spring中的Http请求如何使用restTemplete实现
    这篇文章给大家介绍Spring中的Http请求如何使用restTemplete实现,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。使用Spring的restTemplete进行Http请求public class Res...
    99+
    2023-05-31
    resttemplete spring http请求
  • Java使用HttpUtils怎么实现发送HTTP请求
    本篇文章和大家了解一下Java使用HttpUtils怎么实现发送HTTP请求。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。目录第一部分:简单总结HTTP请求常用配置第二部分:使用JavaLib的HttpUtils第三部分...
    99+
    2023-07-06
  • 如何使用PHP实现同步HTTP请求并记录请求日志?
    PHP是一种流行的编程语言,它被广泛应用于Web开发领域。在Web开发中,我们通常需要使用HTTP请求与其他服务进行通信。本文将介绍如何使用PHP实现同步HTTP请求并记录请求日志,希望对你有所帮助。 一、PHP实现同步HTTP请求 在PH...
    99+
    2023-09-03
    同步 http 日志
  • python实现mysql的单引号字符串过滤方法
    本文实例讲述了python实现mysql的单引号字符串过滤方法。分享给大家供大家参考,具体如下: 最主要用这个函数,可以处理MySQLdb.escape_string(content). class G...
    99+
    2022-06-04
    字符串 单引号 方法
  • SpringBoot中如何使用@RestController注解实现http请求
    本篇内容主要讲解“SpringBoot中如何使用@RestController注解实现http请求”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot中如何使用@RestContr...
    99+
    2023-06-08
  • 使用Flutter怎么实现一个Http网络请求
    这期内容当中小编将会给大家带来有关使用Flutter怎么实现一个Http网络请求,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. Http的请求方式简介Http网络请求方式就是描述了客户端想对指定的资源...
    99+
    2023-06-14
  • Python连接MySQL并使用fetchall()方法过滤特殊字符
    来一个简单的例子,看Python如何操作数据库,相比Java的JDBC来说,确实非常简单,省去了很多复杂的重复工作,只关心数据的获取与操作。 准备工作 需要有相应的环境和模块: Ubuntu 14.0...
    99+
    2022-06-04
    特殊字符 方法 Python
  • PHP中运用路由中间件实现请求的过滤与处理
    随着互联网技术的快速发展和应用的普及,网站和应用的开发也变得愈发复杂。为了提高开发效率和代码的可维护性,开发者们通过引入中间件的概念来处理请求的过滤与处理。在PHP中,使用路由中间件可以轻松实现请求的过滤与处理,并且能够高度定制、灵活应对各...
    99+
    2023-10-21
    PHP 路由中间件 请求过滤
  • Vue监听使用方法和过滤器实现
    目录前言过滤器局部过滤器代码全局过滤器watch监听简单监听复杂监听前言 今天是自学VUE整理知识点的第四天呢,今天整理一下过滤器,watch监听的知识点 过滤器 过滤器的作用:为页...
    99+
    2024-04-02
  • 如何使用Java缓存HTTP请求日志?详解实现步骤
    当今互联网时代,HTTP请求日志已经成为了系统监控和性能优化的重要指标之一。为了更好地跟踪和分析系统运行状态,我们需要对HTTP请求日志进行缓存处理。本文将详细介绍如何使用Java缓存HTTP请求日志,包括实现步骤和演示代码。 一、缓存HT...
    99+
    2023-07-24
    http 日志 缓存
  • 利用java实现发送http或get请求的方法有哪些
    这篇文章将为大家详细讲解有关利用java实现发送http或get请求的方法有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、第一种方式,通过HttpClient方式,代码如下:publ...
    99+
    2023-05-31
    java http请求 get请求
  • 你知道如何使用PHP编写优秀的API算法,以实现HTTP请求?
    PHP作为一种开源的脚本语言,被广泛应用于Web开发领域。PHP提供了强大的API开发支持,以便开发人员可以轻松地创建高效且易于使用的API。本文将介绍如何使用PHP编写优秀的API算法,以实现HTTP请求。 1.了解API 在开始介绍AP...
    99+
    2023-07-02
    api 编程算法 http
  • HTTP请求时,如何使用PHP实现同步性并记录日志?
    在Web开发中,我们经常需要使用HTTP请求来获取或提交数据。而在PHP中,我们可以使用cURL库来发送HTTP请求。但是,如果我们需要在一个脚本中发送多个HTTP请求,并且需要等待所有请求都完成后才能进行下一步操作,就需要使用同步性。同...
    99+
    2023-09-03
    同步 http 日志
  • 如何使用Python实现高效的HTTP请求和二维码生成?
    随着现代互联网的迅速发展,HTTP请求已成为了现代应用开发的重要组成部分之一。同时,二维码的应用也越来越广泛,如何快速、高效地使用Python实现HTTP请求和二维码生成,成为了许多开发者需要掌握的技能。 本文将介绍如何使用Python实现...
    99+
    2023-09-21
    http 二维码 并发
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作