全网多种方法解决由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者虚拟的请求路由),服务器无法或不会处理当前请求的错误
文章目录
1. 复现错误
今天根据需求文档,写完导入hive表
的接口,如下代码所示:
@RequestMapping(value = "/xxx/importTables", method = RequestMethod.GET)public ServiceStatusData localHiveImportTables(@RequestParam("importTableJson") String importTableJson) { logger.info("入参记录:importTables={}", importTableJson); ... ... return new ServiceStatusData(ServiceStatusData.Status.Success, "", null);}
使用postman
测试该接口时,确保出如下错误信息:
异常报告消息 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义描述 由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者虚拟的请求路由),服务器无法或不会处理当前请求。例外情况java.lang.IllegalArgumentException: 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:509)org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:513)org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:882)org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1691)org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)java.lang.Thread.run(Thread.java:745)):注意 主要问题的全部 stack 信息可以在 server logs 里查看
即由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者虚拟的请求路由),服务器无法或不会处理当前请求
。
2. 分析错误
正赶上最近ChatGPT
比较火,借助它分析我的错误,如下图所示:
ChatGPT
说我的请求不符合服务器的要求或格式所致。
于是,检查我的请求接口:http://localhost:8080/dav-war/netin/hive/importTables.do?importTableJson="{\"hiveTableName\":\"project\",\"tableImportType\":1,\"pkColumn\":\"id\",\"incrementColumn\":\"projectname\",\"cron\":\"0 0 11 * * ?\"}"
。
我的请求接口中,没有发现错误之处。
继续检查错误信息,突然看到这句话在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义
,同样,借助ChatGPT
来回解释这句话,如下图所示:
ChatGPT
说在HTTP
请求中,URL
中不能包含一些特殊字符,比如:
-
空格
-
尖括号
-
花括号
-
…
再次检查我的请求接口中,果然包含特殊符号,比如花括号和双引号等。
3. 解决错误
既然我的请求接口包含特殊符号,那么,我需要修改后端接参方式,如下代码所示:
@RequestMapping(value = "/xxx/importTables", method = RequestMethod.GET)public ServiceStatusData localHiveImportTables( @RequestParam("hiveTableName") String hiveTableName, @RequestParam("tableImportType") String tableImportType, @RequestParam(value = "pkColumn", required = false) String pkColumn, @RequestParam(value = "incrementColumn", required = false) String incrementColumn, @RequestParam("cron") String cron) { ImportTablesBo importTablesBo = new ImportTablesBo(); importTablesBo.setHiveTableName(hiveTableName); importTablesBo.setTableImportType(tableImportType); importTablesBo.setPkColumn(pkColumn); importTablesBo.setIncrementColumn(incrementColumn); importTablesBo.setCron(cron); logger.info("入参记录:importTablesBo={}", importTablesBo); return new ServiceStatusData(ServiceStatusData.Status.Success, "", importTablesBo);}
启动项目后,修改postman
的请求参数,再次使用postman
测试,便没有报出上述的错误,如下图所示:
4. 解决该错误的其他方法
如果我的错误解决方法,无法解决你的错误,可以参考如下的解决方法。
4.1 解决该错误的方法1
如果因为超链接参数带中文而报错
,可进行如下修改:
通过脚本来将href
超链接传递的参数转换为from表单
提交:
function linkClick(linkObject) {var formObject = document.createElement('form'); document.body.appendChild(formObject); formObject.setAttribute('method', 'post'); var url = linkObject.href; var uri = ''; var i = url.indexOf('?');if(i == -1) { formObject.action = url;} else { formObject.action = url.substring(0, i); } if( i >= 0 && url.length >= i + 1) { uri = url.substring(i + 1, url.length); } var sa = uri.split('&');for(var i = 0; i < sa.length; i++) { var isa = sa[i].split('='); var inputObject = document.createElement('input'); inputObject.setAttribute('type', 'hidden'); inputObject.setAttribute('name', isa[0]); inputObject.setAttribute('value', isa[1]); formObject.appendChild(inputObject); } formObject.submit(); return false;}
【注意事项】:部分浏览器若传参出现urlencode
编码,且不想出现这个编码时,可进行如下修改:
将
inputObject.setAttribute('value', isa[1]);
修改为
inputObject.setAttribute('value', decodeURIComponent(isa[1]));
或使用java
解码
java.net.URLDecoder.decode(mytext,“utf-8”)
4.2 解决该错误的方法2
如果因为超链接参数带特殊字符而报错
,可进行如下修改:
参数中可能包含了|{}[],%
等一些特殊字符,修改Tomcat
的server.xml
文件:
可在server.xml
中的Connector
添加如下代码:
relaxedPathChars="|{}[],%" relaxedQueryChars="|{}[],%"
例如:(参数里有哪些特殊字符,就加哪些)
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" relaxedPathChars="|{}[],%" relaxedQueryChars="|{}[],%" />
4.3 解决该错误的方法3
检查是否因为参数的类型不匹配,如下图所示:
前台传到后台的数据类型,如果都是String
:
"哈哈"
是中文,转成int
会报错。"666"
实体类中也是String
,没问题。"没钱了"
是中文,转double
会报错。"2020-11-05"
:springmvc
默认不支持String
到Date
的转换,会报错。
5. 文末备注
如果上述所有的方法无法解决你的错误,或者你的错误不是由上述方法解决的,可在评论区留言,大家共同进步。
来源地址:https://blog.csdn.net/lvoelife/article/details/129690065
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341