欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java项目升级spring4.3.x 、jdk1.8 、tomcat8.5遇到的坑及解决方案

程序员文章站 2022-04-28 13:14:46
在将spring3.x 升级为4.3.x,jdk1.7 tomcat7升级到jdk1.8、tomcat8.5过程中,碰到了很多问题,也学习到了很多东西,现将这些问题分享出来,方便大家后续遇到同样问题时快速定位处理。 1、tomcat8.5不可在类似.test.com域名下写cookie 之前代码类似 ......

在将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