最近在做一個管理系統,使用的是 tomcat 7.077 芍锚,后臺使用 SSM 框架 Ajax 進行數據的交換昔园。因為前端發(fā)送過來的是 json 數據流而瀏覽器發(fā)送請求不會對符號進行轉義所以報錯
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 這樣前端就可以順利向服務器發(fā)送 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