当前位置: 首页 > 知识库问答 >
问题:

Spring MVC能严格地将查询字符串映射到请求参数吗?

何雅惠
2023-03-14

我的动机如下:

  • 清晰度:我不希望客户端对请求参数进行粗指处理,但仍然返回结果(就像没有提供请求参数一样)
  • HTTP缓存:我希望限制服务的有效HTTP路由数,以便HTTP缓存(即varnish)更好地工作

例如,我可能有一个简单的控制器,它被配置为接受一个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

共有1个答案

牛迪
2023-03-14

拦截器可以完成这项工作。您需要实现一个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();
    [...]
}
 类似资料:
  • 问题内容: 我正在使用Commons HttpClient对Spring servlet进行http调用。我需要在查询字符串中添加一些参数。因此,我执行以下操作: 但是,当我尝试使用读取servlet中的参数时 它返回null。实际上parameterMap是完全空的。当我在创建HttpGet请求之前将参数手动添加到url时,该参数在servlet中可用。当我使用附加了queryString的UR

  • 我有一个查询字符串,可以是: 编辑:参数值的长度可以大于2 有人知道在String.ReplaceAll([regex],[replace])中使用什么好的regex表达式吗?

  • 问题内容: 我有一个HTTP客户端(目前)的Node.js应用程序。所以我在做: 这似乎是完成此任务的一种好方法。但是,我有些沮丧,我必须执行此步骤。这应该由一个公共库封装,但是我还没有看到它存在于node的库中,而且我不确定哪个标准的npm包可以完成它。有没有一种合理使用的更好的方法? url.format方法节省了构建自己的URL的工作。但理想情况下,请求的级别也应高于此级别。 问题答案: 检

  • 问题内容: 服务类具有一个接受多个参数的操作。这些参数作为查询参数传递给服务调用。 这些参数的列表正在增长,因此我想将它们放入包含所有这些参数的单个bean中。 你会怎么做?这有可能吗? 问题答案: 您可以使用。 在您的资源中,您只需要使用。 提供者将被自动调用。

  • 我从客户端发送了以下查询字符串参数 在REST服务器中,我如何接收上述格式并正确分配给每个类别? 更新1 参数的值为 {_=[1437904506062],{“take”:75,“skip”:0,“page”:1,“pageSize”:75、“filter”:{“logic”:“and”,“filters”:〔{“field”:“prodCode”,“operator”:“eq”,“value”:

  • 我的目标是所有下面的URI都应该工作 https://rest/xyz?sort=name https://rest/xyz?排序=名称 https://rest/xyz?过滤器=名称=值 https://rest/xyz?Filter=name=value 为了实现这一点,我创建了自定义过滤器,该过滤器覆盖了传递给过滤器链的HttpServlet请求。以下是此方法的链接: http://foru