spring安全性和多部分


问题内容

问题是当我添加文件上传时,过滤器无法在请求中找到令牌(我认为原因是请求具有多部分类型)

我正在使用CommonsMultipartResolver

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="100000000"/>
</bean>

和简单的弹簧控制器来接收文件 @RequestParam("pic") MultipartFile pic

为了解决我修改的问题,如果请求具有多部分类型,则进行令牌检索:

if(request.getContentType().contains("multipart/form-data")){ 
  List<FileItem> items = new ServletFileUpload(new  DiskFileItemFactory()).parseRequest((HttpServletRequest) request);
    for (FileItem item : items) {
               if (item.isFormField() &&  item.getFieldName().equals("token")) {
                return  item.getString();
               }
       }
    }

最终,在此修改之后,身份验证可以工作,但是在控制器MultipartFile中不发送更多消息,因此它引发异常,即请求中没有参数。我如何解决此问题以能够通过令牌身份验证接收文件?


问题答案:

我认为您需要添加MultipartFilter。如何执行此操作取决于所使用的配置样式。在我们的例子中,我们在方法中添加了以下几行WebApplicationInitializer.onStartup()

    FilterRegistration.Dynamic multipartFilter = servletContext.addFilter("multipartFilter", new MultipartFilter());
    multipartFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), false, "/*");