spring - 验证可选字段的请求参数名称 - spring boot
问题描述
如果您有这样描述的端点:
@GetMapping("/hello")
public String sayHello(@RequestParam(name= "my_id", required=false) myId, @RequestParam(name= "my_name") myName){
// return something
}
问题:
该端点的消费者可以在请求中发送无效的参数名称;
/hello?my_name=adam&a=1&b=2
它会正常工作。
目标:
能够使用正确的方法来验证可选的请求参数名称。
实际解决方案:
我已经实现了一个解决方案(对我来说这不是正确的解决方案),我扩展了 aHandlerInterceptorAdapter
并将其注册到WebMvcConfigurer
:
/**
*
* Interceptor for unknown request parameters
*
*/
public class MethodParamNamesHandler extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
ArrayList<String> queryParams = Collections.list(request.getParameterNames());
MethodParameter[] methodParameters = ((HandlerMethod) handler).getMethodParameters();
Map<String, String> methodParametersMap = new HashMap<>();
if(Objects.nonNull(methodParameters)){
methodParametersMap = Arrays.stream(methodParameters)
.map(m -> m.getParameter().getName())
.collect(Collectors.toMap(Function.identity(),Function.identity()));
}
Set<String> unknownParameters = collectUnknownParameters(methodParametersMap, queryParams);
if(!CollectionUtils.isEmpty(unknownParameters)){
throw new InvalidParameterNameException("Invalid parameters names", unknownParameters);
}
return super.preHandle(request,response,handler);
}
/**
* Extract unknown properties from a list of parameters
* @param allParams
* @param queryParam
* @return
*/
private Set<String> collectUnknownParameters(Map<String, String> allParams, List<String> queryParam){
return queryParam.stream()
.filter(param -> !allParams.containsKey(param))
.collect(Collectors.toSet());
}
}
缺点:
该解决方案的缺点是它基于方法参数,它将采用名称myId
而不是采用my_id
,这可以通过将大写单词转换为蛇形来解决;但这不是一个好的解决方案,因为您可以拥有这样的东西:sayHello(@RequestParam(name= "my_id", required=false) anotherName)
。
问题: 是否有适当的方法来实现这一目标?
解决方案
推荐阅读
- javascript - 在三个js中用颜色填充线条之间的区域
- python - 为什么,在浮点运算中,0.9999999999999999 !=1 但 0.9999999999999999 + 1 == 2
- php - 为前 3 个帖子添加单独的课程 - Wordpress
- spring - 不查询同一张表时如何使用@formula
- dynamics-crm - If 语句获取不同的属性 - fetchXML
- ios - AR 参考组 - 图像的直方图狭窄或分布不均
- corda - 如何在 Corda 中为具有不同 jar 的不同节点创建多个流?
- html - CSS:根据文本宽度显示内联或块 - 无 javascript
- jenkins - Jenkins - 缺少启动方法“通过 SSH 启动从代理”
- javascript - 为什么 vue-property-decorator @Watch 在路由推送后不起作用?