最近在做一个管理系统,使用的是 tomcat 7.077 ,后台使用 SSM 框架 Ajax 进行数据的交换。因为前端发送过来的是 json 数据流而浏览器发送请求不会对符号进行转义所以报错
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
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:472)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:683)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
报错的原因大概是传输 URL 中包含了非法字符,解决这个问题的方法有
- 对 URL 进行转义
Ajax
- 对 URL 进行转义
$.ajax({
type:'GET',
url:'http://192.168.6.74:8080/LabSystem/admins/testJson',
data:{'username':encodeURI('哈哈'),'password':encodeURI('123456')},
dataType:'jsonp',
jsonp: "callback",
contentType:'application/x-www-form-urlencoded;charset=UTF-8',
async:true,
cache:false,
success:function(data){
//扩展回调函数
alert(data),
$('h2').text('成功回应跨域请求')
},
error:function(){
//处理异常数据...
alert("ERROR")
}
});
})
ssm
@ResponseBody
@RequestMapping(value="/testBean",method=RequestMethod.GET,produces="application/json;charset=UTF-8")
public Object testMethod(String callback,
@RequestParam("username") String username,@RequestParam("password")String password) throws Exception{
URLDecoder.decode(username,"UTF-8");
System.out.println(URLDecoder.decode(username,"UTF-8"));
UserExample userExample =null;
List<User> user = userService.testBean(userExample);
JSONPObject jsonpObject = new JSONPObject(callback,user) ;
return jsonpObject;
}
这样的做法代码将会十分赘余,如果表单一次性提交多个数据这种处理是十分不适宜的。既然问题出现在 tomcat 配置本身,那么就一定有相应的配置来解决这个问题。
- 更改 tomcat 配置
打开 tomcat 安装目录 apache-tomcat-7.0.77\conf 找到 catalina.properties 在配置的最后两行进行修改
#tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
OK 这样前端就可以顺利向服务器发送 json 对象不报错了
var users={'uUsername':'201600407085','uPassword':'123456'};
$.ajax({
type:'GET',
url:'http://192.168.6.74:8080/LabSystem/admins/testJson',
data:JSON.stringify(users),
dataType:'jsonp',
jsonp: "callback",
contentType:'application/x-www-form-urlencoded;charset=UTF-8',
async:true,
cache:false,
ssm
@ResponseBody
@RequestMapping("/testJson")
public Object toBean(String callback,@RequestBody User user){
System.out.println(user.getuUsername());
return 1;
}
解决这个问题后原本赘余的代码两三行就搞定了简直不要太爽 hhhhh
网友评论