Tomcat中使用ipv6地址的示例代码

目录
  • 1、替换老版本Tomcat
  • 2、项目无法启动
  • 3、Tomcat7拦截特殊字符
  • 4、设置IPV6的监听

在公司的一次项目改造过程中,需要将原来的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地址内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 在tomcat将一个IP地址绑定多个域名的方法

    在server.xml中<Engine></Engine>下添加2个host就可以了. <Host name="www.abcd.com" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="

  • Tomcat中使用ipv6地址的示例代码

    目录 1.替换老版本Tomcat 2.项目无法启动 3.Tomcat7拦截特殊字符 4.设置IPV6的监听 在公司的一次项目改造过程中,需要将原来的IPV6替换成IPV4.查询资料资料之后,你会遇到如下问题,总结解决办法如下: 1.替换老版本Tomcat tomcat6不支持监听ipv6 tomcat7支持监听ipv6 tomcat8支持监听ipv6 我们只需将tomcat换为7以上的版本即可!!!!!!!!! 2.项目无法启动 如果使用Tomcat 7以上的版本来替换老版本的Tomcat,那么

  • ASP.NET Core MVC 中实现中英文切换的示例代码

    哈喽..大家好 很久没有更新了,今天就来一篇最近开发用到的功能,那就是中英文切换,这个实际上也不是高大上,先说一下原理,在.NET Core框架中给我们提供了全球化的类,叫做Localization,其官方的文档地址传送门. 在我的项目中,我是这样操作的,你想用别的方式,也可以看文档自己去搞.这个已经不是什么新鲜的东西了,只是网上的实现有些问题,不容易明白. 我们无需任何Nuget包,因为它是在Microsoft.AspNetCore.Mvc.Localization中,那么我们直接在.NET

  • Java获取电脑真实IP地址的示例代码

    /** * @author yins * @date 2018年8月12日下午9:53:58 */ import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; /** * 获取本地真正的IP地址,即获得有线或者无线WiFi地址. * 过滤虚拟机.蓝

  • C# 获取客户端IPv4地址的示例代码

    网上找了一些获取客户端IP的方法,但本地测试时,返回的是IPv6的表示方法"::1": Host文件里面:#    ::1             localhost 后来找了获取IPv4的方法就可以了,比较好用: public static string GetClientIPv4Address() { string ipv4 = String.Empty; foreach (IPAddress ip in Dns.GetHostAddresses(GetClientIP())) {

  • React Native中实现动态导入的示例代码

    目录 背景 多业务包 动态导入 Metro 打包原理 打包过程 bundle 分析 __d函数 __r函数 方案设计 分 识别入口 树拆分 bundle 生成 合 总结 背景 随着业务的发展,每一个 React Native 应用的代码数量都在不断增加,bundle 体积不断膨胀,对应用性能的负面影响愈发明显.虽然我们可以通过 React Native 官方工具 Metro 进行拆包处理,拆分为一个基础包和一个业务包进行一定程度上的优化,但对日益增长的业务代码也无能为力,我们迫切地需要一套方案来

  • vue组件中使用iframe元素的示例代码

    本文介绍了vue组件中使用iframe元素的示例代码,分享给大家,具体如下: 需要在本页面中展示vue组件中的超链接,地址栏不改变的方法: <template> <div class="accept-container"> <div class="go-back" v-show="goBackState" @click="goBack">GoBack</div> <ul&g

  • Python调用百度根据经纬度查询地址的示例代码

    如下所示: def locatebyLatLng(lat, lng, pois=0): ''' 根据经纬度查询地址 ''' items = {'location': str(lat) + ',' + str(lng), 'ak': '你自己申请的百度ak', 'output': 'json'} res = requests.get('http://api.map.baidu.com/geocoder/v2/', params=items) result = res.json() print(re

  • Python 实现黑客帝国中的字符雨的示例代码

    本教程很简单吧,除了复制代码之外,希望你也抽点时间去看下"注意",教程很简单,有问题请留言 废话不多数,先上图 注意 本项目中,需要用到文件库"pygame",不会的小伙伴,可以参考我的PyCharm教程里面有详细的讲解如何添加库:对于没有字体ttf的小伙伴,也不必担心,可以去这个链接下载,完全能够满足你的平日使用需求: # !/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2020.2 # @Author

  • 在pycharm中创建django项目的示例代码

    在pycharm中创建django项目的方法步骤,分享给大家,具体如下: 创建完成后,我们可以看看django项目是否可以启动 在Terminal 中输入命令 python manage.py runserver 能看到一下界面证明启动成功 在项目的时候肯定会用到数据库 所以我们需要进入settings中更改数据库的配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': "django_test&qu

  • Unity中 mesh生成斜坡的示例代码

    Mesh概念: Mesh是Unity中的一个组件,称为网格组件.通俗的讲,Mesh是指模型的网格,3D模型是由多边形拼接而成,而多边形实际上是由多个三角形拼接而成的.所以一个3D模型的表面其实是由多个彼此相连的三角面构成.三维空间中,构成这些三角形的点和边的集合就是Mesh. Mesh组成: 1.顶点坐标数组vertexes 2.顶点在uv坐标系中的位置信息数组uvs 3.三角形顶点顺时针或者逆时针索引数组triangles 4.MeshFiler组件,用于增加mesh属性 5.MeshRend

随机推荐