Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 12208|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-4-6 17:02:01 | 显示全部楼层 |阅读模式

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

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-16 21:29 , Processed in 0.063107 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表