纯笔记:
例子总共有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...
版权声明:本文为u013845177原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。