欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Tomcat报错:The valid characters are defined in RFC 7230。解决办法

程序员文章站 2022-06-05 19:29:23
...

参考李兴华老师的JSP课程编写数据表增删改查时。

1. 问题描述

    通过jsp页面批量删除数据时,

Tomcat报错:The valid characters are defined in RFC 7230。解决办法

Tomcat报错:The valid characters are defined in RFC 7230。解决办法

Tomcat8.5.31报错,错误信息如下:

信息: Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

原因在于,表单提交后的请求的请求路径,路径成为:xx.jsp?ids=92|93|94|

function deleteHandle(eleId,url) { //进行删除的控制
	var idInfo = "";   //这是最要删除的数据
	var obj = document.all(eleId) ;
	if(obj.length == undefined) { //不是一个数组,是一个单独的数据
		if(obj.checked){ //有选项被选中
			//idInfo += obj.value + "+" ;
			idInfo += obj.value + "|" ;
		}
	} else {
		for (var x = 0; x < obj.length; x++) {
			if(obj[x].checked){ //有选项被选中
				//idInfo += obj[x].value + "+" ;
				idInfo += obj[x].value + "|" ;
			}
		}
	}
	//console.log(idInfo);
	if (idInfo == "") { //没有选中要删除的数据
		alert("您还未选择任何想要删除的数据,请先选择!");
	} else {
		if(window.confirm("你确定要删除这些数据吗?")) {
			window.location = url+"?ids=" + idInfo;   //地址重写
		}	
	}
}

2.原因以及解决办法

    查询资料得知,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。Url的编码格式采用的是ASCII码,而不是Unicode。然而tomcat的新版本增加了一个新特性,就是严格按照 RFC 3986规范进行访问解析URL。即表单提交时产生的请求url中的"|"字符无法解析。

    此时尝试将请求url变更为:xx.jsp?ids=92&93&94&,跳转页面xx.jsp中 String ids = request.getParameter("ids"); 取得的ids字段值只是92,原因在于&将93、94和ids分开了,不认为这两个数是ids的内容。此时后台无法通过分割字符串的方式拿到全部要删除id。

   目前解决办法,将请求url变更为:xx.jsp?ids=92+93+94+,跳转页面xx.jsp中 String ids = request.getParameter("ids"); 取得的ids字段为"92 93 94 ",(URL中+表示空格,可以替换成%2B)。后台jsp页面可以通过空格字符串分割获得所有的待删除的id。

相关代码:

<%
	String ids = request.getParameter("ids"); 
        out.println(ids);
        //http请求中,"+"会转变 " "
	String result[] = ids.split(" ");
	Set<Integer> set = new HashSet<>();
	for (int x =0 ; x < result.length ; x ++) {
		set.add(Integer.parseInt(result[x]));
	}
%>

这样可以获得全部要删除的部门id信息。实现批量删除

相关标签: 问题解决