访问Spring过滤器多部分Servlet的请求和参数

问题描述 投票:0回答:1

我正在编写过滤器,需要访问MultiPart消息的各个部分-包括参数和文件。目前,以下示例代码仅向我提供标头和常规请求信息,对于任何正文/内容请求(例如, getParameter或getPart。

public class SampleFilter implements Filter {

    @Override
    public void doFilter (ServletRequest req, ServletResponse resp, FilterChain filterchain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

        log.info(request.getContentType());  //Works OK
        log.info(request.getHeader("X-Some-Header"));  //Works OK
        log.info(String.valueOf(request.getContentLength()));  //Works OK
        log.info(request.getParameter("some-form-field"));  //Does NOT work

        for (Part p : request.getParts())  //Does NOT work
        {
            log.info("Part:" + p.getName()); 
        }
}

到目前为止,我发现的大多数示例都涉及普通控制器中的多部分(请参阅下文,我已经知道了)-我正在专门寻找Filter或HandlerInterceptor或类似的前置控制器挂钩。

我有一个成功实现MultiPart功能的RestController,但是不确定如何将此方法或类似方法应用于Filter:

@RestController
@RequestMapping (value = {"/**"})
@Slf4j
public class SampleController {

    @RequestMapping(value = {"/**"}, method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    @ResponseBody
    public ResponseEntity<String> SampleMultipartController(@RequestHeader Map<String, String> httpheaders,
                                                        @RequestParam("param1") String param1,
                                                        @RequestParam("param2") List<String> param2,
                                                        @RequestParam ("file") List<MultipartFile> files) throws IOException {

//etc...

而且我定义了Commons multipartResolver:

@Bean(name = "multipartResolver")
    public CommonsMultipartResolver multipartResolver() {
        final int MAX_UPLOAD_SIZE = (100 * 1024 * 1024);
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
        multipartResolver.setMaxUploadSize(MAX_UPLOAD_SIZE + MAX_UPLOAD_SIZE/5);
        multipartResolver.setMaxUploadSizePerFile(MAX_UPLOAD_SIZE);
        multipartResolver.setMaxInMemorySize(MAX_UPLOAD_SIZE/100);
        return multipartResolver;
    }
java spring spring-boot spring-mvc servlet-filters
1个回答
0
投票

我会在doFilter中做类似的事情:

@Override
public void doFilter (ServletRequest req, ServletResponse resp, FilterChain filterchain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) resp;

    URI uri = new URI(request.getRequestURI());

    Map<String, String> map = Arrays.stream(uri.getRawQuery().split("&"))
            .collect(Collectors.toMap(param -> param.split("=")[0], param -> param.split("=")[0]));

}

然后您在地图中有了参数。

© www.soinside.com 2019 - 2024. All rights reserved.