tomcat启动,查询字符串存在中括号问题,不需要转码

经常遇到前台使用get方式查询,传递复杂对象到后台的情况,需要使用到中括号,如果直接使用中括号,后台tomcat服务器不识别,需要前台进行转码 为 %5B %5D,如果使用浏览器请求,会导致浏览器再次将%转码,为了解决该问题,可以配置tomcat识别不转码的中括号,配置如下

1. 如果是使用springboot方式启动,可以在application.yml增加配置

server.tomcat.relaxed-query-chars: [,]

2. 有的版本使用1不生效,可以增加配置类

import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;

@Component
public class EmbeddedTomcatConfig implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
    @Override
    public void customize(TomcatServletWebServerFactory factory) {
        factory.addConnectorCustomizers(connector -> connector.setAttribute("relaxedQueryChars", "[]"));
    }
}

3. 外部tomcat启动,修改server.xml文件,connector增加对应的属性 relaxedQueryChars="[]"

    <Connector connectionTimeout="20000" port="8080" relaxedQueryChars="[]" protocol="HTTP/1.1" redirectPort="8443"/>

4.前台使用get传递复杂对象到后台

如果是数组中包含简单类型,例如 字段fieldA,可以使用多个字段传值,如果是对象中的属性,可以使用[],如果是数组中的对象,可以使用 对象[index].field,具体如下图

### 异常原因分析 `org.apache.tomcat.util.http.fileupload.FileUploadException: the request was rejected because no multipart boundary was found` 这一异常通常发生在文件上传过程中,当服务器端接收到的 HTTP 请求符合 `multipart/form-data` 的标准格式时触发。具体来说: - **边界缺失**:HTTP 协议规定,在使用 `multipart/form-data` 类型传输数据时,每部分数据之间需要用特定的分隔符(即“boundary”)来区分[^1]。 - 如果客户端未正确设置 `Content-Type` 或者其值中缺少有效的 `boundary` 参数,则 Tomcat 会拒绝该请求并抛出此异常。 另外一种情况是在 Internet Explorer (IE) 浏览器环境下可能出现特殊问题,即使其他浏览器能够成功完成相同操作却依旧失败于 IE 中,这是因为同浏览器对于某些细节处理方式有所差异所致[^2]。 还有值得注意的是并非所有情况下遇到此类错误都真正涉及到了实际意义上的文件传送动作;有时候即便业务逻辑里根本没有设计到任何关于档案资料传递环节也可能遭遇上述提及过的状况——这往往是因为当设定或者遗漏配置所引起的结果之一就是将原本应该作为 JSON 数据提交的内容被误解成了另一种形式从而导致解析过程出现问题进而引发相应类型的例外情形发生比如这里提到的一个例子就说明了这一点:“刚开始看到这个错误我也是一脸懵比的,没有涉及到文件上传为什么还会报那个错呢?后来才发现原来是请求的 content type 出现了问题只要把它改成 json 就可以解决问题。”[^4] 最后一点需要注意的就是针对前端框架 Axios 使用场景下的一些特别注意事项。“前端通过 axios 发送请求是需要指定 Content Type 类型,如果存在则应予以移除。”过与此同时也要考虑到像微信小程序这样的特殊情况,“因为小程序中的请求无法经由 Spring MVC 自动转换类型因此需要做出适当权衡考虑。”[^5] ### 解决方案 #### 方法一:确认正确的 Content-Type 设置 确保在发起 POST 请求时设置了合适的 `Content-Type` 头部信息。如果是普通的表单提交或者是带有文件上传的操作,请务必保证头部字段形如下面这样包含了一个合法的边界字符串: ```http Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW ``` 如果你的应用并涉及任何形式的数据块分割而是单纯地希望推送一些结构化参数给后台服务的话那么就应该采用 application/json 形式的编码方法而是默认可能产生的那种复杂模式下的封装样式。 #### 方法二:调整 Web 容器行为 有时尽管遵循以上指导原则仍然会出现兼容性方面的问题特别是面对老旧版本软件产品的时候更是如此。在这种条件下我们还可以尝试修改容器本身的属性以适应更广泛的需求范围。例如可以通过编辑 server.xml 文件增加如下所示的一段定义语句实现放宽限制的目的: ```xml <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <!-- Add this attribute --> relaxedQueryChars='[]|' /> ``` 请注意这里的改动仅适用于 Apache Tomcat 版本号大于等于 9.x 才有效果并且还需要重启整个应用实例才能生效。 #### 方法三:检查第三方库冲突 由于项目依赖关系较为复杂经常会发生多个相互独立却又彼此关联紧密的同组件间产生矛盾的现象最终表现为运行时刻崩溃之类的严重后果。所以在排查期间也应当仔细审查是否存在重复引入相似功能模块的情况一旦发现问题就要及时清理冗余项保留唯一官方推荐使用的那一份即可恢复正常运作状态。 #### 方法四:增强日志记录便于调试诊断 为了更加方便快捷定位潜在隐患所在位置建议开启详细的跟踪机制以便收集更多有用线索辅助后续修复工作开展顺利进行下去。可以在 logback-spring.xml 配置文档里面加入类似下列片段内容达到目的: ```xml <logger name="org.apache.catalina.core.ApplicationPart" level="DEBUG"/> <logger name="org.apache.coyote.http11.Http11Processor" level="DEBUG"/> ``` 再次强调一下记得保存更改之后重新加载环境变量使得最新变动立即体现出来供测试验证效果如何。 ### 总结 综上所述造成 org.apache.tomcat.util.http.fileupload.FileUploadException 异常的原因主要有以下几个方向值得重点关注分别是:是否提供了恰当合理的多部件划分界限标志位、当前正在运用的具体网络协议栈层面上有没有额外附加约束条件以及整体架构体系内部各组成部分之间的协作配合程度等等因素共同作用决定着最终能否顺利完成既定目标任务要求。采取相应的预防措施和补救办法就可以有效地减少甚至完全消除这类技术难题带来的困扰影响用户体验质量水平下降等问题的发生几率大大提升系统的稳定性和可靠性表现指标数值显著提高客户满意度评价等级得到进一步优化改进成果明显可见成效斐然令人欣喜已! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值