这里不管是post提交还是get提交,参数不管放在url还是form-data、还是以json的形式放在请求体,都能正常获取到且不影响controller使用。这里以获取参数name为例子
- 过滤器
@Component
public class MyFilter 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;
String header = ((HttpServletRequest) servletRequest).getHeader("Content-Type");
if(header != null && "multipart/form-data".equals(header.split(";")[0])) {
}else {
requestWrapper = new MyHttpServletRequestWrapper((HttpServletRequest) servletRequest);
}
if (requestWrapper == null) {
filterChain.doFilter(servletRequest, servletResponse);
}else {
filterChain.doFilter(requestWrapper,servletResponse);
}
}
@Override
public void destroy() {
}
}
- 自定义请求包装类
public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper {
private final String body;
public MyHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
InputStream is = null;
StringBuilder sb = null;
try {
is = request.getInputStream();
sb = new StringBuilder();
byte[] b = new byte[4096];
for (int n ; (n = is.read(b)) != -1;)
{
sb.append(new String(b, 0, n));
}
} finally {
if(is != null) {
is.close();
}
}
body = sb.toString();
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream bais = new ByteArrayInputStream(body.getBytes());
return 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 bais.read();
}
@Override
public void close() throws IOException {
System.out.println(1);
bais.close();
}
};
}
public String getBody() {
return body;
}
}
- 拦截器
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String method = request.getMethod();
String header = request.getHeader("Content-Type");
System.out.println(header);
if("GET".equals(method) || "multipart/form-data".equals(header.split(";")[0])) {
String name = request.getParameter("name");
System.out.println(name);
}else if("POST".equals(method)) {
MyHttpServletRequestWrapper requestWrapper = new MyHttpServletRequestWrapper(request);
String body = requestWrapper.getBody();
Map map = JSON.parseObject(body, Map.class);
Object name = map.get("name");
System.out.println(name);
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
- 拦截器配置
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Autowired
MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor).addPathPatterns("/**");
}
}