在公司的一次项目改造过程中,需要将原来的ipv6替换成ipv4。查询资料资料之后,你会遇到如下问题,总结解决办法如下:

1、替换老版本tomcat

tomcat6不支持监听ipv6 tomcat7支持监听ipv6 tomcat8支持监听ipv6

我们只需将tomcat换为7以上的版本即可!!!!!!!!!

2、项目无法启动

如果使用tomcat 7以上的版本来替换老版本的tomcat,那么问题来了你会无法启动项目。

错误日志:

26-aug-2020 16:11:15.558[rmi tcp connection(3)-127.0.0.1] org.apache.tomcat.util.descriptor.web.webxmlparser.parsewebxml parse error in application web.xml file at [file:/f:/idea-code/chuangjhx/out/artifacts/emp_std_192_169_1_81_war_exploded/web-inf/web.xml]
    java.io.filenotfoundexception: could not resolve xml resource [user] with public id [null], system id [userconfig.xml] and base uri [file:/f:/idea-code/chuangjhx/out/artifacts/emp_std_192_169_1_81_war_exploded/web-inf/web.xml] to a known, local entity.

因为新版本的tomcat无法解析你的web.xml

解决办法:

打开你的tomcat的安装目录 找到conf目录下的context.xml

在** **中添加属性xmlblockexternal,具体如:

<context xmlblockexternal="false">

3、tomcat7拦截特殊字符

当你在服务期内使用ipv6地址进行下载或者跳转的时候,会出现如下错误

note: further occurrences of http header parsing errors will be logged at debug level.
 java.lang.illegalargumentexception: invalid character found in the request target. the valid characters are defined in rfc 7230 and rfc 3986
    at org.apache.coyote.http11.http11inputbuffer.parserequestline(http11inputbuffer.java:479)
    at org.apache.coyote.http11.http11processor.service(http11processor.java:687)
    at org.apache.coyote.abstractprocessorlight.process(abstractprocessorlight.java:66)
    at org.apache.coyote.abstractprotocol$connectionhandler.process(abstractprotocol.java:790)
    at org.apache.tomcat.util.net.nioendpoint$socketprocessor.dorun(nioendpoint.java:1468)
    at org.apache.tomcat.util.net.socketprocessorbase.run(socketprocessorbase.java:49)
    at java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1149)
    at java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:624)
    at org.apache.tomcat.util.threads.taskthread$wrappingrunnable.run(taskthread.java:61)
    at java.lang.thread.run(thread.java:748)

这是因为

  • 根据rfc规范(rfc 3986规范定义了url中只允许包含英文字母(a-za-z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(rfc3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ]))。
  • url中不允许有 |,{,}等特殊字符,但在实际生产中还是有些url有可能携带有这些字符,特别是|还是较为常见的。在tomcat升级到7以后,对url字符的检查都变严格了,如果出现这类字符,tomcat将直接返回400状态码。

解决办法(springboot)

在你的启动类上添加

    @bean
    public tomcatservletwebserverfactory webserverfactory() {
        tomcatservletwebserverfactory factory = new tomcatservletwebserverfactory();
        factory.addconnectorcustomizers(new tomcatconnectorcustomizer() {
            @override
            public void customize(connector connector) {
                connector.setproperty("relaxedpathchars", "\"<>[\\]^`{|}");
                connector.setproperty("relaxedquerychars", "\"<>[\\]^`{|}");
            }
        });
        return factory;
    }

解决办法(tomcat)

打开你的tomcat 的安装目录 找到conf目录下的server.xml ,作出如下修改:

<connector port="8082" protocol="http/1.1"
               connectiontimeout="20000"
               relaxedquerychars="[]|{}^\`&quot;&lt;&gt;"
               redirectport="8443" />

4、设置ipv6的监听

想让你的tomcat即可以使用ipv4又可以使用ipv6访问,需要进行如下配置

打开打开你的tomcat的安装目录 找到conf目录下的server.xml,作出如下修改:

 <connector port="8080" protocol="http/1.1"
    address="0.0.0.0"
               connectiontimeout="20000"
               relaxedquerychars="[]|{}^\`&quot;&lt;&gt;"
               redirectport="8443" />
    <connector port="8080" protocol="http/1.1"
    address="[::]"
               connectiontimeout="20000"
               relaxedquerychars="[]|{}^\`&quot;&lt;&gt;"
               redirectport="8443" />

到此这篇关于tomcat中使用ipv6地址的示例代码的文章就介绍到这了,更多相关tomcat使用ipv6地址内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!