Spring MVC, проверьте, если запрос имеет повторяющиеся параметры - PullRequest
0 голосов
/ 14 сентября 2018

У нас есть многочастный пост-запрос, сопоставленный с методом ниже.

fun post(@RequestParam(value = "photo", required = true) photo: Array<MultipartFile>,
         @Valid person: Person)

class Person {
  int id,
  String name
}

В приведенном ниже примере в запросе содержится более одного name параметра

localhost:8080/api
post body:
id:101
name: Jhon
name: Jhonny

Есть ли способотклонить запрос, если он содержит повторяющиеся параметры?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

нет, будет массив с именем 'name' или строка, содержащая два имени, это выглядит так {id:101,name:'Jhon,Jhonny'} или {id:101,name:['Jhon','Jhonny']} который определяется тем, как его получить если имя является строкой, результатом будет «Jhon, Jhonny». если имя является строковым массивом, результатом будет [[Jhon], 'Jhonny'].

0 голосов
/ 14 сентября 2018

Вы можете добавить HttpServletRequest в список аргументов метода обработчика, проверить его и вернуть ReponseEntity.badRequest().build(), если есть несколько вхождений одних и тех же параметров.

@GetMapping
public ResponseEntity handlerMethod(HttpServletRequest request) {

    if (request.getParameterValues("name").length > 1) {
        return ResponseEntity.badRequest().build();
    }

    return ResponseEntity.ok().build();
}

Если вы хотите сделать это для всего приложения, вы можете определить фильтр:

@Component
class DuplicateRequestParameterFilter extends OncePerRequestFilter {

    Enumeration<String> parameters = request.getHeaderNames();
    while (parameters.hasMoreElements()) {
        if (request.getParameterValues(parameters.nextElement()).length > 1) {
            response.sendError(HttpServletResponse.SC_BAD_REQUEST);
        }
    }

    filterChain.doFilter(request, response);
}
...