在将spring3.x 升级为4.3.x,jdk1.7 tomcat7升级到jdk1.8、tomcat8.5过程中,碰到了很多问题,也学习到了很多东西,现将这些问题分享出来,方便大家后续遇到同样问题时快速定位处理。
1、tomcat8.5不可在类似.test.com域名下写cookie
之前代码类似如下:
cookie cookie = new cookie("__admin__" ,"");
cookie.setdomain(".baidu.com");
cookie.setmaxage(0);
cookie.setpath("/");
response.addcookie(cookie);
这样写在tomcat8.0上是没问题的,但是把它放到tomcat8.5上就报错了,tomcat启动报错信息如下:java.lang.illegalargumentexception: an invalid domain [.baidu.com] was specified for this cookie
网上查阅资料,问题根源在于tomcat8.5本身的规则限制:
问题解决及原因分析帖子地址如下:
https://blog.csdn.net/cml_blog/article/details/52135115
https://blog.csdn.net/cml_blog/article/details/52135397
2、jackson-all包
之前项目用到了jackson-all的jar包,maven依赖如下:
jackson-all
jackson-all
2.0.1
在springmvc4.x以上版本中会出现兼容问题,需升级jackson版本 2.7以上,且jackson 2.x版提供了三个jar包供下载:
core库:streaming parser/generator,即流式的解析器和生成器。
下载:
http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.1.0/jackson-core-2.1.0.jar
annotations库:databinding annotations,即带注释的数据绑定包。
下载:
http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.1.0/jackson-annotations-2.1.0.jar
databind库:objectmapper, json tree model,即对象映射器,json树模型。
下载:
http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.1.0/jackson-databind-2.1.0.jar
从jackson 2.0起,
核心组件包括:jackson-annotations、jackson-core、jackson-databind。
数据格式模块包括:smile、csv、xml、yaml。
替换maven依赖如下:
2.8.11
com.fasterxml.jackson.core
jackson-core
${jackson.version}
com.fasterxml.jackson.core
jackson-databind
${jackson.version}
com.fasterxml.jackson.core
jackson-annotations
${jackson.version}
3、.html请求返回application/json数据报406问题
之前代码存在.html结尾请求json数据的代码,升级之后报406 error,代码如下:
@responsebody
@requestmapping(value = "/test/captcha.html", produces = "application/json;charset=utf-8")
public string captcha(string callback) {
logger.warn("/test/captcha.html 验证码 ");
.....
我的解决方案是将produces = "application/json;charset=utf-8"后面注解去掉,然后在spring-mvc.xml中添加一下代码如下:
class="org.springframework.http.converter.json.mappingjackson2httpmessageconverter">
text/html;charset=utf-8
application/json;charset=utf-8
网上参考解决方案参考:https://www.jianshu.com/p/eea6e2551749
4、tomcat 请求出现rfc 7230 and rfc3986的错误
在一些get请求中,带有{}的请求报400 error,tomcat控制台出现了rfc 7230 and rfc3986错误,网上查阅资料,发现是tomcat8.5对于一些特殊字符有限制,这个问题是高版本tomcat中的新特性:就是严格按照 rfc 3986规范进行访问解析,而 rfc 3986规范定义了url中只允许包含英文字母(a-za-z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(rfc3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。而我们的系统在通过地址传参时,在url中传了一段json,传入的参数中有"{"不在rfc3986中的保留字段中,所以会报这个错。
解决方案有两种:
修改get请求,将path中的特殊字符进行转码后再传到后台 encodeuricomponent()
修改tomcat中的配置…/conf/catalina.properties,找到最后注释掉的一行 #tomcat.util.http.parser.httpparser.requesttargetallow=| ,改成tomcat.util.http.parser.httpparser.requesttargetallow=|{},表示把{}放行
参考解决方案:https://blog.csdn.net/weixin_41986096/article/details/82785118
如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!