解决 tomcat. Invalid character found in the request target.异常错误

最近在做一个管理系统,使用的是 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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,188评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,171评论 6 342
  • 偶尔会有不吃早饭的时候。尤其是最近课越来越少之后,早上没课,然后就待在宿舍学习,也懒得出去买早饭…… 深知不吃早饭...
    你说我听ai阅读 2,361评论 0 0
  • 又一个值班夜,今天晚上本来可以和老公孩子一起听演唱会的,可是这个临时的值班把我们的团聚给毁了。可是今晚的四个小时我...
    心如美玉阅读 1,778评论 2 0
  • 花了一个星期看完了冯唐参与录制的节目搜神记,坦白说第一次看时觉得很是无聊,就是日本食神vs中国油条师傅那集,搞不懂...
    子孩_阅读 3,258评论 0 1

友情链接更多精彩内容