Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors...java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are
先将异常信息贴出:
该问题是tomcat进行http request解析的时候报的错,网上的解决办法主要是修改Tomcat的server.xml,在<Connector port="8080"protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443" />的配置中增加maxHttpHeaderSize的配置。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" maxHttpHeaderSize="8192" />
如果调整了maxHttpHeaderSize还是解决不了,这时候需要设置前端页面的数据格式,需要将method 的属性设置为POST
但是这种方法对我的代码并未奏效。
-----------------------------------------------------------------------------------------------------------------
经过分析,发现此问题与请求参数有关。当在浏览器中访问时 URL中带有特殊字符,如花括号冒号时,就会出现这个错误。例如:http://localhost:8080/index.do?{id:123},在有些情况下,即使没有花括号,只要带有"?+参数"就会报此异常
比如本文所遇该问题是在使用Layer.js的弹出窗体功能时出现的问题
(代码中的*代码隐藏的代码,下同)
js代码:
var url = **.getWebRootPath()+ "/imagePair/toMakeRegister?cmdUuid=" + cmdUuid+ "&projectId="+**.getProjectId(); layer.open({ type : 2, area : [ '1000px', '480px' ], fixed : false, maxmin : true, skin : 'layui-layer-nobg', btn : [ '确定', '取消' ], content : url, yes : function(index, layero) { ***** }
java代码:
@RequestMapping("/toMakeRegister") public String toMakeRegister(HttpServletRequest request,Model model){ String cmdUuid = request.getParameter("cmdUuid"); String projectId = request.getParameter("projectId"); model.addAttribute("cmdUuid", cmdUuid); model.addAttribute("projectId" ,projectId);*/ return "modules/data/imagefusionPair"; }
原先的思路是通过后台转接得到子页面的url地址,然后使用layer.js组件实现将该url指向的页面作为子页面弹出。由于在url中有带?的参数,所以出现了本文开头的异常。于是,改变url形式,去掉后面的参数,将其通过其他方式进行父子界面的传参。
因此又引出了另一个问题,如何使用layer.open()的时候进行父子界面传参?
本文解决办法:直接上代码
父js:
var url = *.getWebRootPath()+ "/imagePair/toMakeRegister"; var projectId=*.getProjectId(); var para={ "cmdUuid":cmdUuid, "projectId":projectId }; parent.layer.open({ type : 2, area : [ '1000px', '480px' ], fixed : false, // 不固定 maxmin : true, skin : 'layui-layer-nobg', // 没有背景色 btn : [ '确定', '取消' ], content : url, success: function(layero, index) { $(layero).find('iframe'[0].contentWindow.getParentData(para); }, yes : function(index, layero) { **** }
子页面js: 添加获取父页面数据的方法
function getParentData(para){ cmdUuid=para.cmdUuid; projectId=para.projectId; }
关键的是
success: function(layero, index) { $(layero).find('iframe'[0].contentWindow.getParentData(para); },
“success”定义的回掉函数是在子页面加载完成之后执行的,
$(layero).find('iframe'[0].contentWindow获取子页面窗体对象,然后直接调用在子页面中定义的getParentData(para)方法;
---------------------------------------------------------------------------------------------------