网站开发器,贸易网站开发,常州专业网站建设公司咨询,学会网站建设的重要性前言#xff1a;
最近在项目中用到了Excel模板导入功能#xff0c;但是在测试阶段用Postman测试时#xff0c;通过Post请求#xff0c;传到后端的File一直为null。其中前端传参和请求都没问题#xff0c;后端的接参也没问题#xff0c;问题出在过滤器的复用上。
问题场…前言
最近在项目中用到了Excel模板导入功能但是在测试阶段用Postman测试时通过Post请求传到后端的File一直为null。其中前端传参和请求都没问题后端的接参也没问题问题出在过滤器的复用上。
问题场景
前端上传模板导入excel做批量新增。入参为File。
问题原因
是项目中加了过滤器导致的过滤器是为了request重复使用但是文件请求类型multipart/form-data和其他类型不一样所以过滤器没法处理导致进不了Controller。
原过滤器配置
Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { ServletRequest requestWrapper null; if (requestinstanceof HttpServletRequest) { requestWrapper new RequestWrapper((HttpServletRequest) request); } if (null requestWrapper) {filterChain.doFilter(servletRequest, response);} else {filterChain.doFilter(requestWrapper, response);}
}修改过滤器将其改成兼容模式
Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest (HttpServletRequest) servletRequest;String contentType httpServletRequest.getContentType();//判断请求类型if (contentType null) {//表单请求filterChain.doFilter(servletRequest, servletResponse);return;} else if (contentType.startsWith(multipart/)) {//文件上传类型filterChain.doFilter(servletRequest, servletResponse);return;} else if (contentType.startsWith(application/json)) {//json请求ServletRequest requestWrapper null;if (servletRequest instanceof HttpServletRequest) {requestWrapper new RequestWrapper((HttpServletRequest) servletRequest);}if (null requestWrapper) {filterChain.doFilter(servletRequest, servletResponse);} else {filterChain.doFilter(requestWrapper, servletResponse);}}}问题排查: 网上的解决方式众说纷云都是再说后端入参的接参不对。要加RequestParam(“file”)或者RequestPart(“file”) 再或者 RequestBody。其实这些都没有用而且 加上RequestParam(“file”)注解就报Requied request part ‘file’ is not present错误。如果在确定前端正确传参后端正确接参的情况下。依然 为null。很容易就联想到是中间联络初出问题了那就在过滤器和拦截器之前找问题。一看过滤器没有兼容multipart/form-data就定位了。这种问题不设置过滤器是复现不出来的一旦加了没有做兼容就会有问题。
用两张图说明
Interceptor拦截器Filter过滤器给大家科普下万一不知道名词是啥呢。