美文网首页
解决 tomcat. Invalid character fou

解决 tomcat. Invalid character fou

作者: 其实我很菜啊 | 来源:发表于2017-12-22 17:22 被阅读0次

最近在做一个管理系统,使用的是 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 中包含了非法字符,解决这个问题的方法有

    1. 对 URL 进行转义
      Ajax
  $.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 配置本身,那么就一定有相应的配置来解决这个问题。

    1. 更改 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

相关文章

网友评论

      本文标题:解决 tomcat. Invalid character fou

      本文链接:https://www.haomeiwen.com/subject/rdbgwxtx.html