后台报错java.lang.IllegalArgumentException: Invalid character found in the request target.
报错信息
报错原因
当在浏览器中访问时 URL中带有特殊字符,如花括号冒号时,就会出现这个错误。
例如:http://localhost:8080/index.do?{id:123}
解决方法
之前看过的有几个解决方法都是修改tomcat配置文件
- 修改tomcat的server.xml配文件,加上
URIEncoding="utf-8" relaxedPathChars="|{}[],%" relaxedQueryChars="|{}[],%"
- 修改tomcat的catalina.properties文件,本人在网上找到了两种修改方法
(1)在 conf/catalina.properties 中最后添加一行:org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
(2)或者在conf/catalina.properties 中添加tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
- 使用post提交
开始时本人的代码是用get请求去进行批量下载,但是在请求中遇到了这种问题。开始是用第一种方法修改tomcat的server.xml配置文件,当时和之后一段时间内确实没有问题,但是一段时间之后,又开始报了这个问题,于是本人改用了post请求
原get请求
function batchExport(title,url,id) {
gridname=id;
const didAndCaseIds = [];
const rows = $("#" + id).datagrid('getSelections');
if (rows.length > 0) {
for (let i = 0; i < rows.length; i++) {
const didAndCase = {did: rows[i].did, caseId: rows[i].caseId};
didAndCaseIds.push(didAndCase);
}
const ids = JSON.stringify(didAndCaseIds);
window.location = url+'&ids='+ids;
tip("请选择需要操作的数据");
}
}
post请求
function batchExport(title,url,id) {
gridname=id;
const didAndCaseIds = [];
const rows = $("#" + id).datagrid('getSelections');
if (rows.length > 0) {
for (let i = 0; i < rows.length; i++) {
const didAndCase = {did: rows[i].did, caseId: rows[i].caseId};
didAndCaseIds.push(didAndCase);
}
const ids = JSON.stringify(didAndCaseIds);
var formObject = document.createElement('form');
$(document.body).append(formObject);
formObject.setAttribute('method', 'post');
formObject.action = url;
var inputObject = document.createElement('input');
inputObject.setAttribute('type', 'hidden');
inputObject.setAttribute('name', 'ids');
inputObject.setAttribute('value', ids);
formObject.appendChild(inputObject);
formObject.submit();
} else {
tip("请选择需要操作的数据");
}
}