java项目升级spring4.3.x 、jdk1.8 、tomcat8.5遇到的坑及解决方案
在将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依赖如下:
<dependency> <groupid>jackson-all</groupid> <artifactid>jackson-all</artifactid> <version>2.0.1</version> </dependency>
在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.jarannotations库:databinding annotations,即带注释的数据绑定包。
下载:
http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.1.0/jackson-annotations-2.1.0.jardatabind库: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依赖如下:
<jackson.version>2.8.11</jackson.version> <dependency> <groupid>com.fasterxml.jackson.core</groupid> <artifactid>jackson-core</artifactid> <version>${jackson.version}</version> </dependency> <dependency> <groupid>com.fasterxml.jackson.core</groupid> <artifactid>jackson-databind</artifactid> <version>${jackson.version}</version> </dependency> <dependency> <groupid>com.fasterxml.jackson.core</groupid> <artifactid>jackson-annotations</artifactid> <version>${jackson.version}</version> </dependency>
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中添加一下代码如下:
<mvc:annotation-driven> <mvc:message-converters> <bean id="mappingjacksonhttpmessageconverter" class="org.springframework.http.converter.json.mappingjackson2httpmessageconverter"> <property name="supportedmediatypes"> <list> <value>text/html;charset=utf-8</value> <value>application/json;charset=utf-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
网上参考解决方案参考: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
上一篇: 狗狗和主人一样的销魂
下一篇: ajax提交数据