gpt4 book ai didi

java - Spring MVC 能否将查询字符串严格映射到请求参数?

转载 作者:行者123 更新时间:2023-11-30 08:10:59 25 4
gpt4 key购买 nike

有没有办法配置 Spring-MVC 严格接受已知的查询字符串列表?我正在寻找验证提交的查询字符串——如果请求有额外的查询字符串参数,我想知道它并返回 404。

我的动机如下:

  • 清晰:我不希望客户对请求参数指手画脚,但仍会返回结果(就好像没有提供请求参数一样)
  • HTTP 缓存:我想限制我的服务的有效 HTTP 路由数量,以便 HTTP 缓存(即清漆)更好地工作

例如,我可能有一个简单的 Controller ,配置为接受一个RequestParam:

@RequestMapping(value = "/selective_route", method = RequestMethod.GET)
public String printTest(@RequestParam String test) {
return test;
}

我现在希望我的应用接受请求并返回 OK 响应:

/selective_route?test=foo

但我希望我的应用注意到有额外的未说明的请求参数,并返回错误响应代码。

/selective_route?test=foo&someotherparam=somethingelse

最佳答案

拦截器可以完成这项工作。您需要实现 HandlerInterceptor 并将其附加到框架。它将在每个传入请求时被调用。

执行验证的一种方法可能是在拦截器本身内保留一个有效查询字符串列表,并根据传入请求检查它们,例如使用正则表达式。

一种更快更简洁的方法是在 @RequestMapping 旁边使用自定义注释。此注释将采用一个参数,同样是一个正则表达式或一个包含允许字段名称的数组。

这种注解可以声明如下:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface YourAnnotationName {
public String regularExpression() default "";
}

您可以使用以下代码从拦截器中检索方法及其注释:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// Apply only to HandlerMethod
if(!(handler instanceof HandlerMethod))
return true;

// Get method and annotation instance
HandlerMethod method = (HandlerMethod) handler;
YourAnnotationName annotation = method.getMethodAnnotation(YourAnnotationName.class);

// Method not annotated no need to evalutate
if(annotation == null)
return true;

// Validation
String queryString = request.getQueryString();
[...]
}

关于java - Spring MVC 能否将查询字符串严格映射到请求参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31364657/

25 4 0
文章推荐: java - RESTEasy - 某些方法 URL 地址不起作用
文章推荐: java - 将 String、ArrayList 等对象添加到 List