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

如何检查SpringRestController未知的查询参数?

茅高卓
2023-03-14

我有一个基本的rest控制器,可以获取参数。

如果查询字符串包含我没有定义的参数,我如何拒绝连接?

@RestController
@RequestMapping("/")
public class MyRest {
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
    @ResponseBody
    public String content(@PathVariable id, @RequestParam(value = "page", required = false) int page) {
        return id;
    }
}

localhost:8080/myapp/123?Paggge=1

当前,在调用此url时,只使用id执行该方法,而忽略未知的pagge参数。一般来说,这很好,但我如何验证它们,以防返回HTTP状态码?

共有3个答案

夔修伟
2023-03-14

在方法参数中添加HttpServletRequest请求

String query = request.getQueryString()

并验证它。

越国源
2023-03-14

在您的控制器方法中,您可以包含一个类型为@recestParam Map的参数

@RestController
@ExposesResourceFor(Widget.class)
@RequestMapping("/widgets")
public class WidgetController {


@Autowired
ArgsChecker<Widget> widgetArgsChecker;

    @RequestMapping(value = "", method = RequestMethod.GET, produces = {"application/hal+json"})
    public HttpEntity<PagedResources<WidgetResource>> findAll(@RequestParam @ApiIgnore Map<String, String> allRequestParams, Pageable pageable, PagedResourcesAssembler pageAssembler) {
        Set<String> invalidArgs = widgetArgsChecker.getInvalidArgs(allRequestParams.keySet());
        if (invalidArgs.size() > 0) {
            throw new QueryParameterNotSupportedException("The user supplied query parameter(s) that are not supported: " + invalidArgs + " . See below for a list of query paramters that are supported by the widget endpoint.", invalidArgs, widgetArgsChecker.getValidArgs());

        }

ArgsChecker可以定义如下:

import com.widgetstore.api.annotation.Queryable;
import lombok.Getter;
import org.apache.commons.lang3.reflect.FieldUtils;

import java.lang.reflect.Field;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;

public class ArgsChecker<T> {
    @Getter
    private Set<String> validArgs;

    private ArgsChecker(){};

        public ArgsChecker(Class<T> someEntityClass){
    validArgs= FieldUtils.getFieldsListWithAnnotation(someEntityClass,Queryable.class)
            .stream()
            .map(Field::getName)
            .collect(Collectors.toSet());
    validArgs.add("page");
    validArgs.add("size");

}

public Set<String> getInvalidArgs(final Set<String> args){
    Set<String> invalidArgs=new HashSet<>(args);
    invalidArgs.removeAll(validArgs);
    return invalidArgs;



    }
   }

,它使用反射来查找用“@Queryable”注释注释的字段:

package com.widgetstore.api.annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Queryable {
} 

现在标记域类的字段,您希望使用该注释查询这些字段:

@Getter
@Setter
public class Widget {
    @Queryable 
    private String productGuid;
    @Queryable 
    private String serialNumber;

    private String manufacturer;

现在确保在应用程序启动时创建ArgsChecker bean:

@SpringBootApplication
public class StartWidgetApi{

public static void main(String[] args){
    SpringApplication.run(StartWidgetApi.class);
}


@Bean(name="widgetArgsChecker")
public ArgsChecker<Widget> widgetArgsChecker(){
    return new ArgsChecker<Widget>(Widget.class);
}

//Other ArgsCheckers of different types may be used by other controllers.
@Bean(name="fooArgsChecker")
public ArgsChecker<Foo> fooArgsChecker(){
    return new ArgsChecker<Foo>(Foo.class);
 }
}

最后,

定义@ControllerAdvice类,该类将侦听应用程序引发的异常:

package com.widgetstore.api.exception;


import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

@ControllerAdvice
@RequestMapping(produces = "application/json")
@ResponseBody
public class RestControllerAdvice {


    @ExceptionHandler(QueryParameterNotSupportedException.class)
    public ResponseEntity<Map<String,Object>> unrecogonizedParameter(final QueryParameterNotSupportedException e){
        Map<String,Object> errorInfo = new LinkedHashMap<>();
        errorInfo.put("timestamp",new Date());
        errorInfo.put("errorMessage",e.getMessage());
        errorInfo.put("allowableParameters",e.getValidArgs());
        return new ResponseEntity<Map<String, Object>>(errorInfo,HttpStatus.BAD_REQUEST);
    }



}

,并定义QueryParameterNotSupportedException:

import lombok.Getter;

import java.util.Set;

@Getter
public class QueryParameterNotSupportedException extends RuntimeException{
    private Set<String> invalidArgs;

    private Set<String> validArgs;

    public QueryParameterNotSupportedException(String msg, Set<String> invalidArgs, Set<String> validArgs){
        super(msg);
        this.invalidArgs=invalidArgs;
        this.validArgs=validArgs;
    }

}

现在,当用户点击/widget时?未知领域=abc

 {"timestamp": 2017-01-10'T'blahblah, "errorMessage": "The user supplied query parameter(s) that are not supported: ["someUnknownField","someOtherField"]. See below for a list of allowed query parameters." ,
"allowableParameters": ["productGuid","serialNumber"]
}

梁丘赞
2023-03-14

您可能会收到所有参数,并以您想要的方式进行处理。引用spring文档:

在地图上使用@刚体注解时

 类似资料:
  • 问题内容: 这是我的简单表格: 这是我的Express.js /Node.js代码: 我试过或或,等等。它们都不起作用。他们都回来了。 当我更改为Get呼叫时,它可以工作,所以..有什么想法吗? 问题答案: 事情已经改变了再次启动 快速4.16.0 ,您现在可以使用与就像在 快车3.0 。 从 Express 4.0到4.15,* 这是不同的: * 然后: 其余的就像在 Express 3.0中一

  • 问题内容: 这是我的简单表格: 这是我的Express.js/Node.js代码: 我尝试过或或,等等。它们都不起作用。他们都回来了。 当我更改为Get呼叫时,它可以工作,所以..有什么想法吗? 问题答案: 事情已经改变了再次启动快速4.16.0,您现在可以使用与就像在快车3.0。 从Express 4.0到4.15,这是不同的: 然后: 其余的就像在Express 3.0中一样 : 首先,您需要

  • 本文向大家介绍Android 检索查询参数,包括了Android 检索查询参数的使用技巧和注意事项,需要的朋友参考一下 示例 如果用户点击一个linkto http://www.example.com/map?param1=FOO&param2=BAR,那么param1这里将有一个价值"FOO"和param2将有一个价值"BAR"。

  • 我正试图弄清楚如何在OpenAPI中记录我的两个查询参数。 null 键是一个关联数组,可以包含API中的资源名称集合列表。分配给每个筛选项的值是单个id或逗号分隔的id列表。 排序 For排序也遵循JSON:API建议,因此如下所示: null 例如,我不确定是否可以指定过滤器键是一个关联数组,或者它接受逗号分隔的ID列表。对于排序几乎同样的问题:如何表示逗号分隔的排序字段列表?

  • 我正在尝试从一个节点传递一个API,其中字符包含'&'(例如:AT&T),在url查询参数中,我没有得到与AT&T相关联的值,而是它返回的空字符串。有人知道这事吗? http://localhost:3000/account?accountName=AT&T []

  • 问题内容: 我已将Netbeans设置为在我的Java代码中显示未经检查的警告,但是我无法理解以下几行的错误: 给出: 方法来源: 到底出了什么问题,我想如何解决呢?因为我认为在代码中留下未经检查的警告不是一个好主意? 忘了提,但我使用的是Java 7。 编辑 :我现在也看到该方法具有以下内容: 问题答案: 如上面的janoh.janoh所述,Java中的varargs只是数组的语法糖,以及在调用