程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

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

发布于2021-11-28 10:29     阅读(914)     评论(0)     点赞(11)     收藏(0)


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

我的动机如下:

  • 清晰:我不希望客户对请求参数进行粗指,但仍然返回结果(就像没有提供请求参数一样)
  • 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

但我希望我的应用程序注意到还有其他未计算的请求参数,并返回一个 ERROR 响应代码。

/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();
    [...]
}


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/337846/ab3482fd5ddfd2538f3a/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

11 0
收藏该文
已收藏

评论内容:(最多支持255个字符)