SpringBoot get请求特殊字符处理

文章讲述了在进行测试时,由于输入框中的特殊字符(如中括号)导致GET请求出错,原因是Tomcat遵循URI编码标准RFC3986,不允许某些字符。解决方案包括前端对特殊字符进行转译或在SpringBoot后端配置中解除Tomcat的拦截,允许特定的特殊字符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

起因:测试在输入框[](中括号),然后get请求报错
报错:Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
分析:本地Swagger请求后台无错误。和前段联调发现该错误。
错误原因:在tomcat中是遵循的是URI编码标准(RFC 3986),该规范只允许包含 a-zA-Z 0-9 - _ . ~ 以及所有保留字符。所以我们需要放行。
解决办法:
1.前端转译,比如空格在url地址中就是20%
2.后端tomcat解除拦截
以下是springboot解决方式,如果是spring3.0则修改tomcat配置

@Configuration
public class TomcatConfig {

    @Bean
    public ConfigurableServletWebServerFactory webServerFactory(){
        TomcatServletWebServerFactory factory =new TomcatServletWebServerFactory();
        factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
            @Override
            public void customize(Connector connector) {
                connector.setProperty("relaxedQueryChars","|[]");
            }
        });
        return factory;
    }
}
### 如何在Spring Boot处理GET请求以接收数组参数 为了使应用程序能够通过GET请求接受数组作为参数,可以利用`@RequestParam`注解来映射URL中的查询参数到控制器方法的参数上。当客户端发送带有多个相同名称键的HTTP GET请求时,这些值会被收集成列表或数组形式传递给服务器端的方法。 对于希望接收到字符串类型的数组为例: ```java @GetMapping("/example") public ResponseEntity<?> getExample(@RequestParam(value = "ids", required = false) List<String> ids){ if (ids != null && !ids.isEmpty()){ // 处理逻辑... return ResponseEntity.ok(ids); }else{ return ResponseEntity.badRequest().body("No IDs provided"); } } ``` 上述代码片段展示了如何定义一个RESTful服务接口[endnote],它会响应来自路径 `/example` 的GET请求并尝试读取名为 `ids` 的查询参数作为一个字符串列表。如果提供了该参数,则返回其内容;如果没有提供任何ID,则给出错误提示[^1]。 另外一种方式是直接指定为基本数据类型数组而不是集合框架下的List对象: ```java @GetMapping("/another-example") public String anotherExample(@RequestParam(name="values") Integer[] values){ StringBuilder result = new StringBuilder(); Arrays.stream(values).forEach(x -> result.append(x).append(", ")); return result.toString(); } ``` 此段落说明了另一种可能性——即把传入的数据绑定至整数型的一维数组内,并简单地迭代打印出来。 值得注意的是,在实际开发过程中应当考虑对输入做适当验证以及异常情况处理,确保系统的健壮性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值