开发问题收集

小龙 740 2023-05-23

一、页面报 400 错误,后端报 “Invalid character found in the request target” 异常

出现问题链接:

xxx.com?response='{%22resultCode%22:%220000%22,%22outTokenId%22:%2215208115520_out%22,%22interCode%22:%22CYS0001%22,%22type%22:%22web%22,%22message%22:%22%E6%9F%A5%E8%AF%A2%E7%A7%BB%E5%8A%A8%E7%A7%AF%E5%88%86%E6%88%90%E5%8A%9F%22,%22version%22:%221.0.0%22,%22points%22:%220%22,%22requestId%22:%2213020230523150057176750%22,%22hmac%22:%22e8e387aea888fc04bfd790e619cc3188%22,%22signType%22:%22MD5%22,%22reserved2%22:%22%22,%22reserved1%22:%22%22,%22partnerId%22:%22S8889185%22}'

问题描述:在请求目标中发现无效字符;新版本的tomcat内都有了限制一些字符的操作,比如花括号引号之类的。所以当前端传过来一个json数组给你转成了字符串之后,你就会发现根本拿不到。一直在报这个错误,而前端也在一直报跨域的错误。其实就是参数传的不对。

解决方案

添加如下 Bean 信息

//用于更改tomcat的非法字符限制。去掉一些括号双引号的限制
    @Bean
    public ConfigurableServletWebServerFactory webServerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> connector.setProperty("relaxedQueryChars", "|{}[]\\"));
        return factory;
    }

修改 application.properties 文件,添加如下配置

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

二、MySQL8.0 以上的版主执行 XA 分布式事务,数据库报 “XAER_RMERR: Fatal error occurred in the transaction branch - check your data” 错误

错误原因:当前访问mysql的账号缺少系统权限,我的是root(即admin)账户缺少 “允许执行 XA RECOVER语句”的权限:XA_RECOVER_ADMIN

解决方案:以root账号访问mysql,执行下面的语句,当然账号和IP需要根据自己的来改,此处为了节省时间直接改为*.*。
GRANT XA_RECOVER_ADMIN ON . TO 用户名@‘%’;
FLUSH PRIVILEGES;