springboot拦截器校验或鉴权导致Required request body is missing解决方法

纯笔记:

例子总共有5个JAVA文件


DemoApplication.java(springbooy启动类)
XXXFilter.java
XXXHandler.java
XXXRequestWrapper.java
XXXWebMvc.java

出现这个错误的原因参考:https://www.cnblogs.com/yepei/p/7011081.html

大概思路:重新定义一个HttpServletRequestWrapper来代替request,里面的流复制保存,就不会丢失


DemoApplication.java
===

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@SpringBootApplication
@ServletComponentScan // 使filter有效
@RestController
public class DemoApplication {

    @PostMapping("/h")
    public Object h(@RequestParam("file") MultipartFile multipartFile){
        return multipartFile.getOriginalFilename();
    }
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}


===


XXXRequestWrapper.java
===
package com.example.demo;

import org.springframework.util.StreamUtils;

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
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;

public class XXXRequestWrapper extends HttpServletRequestWrapper {

    private byte[] requestBody = null;//用于将流保存下来

    public XXXRequestWrapper(HttpServletRequest request) {
        super(request);
        try {
            requestBody = StreamUtils.copyToByteArray(request.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        if (requestBody == null) {
            requestBody = new byte[0];
        }
        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(requestBody);
        return new ServletInputStream() {

            @Override
            public int read() throws IOException {
                return byteArrayInputStream.read();
            }

            @Override
            public void setReadListener(ReadListener listener) {
            }

            @Override
            public boolean isReady() {
                return false;
            }

            @Override
            public boolean isFinished() {
                return false;
            }
        };
    }

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

}
===


XXXFilter.java
===
package com.example.demo;

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

@WebFilter(filterName = "xxxFilter", urlPatterns = "/*")
public class XXXFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        ServletRequest requestWrapper = new XXXRequestWrapper(httpServletRequest);
        filterChain.doFilter(requestWrapper, servletResponse);
    }

    @Override
    public void destroy() {
    }
}
===


XXXHandler.java
===
package com.example.demo;

import org.apache.commons.io.IOUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
public class XXXHandler implements HandlerInterceptor{

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
        System.out.println("======================");
        XXXRequestWrapper requestWrapper=new XXXRequestWrapper(request);
        //String s = IOUtils.toString(requestWrapper.getInputStream(), "utf-8");
        //System.out.println(s);
        return true;
    }
}

===


XXXWebMvc.java
===
package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class XXXWebMvc implements WebMvcConfigurer{

    @Autowired
    private XXXHandler xxxHandler;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(xxxHandler).addPathPatterns("/**");
    }
}

===


OK...

猜你喜欢

转载自blog.csdn.net/u013845177/article/details/88633194
今日推荐