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

java项目升级spring4.3.x 、jdk1.8 、tomcat8.5遇到的坑及解决方案的更多相关文章

  1. Struts2+Hibernate4+Spring4框架整合搭建Java项目原型

    收藏 http://www.cnblogs.com/mageguoshi/p/5850956.html Struts2+Hibernate4+Spring4框架整合搭建Java项目原型

  2. java项目代码上线

    java项目代码上线   1:java项目代码上线架构图 ip地址及主机名规划 10.0.0.11 deploy 10.0.0.12 tomcat-web01 10.0.0.13 git.oldboy ...

  3. Scala:Java 项目中混入scala代码

    Spark 是用Scala代码写的.为了调试Spark,做了如下尝试. 1.Eclipse下:Java 项目 ,Using Maven,编写了一个java 版Spark应用. Spark的代码(sca ...

  4. Java开发环境的搭建以及使用eclipse从头一步步创建java项目

    一.java 开发环境的搭建 这里主要说的是在windows 环境下怎么配置环境. 1.首先安装JDK java的sdk简称JDK ,去其官方网站下载最近的JDK即可..http://www.orac ...

  5. IntelliJ IDEA14.1中java项目Maven中没有配置JDK时的问题

    在IntelliJ IDEA 14.1中使用在java项目中使用Maven时当没有在Maven中配置JDK编译版本.源码版本时,IDEA将默认的编译版本.源码版本设置为jdk5. 在IDEA中Lang ...

  6. 使用maven来管理您的java项目

    maven是一个项目管理工具,使用maven可以自动管理java项目的整个生命周期,包括编译.构建.测试.发布和报告等.在大型项目开发中,使用maven来管理是必不可少的. 一.安装maven 1.W ...

  7. 在命令行中运行eclipse中创建的java项目

    在命令行中运行eclipse中创建的java项目 博客分类: java相关 javaeclipse命令行  由于项目要求,需要对eclipse中的项目进行打包,似的可以在客户机上不装eclipse的情 ...

  8. 如何用Maven创建一个普通Java项目

    一下内容包括:用Maven创建一个普通Java项目,并把该项目转成IDEA项目,导入到IDEA,最后把这个项目打包成一个jar文件. 有时候运行mvn命令失败,重复运行几次就OK了,无解(可能因为网络 ...

  9. java.lang.UnsupportedClassVersionError(java项目版本一致问题)

    报此错误,一般都是由于在myeclipse中的java项目是用高版本(jdk1.6之后)的jdk进行编译后生成的class文件,却要运行在低版本的jdk虚拟机上,导致这个错误 解决办法: 在myecl ...

随机推荐

  1. 在一个java类里,private int a; 什么时候要使用integer

    private Integer index; if(index == null) index = 0; else this.index = index; Integer有一个明显的好处,就是它能比in ...

  2. 解决eclipse Building workspace(Sleeping)闪烁

    出现这个是因为我,把两个有错的项目.从工程里面删除掉之后,再接着运行新的工程,但是Building workspace一直没有执行完毕,导致新的工程无法运行. 这个时候可以关闭自动编译,就可以运行新的 ...

  3. 深度剖析MQTT协议的整个通信流程

    http://www.elecfans.com/d/587483.html MQTT,目前物联网的最主要的协议,基本所有收费的云平台都是基于MQTT协议,比如机智云,和所有的开放云平台比如中国移动的o ...

  4. Spring框架的核心模块的作用

    Spring框架由7个定义良好的模块(组件)组成,各个模块可以独立存在,也可以联合使用. (1)Spring Core:核心容器提供了Spring的基本功能.核心容器的核心功能是用Ioc容器来管理类的 ...

  5. WebApplicationContext wac=WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());这句话的意思

    在jsp中出现 提取的代码: <%   WebApplicationContext wac = WebApplicationContextUtils     .getWebApplication ...

  6. [I/O]一览图

  7. Python闭包需要注意的问题

    定义   python中的闭包从表现形式上定义为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure),也就是说内层函数引用了外层函数 ...

  8. hexo 博客

    梦飞扬~ 个人网站:Mauger`s Blog 博客园 标签 新随笔 随笔 管理 Github 随笔 - 61  文章 - 1  评论 - 0 使用Node.js+Hexo+Github搭建个人博客 ...

  9. Django - Xadmin 组件(二)

    Django 自带的 admin 组件可以自定义配置,本文实现 Xadmin 对自定义显示数据列 (list_display) 的配置. 构建表单数据 模板层 从视图函数传来的数据变量是双层列表,第一 ...

  10. Windows 安装Angular CLI

    1.安装nvm npm cnpm nrm(onenote笔记上有记录) 参考:https://blog.csdn.net/tyro_java/article/details/51232458 提示:如 ...