首页 > 其他分享 >springboot 统一处理请求非法参数

springboot 统一处理请求非法参数

时间:2024-02-27 17:58:43浏览次数:29  
标签:body 请求 非法 param IOException Override new public springboot

通过拦截器和过滤器实现,话不多说上代码。

1、重写HttpServletRequestWrapper读取body里面的内容。

public class RequestWrapper extends HttpServletRequestWrapper {
    private final String body;

    public RequestWrapper(HttpServletRequest request) {
        super(request);
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader bufferedReader = null;
        InputStream inputStream = null;
        try {
            inputStream = request.getInputStream();
            if (inputStream != null) {
                bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                char[] charBuffer = new char[128];
                int bytesRead = -1;
                while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                    stringBuilder.append(charBuffer, 0, bytesRead);
                }
            } else {
                stringBuilder.append("");
            }
        } catch (IOException ex) {

        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        body = stringBuilder.toString();
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
        ServletInputStream servletInputStream = new ServletInputStream() {
            @Override
            public boolean isFinished() {
                return false;
            }
            @Override
            public boolean isReady() {
                return false;
            }
            @Override
            public void setReadListener(ReadListener readListener) {
            }
            @Override
            public int read() throws IOException {
                return byteArrayInputStream.read();
            }
        };
        return servletInputStream;

    }

    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new InputStreamReader(this.getInputStream()));
    }

    public String getBody() {
        return this.body;
    }

}
HttpServletRequestWrapper

2、因为reque里面的内容只能读取一次,需要重写回去。增加ChannelFilter

import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@Component
@WebFilter(urlPatterns = "/*",filterName = "channelFilter")
public class ChannelFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        ServletRequest requestWrapper = null;
        if(servletRequest instanceof HttpServletRequest) {
            requestWrapper = new RequestWrapper((HttpServletRequest) servletRequest);
        }
        if(requestWrapper == null) {
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            filterChain.doFilter(requestWrapper, servletResponse);
        }
    }

    @Override
    public void destroy() {

    }
}
ChannelFilter

3、增加拦截器,获取请求的body

@Component
public class ParamInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         String method = request.getMethod();
         String contentType = request.getContentType() == null ? "" : request.getContentType();
        if (HttpMethod.POST.name().equals(method) && !contentType.equals(MediaType.MULTIPART_FORM_DATA_VALUE)) {
            RequestWrapper requestWrapper = new RequestWrapper(request);
            String body = requestWrapper.getBody();
            testParam(body);
        }
        return true;
    }


    private void testParam(String param){
        try {
            param = param.replace(" ", "");
            param = param.replace("&", "");
            param = param.replace("#", "");
            param = param.replace(" ", "");
            param = param.replace("\"\"", "");
            if (param.toLowerCase().contains("<script")
                    || param.contains("<")
                    || param.contains(">")
                    || param.toLowerCase().contains("<html")
                    || param.toLowerCase().contains("<header")
                    || param.toLowerCase().contains("alert")
                    || param.toLowerCase().contains("console")
            ) {
                throw new BusinessException("500", "非法参数!");
            }
        } catch (Exception ex) {
            if (ex instanceof BusinessException) {
                throw new BusinessException("500", ((BusinessException) ex).getMsg());
            }
        }
    }
}
ParamInterceptor

4、拦截器配置(略)

5、过滤器配置,在启动类上增加@ServletComponentScan注解

标签:body,请求,非法,param,IOException,Override,new,public,springboot
From: https://www.cnblogs.com/rolayblog/p/18037400

相关文章

  • 云服务器转发动态请求(uwsgi+django项目)
    路飞后台部署本地操作上线前配置prod.py:上线的配置文件,内容拷贝dev.py,前身就是settings.py#关闭测试环境DEBUG=FalseALLOWED_HOSTS=['39.99.192.127'#公网ip地址]CORS_ORIGIN_ALLOW_ALL=True#允许所有跨域#静态文件配置:上线后还有额外配置,见下方......
  • springboot2.6开始禁止循环依赖了
    参考文章: https://mp.weixin.qq.com/s?__biz=MzI0MTUwOTgyOQ==&mid=2247497189&idx=1&sn=0f03cdafad9bacef66c64a490b85ff23&scene=21#wechat_redirect使用了SpringBoot2.6及以上版本的,如果要允许循环依赖,可以作如下设置:方案二:允许循环引用此方案更像是绕过问题而非解决问题......
  • SpringCloud和SpringBoot的版本依赖该怎么选择
    前言SpringCloud是一个基于SpringBoot的微服务框架,用于构建和管理分布式系统的各个组件。它提供了一套完整的解决方案,包括服务注册与发现、配置管理、负载均衡、熔断器、消息总线、数据流等功能。SpringCloud2023为当前SpringCloud的最新版本迭代,基于Spring6和Springboot3以......
  • Web页面请求历程
    本文仅对Web页面请求历程进行简单的介绍,由于作者初学计算机网络,同时也没有学习图论的知识,若有不妥之处还请指出.一、准备DHCP、UDP、IP和以太网以我的笔记本为例,我的笔记本与网络连接,此时笔记本没有ip地址,所以无法进行操作先获取ip地址,笔记本的操作系统生成一个DHCP请求......
  • SpringBoot/Java中OCR实现,集成Tess4J实现图片文字识别
    场景TesseractTesseract是一个开源的光学字符识别(OCR)引擎,它可以将图像中的文字转换为计算机可读的文本。支持多种语言和书面语言,并且可以在命令行中执行。它是一个流行的开源OCR工具,可以在许多不同的操作系统上运行。https://github.com/tesseract-ocr/tesseractTess4JTess4......
  • 前端get请求传递数组型参数时的处理方式
    场景后端get接口设计接受数组型查询参数时,只接受重复的query格式,如arr=[1,2,3],那么在query里的参数格式需要是a=1&a=2&a=3前端get请求直接传数组会默认处理为a[]=1&a[]=2&a[]=3,后端无法识别(恼),传json字符串和join拼接后端都不同意如果直接在url中做参数拼接,实在是又蠢又费力......
  • Springboot的starter有什么用以及如何自定义一个starter
    SpringBoot的starter是什么我们都知道SpringBoot的目的就是为了让开发者尽可能的减少项目配置专注于程序代码的编写,而'starter'就是SpringBoot简便开发、自动装配的具体实现。以‘mybatis-spring-boot-starter’为例:<dependency><groupId>org.mybatis.spring.boot<......
  • springboot3 security6.0.2 session timeout 方案
    方案1packagejp.co.toppan.dch.web.core.security;importjakarta.servlet.ServletException;importjakarta.servlet.http.Cookie;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletResponse;importorg.apache.commons.lang3.S......
  • springboot项目启动失败
    对于springboot项目默认启动的时候,终端日志什么错误信息都没有打印,直接就启动失败了,就看到这么一句提示springbootProcessfinishedwithexitcode1这样我们确实不知道失败原因在哪里,我们可以这样调试,把错误找出来。在启动类里面加上trycatch语句 我们接着启动项目,从......
  • 利用正则与状态机解析HTTP请求报文,实现处理静态资源的请求
    要使用正则和状态机来解析HTTP请求报文,首先需要理解HTTP请求报文的基本结构。一个典型的HTTP请求报文如下:GET/index.htmlHTTP/1.1Host:www.example.comUser-Agent:Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/58.0.3029.110......