最近做ueditor的图片抓取catchimage,前后端分离的架构,在本地开发测试都是好好的,但部署到外网就抓不到图片了,
外网先后报了两个错,报错如下:
1、后台报错:
java.lang.NullPointerException
at com.baidu.ueditor.hunter.ImageHunter.capture(ImageHunter.java:62)
at com.baidu.ueditor.ActionEnter.invoke(ActionEnter.java:69)
at com.baidu.ueditor.ActionEnter.exec(ActionEnter.java:41)
。。省略部分日志。。
2、HTTP请求报错:The valid characters are defined in RFC 7230 and RFC 3986
这两个错误,在本地测试都是通过的,但外网部署就出了差错。
对比第一个错误的请求,发现本地部署抓取图片是用的get请求,而外网是用的post请求,导致后台接收不到参数报错。
找到问题就开始干,在ueditor.all.js里面,找到判断是否跨域的判断isCrossDomainUrl,对此逻辑进行修改,
增加判断pathname服务名是否相同,搞定此问题。
第2个错误,实际上请求并没有进入后台接口,而是在tomcat层就被拦截了。
报的错也是tomcat给的提示信息。
查询一番之后,对错误原因有了理解,引用别人的原话 “这个问题是高版本tomcat中的新特性:就是严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。而我们的系统在通过地址传参时,在url中传了一段json,传入的参数中有”{“不在RFC3986中的保留字段中,所以会报这个错。”原文链接:https://blog.csdn.net/qq_32365919/article/details/82055800
解决方案,参考文章:https://yq.aliyun.com/articles/641394
因为我外网使用的是tomcat9,使用很久了,突然降低版本肯定不合适,所以只能修改配置文件了。
修改tomcat的conf/server.xml,增加:
relaxedPathChars="|{}[],"
relaxedQueryChars="|{}[],"
<Connector port="18080" protocol="HTTP/1.1"
connectionTimeout="20000"
relaxedPathChars="|{}[],"
relaxedQueryChars="|{}[],"
redirectPort="18443" />
再次测试,搞定!