全网多种方法解决由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者虚拟的请求路由),服务器无法或不会处理当前请求的错误
  TEZNKK3IfmPf 2023年11月12日 12 0

1. 复现错误


今天根据需求文档,写完导入hive表的接口,如下代码所示:

/** * hive表导入 * * @author super先生 * @datetime 2023/3/20:16:32 * @return */
@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中不能包含一些特殊字符,比如:

  1. 空格

  2. 尖括号

  3. 花括号

再次检查我的请求接口中,果然包含特殊符号,比如花括号和双引号等。

3. 解决错误

既然我的请求接口包含特殊符号,那么,我需要修改后端接参方式,如下代码所示:

/** * hive表导入 * * @author super先生 * @datetime 2023/3/20:16:32 * @return */
@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

如果因为超链接参数带特殊字符而报错,可进行如下修改:

参数中可能包含了|{}[],%等一些特殊字符,修改Tomcatserver.xml文件:

全网多种方法解决由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者虚拟的请求路由),服务器无法或不会处理当前请求的错误

可在server.xml中的Connector添加如下代码:

relaxedPathChars="|{}[],%" relaxedQueryChars="|{}[],%"

例如:(参数里有哪些特殊字符,就加哪些)

<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" relaxedPathChars="|{}[],%" relaxedQueryChars="|{}[],%" />

4.3 解决该错误的方法3

检查是否因为参数的类型不匹配,如下图所示:

全网多种方法解决由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者虚拟的请求路由),服务器无法或不会处理当前请求的错误

前台传到后台的数据类型,如果都是String

  1. "哈哈"是中文,转成int会报错。
  2. "666"实体类中也是String,没问题。
  3. "没钱了"是中文,转double会报错。
  4. "2020-11-05"springmvc默认不支持StringDate的转换,会报错。

5. 文末备注


如果上述所有的方法无法解决你的错误,或者你的错误不是由上述方法解决的,可在评论区留言,大家共同进步。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
TEZNKK3IfmPf