在將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.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依賴如下:
<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