【安装配置】Tomcat配置SSL证书步骤(含Element type “Connector“ must be followed by either attribute...的处理方案)

看完还有什么疑问,可以联系博主QQ1908269843,加的时候直接备注你遇到了什么情况。

想要网站以https://访问,需要将购买的SSL证书配置到Tomcat服务器中。
参考了几篇文章,花了几小时完成了。
在这里插入图片描述
先列出参考文章,然后再给出步骤和我的心得:
1.Tomcat配置SSL证书
2.Element type “Connector” must be followed by either attribute specifications
为了解决这个异常参考了以下两篇文章:http://blog.sina.com.cn/s/blog_5d2054d90102vt7y.html
https://blog.youkuaiyun.com/u014000377/article/details/50845920

步骤:

1. 先购买并下载证书,总结在这篇文章↓。

【安装配置】阿里云白嫖免费SSL证书步骤

2. 使用java jdk将PFX格式证书转换为JKS格式证书

下载的证书文件,解压后是这个样子:只有两个文件的,一个是pfx格式的证书,一个是密码文本。
在这里插入图片描述

在解压后的路径中输入cmd并回车,会进入该目录的命令行界面。
输入以下代码:

keytool -importkeystore -srckeystore 你的证书名称.pfx -destkeystore domains.jks -srcstoretype PKCS12 -deststoretype JKS

domains.jks是生成的jks格式证书名称,可以根据需要改。
回车,会提示你输入三次密码,建议三次都是输入密码文本的密码(复制以后邮件即可粘贴,在控制台不会显示,安心回车),成功后会在文件夹下生成domains.jks文件

如果是Tomcat9,此时还没完,Tomcat 9强制要求证书别名设置为tomcat。您需要使用以下keytool命令将protocol="HTTP/1.1"转换成protocol=“org.apache.coyote.http11.Http11NioProtocol”。

keytool -changealias -keystore domain name.jks -alias alias -destalias tomcat

在这里插入图片描述

3. 将jks文件上传到tomcat/conf目录中

这里每个人有自己的工具,不赘述。

4. 配置conf中的server.xml

找到:在这里插入图片描述
修改成以下代码:(443为https默认访问端口)

<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
              maxThreads="150" scheme="https" secure="true"
              keystoreFile="conf/domains.jks"
              keystorePass="80ISkH7c"  //这里是刚刚设定的密码文本
              clientAuth="false" sslProtocol="TLS" />

↓标题中异常的解决办法↓

①属性间没加空格②复制上面的Connector代码和文件的编码不匹配会报错都会报这个错
Catalina.start using conf/server.xml: Element type “Connector” must be followed by either attribute !
解决办法是不复制,手敲进去,或者复制进去以后把空格全删掉再加上!

找到:在这里插入图片描述
改成:在这里插入图片描述
找到:
在这里插入图片描述

改成:
在这里插入图片描述
保存,退出。

5.配置web.xml

编辑web.xml
在该文件标签(一般在文件最末尾)后面加上这样一段:

<login-config>  
    <!-- Authorization setting for SSL -->  
    <auth-method>CLIENT-CERT</auth-method>  
    <realm-name>Client Cert Users-only Area</realm-name>  
</login-config>  
<security-constraint>  
    <!-- Authorization setting for SSL -->  
    <web-resource-collection >  
        <web-resource-name >SSL</web-resource-name>  
        <url-pattern>/*</url-pattern>  
    </web-resource-collection>  
    <user-data-constraint>  
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>  
    </user-data-constraint>  
</security-constraint>

在这里插入图片描述

6.将443端口加入安全组入口

在这里插入图片描述
我是在阿里云买的服务器,所以到阿里云服务器的安全组改就行了,你在哪个厂商买的就到哪改。
有的可能不叫安全组,叫防火墙,总之把443开着,让用户能进去。

以上步骤都做完以后重启tomcat即可https访问。

如果你还有什么疑问,可以联系博主QQ1908269843,加的时候直接备注你遇到了什么情况。

7.完整server.xml文件拿去复制

Server.xml

  1. 其中keystorePass要改成自己从阿里云下载的证书文件的密码(解压后一个是pfx证书文件,一个是密码的文件)
  2. 这个文件中使用的是8080端口
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />

  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />


  <GlobalNamingResources>

    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>


  <Service name="Catalina">


    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443" />

	<Connector port="443"
    protocol="HTTP/1.1"
    SSLEnabled="true"
    scheme="https"
    secure="true"
    keystoreFile="/webservice/tomcat/tomcat/apache-tomcat-9.0.44/cert/pycxs.jks" 
    keystorePass="改成自己的"   
    clientAuth="false"
    SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"
    ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256"/>

    
    <Connector protocol="AJP/1.3"
               port="8009"
               redirectPort="443" />
    

    <Engine name="Catalina" defaultHost="localhost">

      <Realm className="org.apache.catalina.realm.LockOutRealm">

        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>
    </Engine>
  </Service>
</Server>

web.xml

这文件太长了,没必要贴了,反正就是在welcome-file-list后边加点内容:
在这里插入图片描述

<think>我们正在处理一个Android项目打包时出现的XML解析错误:Elementtype"data"mustbefollowedbyeitherattributespecifications,">"or"/>"。根据引用[1]、[2]、[3]的类似错误,我们可以推断这个错误通常是由于XML标签书写不规范导致的。具体可能的原因包括:1.XML标签的属性之间缺少空格。2.复制粘贴代码时引入了不可见的字符或编码问题。3.标签没有正确闭合(缺少结束符>或自闭合标签的/>)。在Android项目中,我们可能会在以下文件中使用<data>标签:-布局文件(如使用DataBinding时)-资源文件(如xml目录下的文件)-AndroidManifest.xml因此,我们需要检查项目中所有使用<data>标签的地方。解决方案步骤:1.**定位错误发生的文件**:在打包错误日志中,通常会指出错误发生的具体文件和行号。例如,你可能会看到类似这样的信息:[row,col]:[行号,列号]根据这个位置找到对应的XML文件。2.**检查<data>标签的语法**:确保每个<data>标签的书写符合以下规范:-属性之间必须有空格分隔。-标签必须正确闭合:如果是开始标签,后面必须有结束符“>”或自闭合的“/>”。-检查是否有属性值缺少引号。3.**检查不可见字符**:如果是从其他地方复制过来的代码,可能会包不可见字符。尝试删除<data>标签及其属性,然后手动重新输入。4.**检查整个XML文件的结构**:确保<data>标签被正确嵌套在其父标签中,并且父标签也是正确闭合的。5.**检查DataBinding的使用**:如果<data>标签是在布局文件中用于DataBinding的,那么它的典型结构如下:<layout...><data><variable.../></data>...</layout>注意:<data>标签内部通常包<variable>或<import>等子标签,不能直接写文本内容。6.**检查命名空间**:如果<data>标签使用了命名空间,确保命名空间的声明正确。例如:<dataxmlns:android="http://schemas.android.com/apk/res/android">或者<data>在根标签中已经声明了命名空间。7.**检查编码**:引用[3]中提到复制代码可能导致编码不匹配,可以尝试将文件编码转换为UTF-8(无BOM)。8.**使用AndroidStudio的XML检查工具**:AndroidStudio自带的XML检查工具可以帮助发现语法错误。打开有问题的XML文件,观察是否有红色错误提示。9.**逐步注释排查**:如果错误位置不明确,可以尝试将最近修改的XML内容注释掉,逐步排查。10.**清理和重建项目**:有时候可能是临时文件的问题,尝试清理项目(Build->CleanProject)然后重新构建。示例:一个错误的<data>标签和修正后的标签错误示例(属性间没有空格):<dataclass="User"name="user"></data>正确写法:<dataclass="User"name="user">...</data>或者自闭合(如果允许):<dataclass="User"name="user"/>注意:在DataBinding中,<data>标签通常不采用自闭合,而是包子标签。如果问题仍然存在,请提供具体的错误日志(包括文件和行号)以及相关代码片段,以便进一步分析。根据引用[4],我们也可以联想到XML标签的嵌套规则,确保<data>标签被正确嵌套在父标签内,并且其子标签也是合法的。最后,由于这个错误是XML解析错误,也可以考虑检查整个XML文件的结构是否正确,比如是否有未闭合的标签等。希望以上步骤能帮助你解决问题。</think>### Android 项目打包时 `Element type "data" must be followed by either attribute specifications '>' or '/>'` 错误解决方案 这个错误表明 XML 解析器在解析 `<data>` 标签时遇到语法问题。根据引用[1][2][3]的分析,通常是 XML 标签格式不规范导致的。以下是系统化的解决方案: #### 一、核心原因分析 1. **标签属性格式错误**(最常见) - 属性之间缺少空格分隔(如 `<data name="user"type="String">`) - 属性值引号不匹配或缺失(如 `type=String` 或 `type='String"`) - 标签未正确闭合(缺少 `>` 或 `/>`) 2. **特殊字符问题** - XML 中使用了保留字符(如 `<`, `>`, `&`)未转义 - 粘贴代码时引入不可见字符(如零宽空格) 3. **编码问题** - 文件编码不一致(如 UTF-8 with BOM 和 UTF-8 without BOM 混用) - IDE 与 Gradle 编码设置冲突 4. **嵌套结构错误** - `<data>` 标签未按规范嵌套(如在 `<layout>` 外使用 Data Binding 的 `<data>`) #### 二、解决方案步骤 ##### 1. 检查并修复标签语法(关键步骤) ```xml <!-- 错误示例(属性间无空格) --> <data name="user"type="com.example.User"> <!-- 正确修正(添加空格) --> <data name="user" type="com.example.User"> ``` ##### 2. 验证标签闭合格式 ```xml <!-- 自闭合写法 --> <data name="isVIP" type="boolean" /> <!-- 完整闭合写法 --> <data> <variable name="user" type="com.example.User" /> </data> ``` ##### 3. 检查特殊字符转义 在字符串资源或变量声明中转义特殊字符: ```xml <!-- 错误 --> <variable name="query" type="String" default="SELECT * FROM table WHERE id<10"/> <!-- 正确转义 --> <variable name="query" type="String" default="SELECT * FROM table WHERE id<10"/> ``` ##### 4. 统一文件编码 在 `app/build.gradle` 中设置统一编码: ```gradle android { compileOptions { encoding "UTF-8" } } ``` 在 Android Studio 中: 1. 打开问题文件 → File → Properties 2. 设置 "Text file encoding" 为 UTF-8 3. 勾选 "Transparent native-to-ascii conversion" ##### 5. 检查 Data Binding 结构 确保 `<data>` 标签在 `<layout>` 内正确嵌套: ```xml <!-- 正确结构 --> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="viewModel" type="com.example.ViewModel" /> </data> <LinearLayout> <!-- 布局内容 --> </LinearLayout> </layout> ``` #### 三、高级排查技巧 1. **二进制文件检查** ```bash # 使用十六进制查看器检查不可见字符 xxd problem.xml | grep '00000000:' ``` 删除任何非打印字符(特别是 `EF BB BF` BOM 标记) 2. **Gradle 清理重建** ```bash ./gradlew cleanBuildCache ./gradlew clean ./gradlew assembleDebug ``` 3. **逐段注释法** 1. 注释整个 `<data>` 区块 2. 逐行取消注释,定位问题行 3. 检查问题行的缩进和空格 #### 四、预防措施 1. 在 Android Studio 中启用实时检查: ```xml <!-- 设置 → Editor → Inspections → XML → 勾选所有验证 --> ``` 2. 安装 XML Tools 插件辅助格式化 3. 避免直接复制网页代码,使用纯文本粘贴(Ctrl+Shift+V) > **语法规范要点**:XML 要求标签属性必须用空格分隔,属性值必须用引号包裹,保留字符必须转义,这是 XML 解析的基本规则[^1][^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农民真快落

我琢磨着也没人给我打赏呀。。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值