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包供下載:

  1. Core庫:streaming parser/generator,即流式的解析器和生成器。
    下載:
    http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.1.0/jackson-core-2.1.0.jar

  2. Annotations庫:databinding annotations,即帶注釋的數據綁定包。
    下載:
    http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.1.0/jackson-annotations-2.1.0.jar

  3. 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中的保留字段中,所以會報這個錯。

解決方案有兩種:

  1. 修改get請求,將path中的特殊字符進行轉碼后再傳到后台 encodeURIComponent()
  2. 修改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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM