本文介紹 Tomcat 伺服器部署 中一些報錯及解決方案。

2. 數據決策系統中,中文無法搜尋

問題描述:

Tomcat 獨立部署 成功後,在決策平台內搜尋時,輸入中文無法正常搜尋,但在本地輸入中文進行搜尋是可以的。

原因分析:Tomcat 的 URIEncoding 值不是 UTF-8,導致中文被轉碼,無法被搜到。

解決方案1: 請至少使用Tomcat8以上版本部署,URIEncoding 值預設為 UTF-8。

解決方案2: 手動新增 URIEncoding 屬性值。

1)以管理者身分進入 %TOMCAT_HOME%/conf 資料夾,使用正文編輯器開啟 server.xml 檔案。

2)在server.xml檔案中,找到以下配置塊,規定了 Tomcat 監聽 HTTP 請求的埠號等資訊。

3)新增一個屬性「URIEncoding="UTF-8"」,即可讓 Tomcat 以 UTF-8 的編碼處理 get 請求。

4)儲存並關閉server.xml檔案。請參考 關閉或重啟FineReport工程 文檔,重啟Tomcat伺服器,以使配置生效。

3. JDK12 環境下報錯

4. 報錯404

4.1 案例一

問題描述:

The origin server did not find a current representation for the target resource or is not willing to disclose that one exist.

解決方案:

4.2 案例二

問題描述:

The requested resource is not available.

解決方案:

4.3 案例三

問題描述:

Tomcat 啟動報錯: fine assist start failed

解決方案:

檢查環境變數指向的 %JRE_HOME%\bin 底下沒有 attach.dll,若沒有 attach.dll 檔案,需要將 %JAVA_HOME%\jdk\jre\bin 下的 attach.dll 檔案copy到此路徑下。

4.4 案例四

問題描述:

日誌報錯: The error reported was [E:\tomcat\apache-tomcat-7.0.79\bin\tcnative-1.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform]

解決方案:

檢查 JDK 版本是否與作業系統對應,如32位的系統只能使用32位的 JDK,64位的系統只能使用64位的 JDK。

4.5 案例五

問題描述:

Tomcat 升級或更換為其他版本後,存取報表時報404錯誤,且日誌檔案中存在 RFC 系列錯誤資訊。

解決方案1:

修改 %Tomcat_HOME%\conf 目錄下的 server.xml 檔案,在 server.xml 中新增如下程式碼,重啟伺服器即可。

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" 
relaxedQueryChars='^{}[]|&quot;' />

解決方案2:

修改 %Tomcat_HOME%\conf\catalina.properties 檔案中註釋掉的這行。

#tomcat.util.http.parser.HttpParser.requestTargetAllow=|

或 將內容修改為:

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}

如果修改 server.xml 後還是中文亂碼,可以在 catalina 檔案中新增:

set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MaxPermSize=1024m -Dfile.encoding=UTF-8

5. 配置管理者密碼出錯

6. 工程部署到 Tomcat 後沒有生成 fanruan.log

問題描述:

FineReport 工程部署到 Tomcat 後, %Tomcat_HOME%\logs 資料夾下沒有生成 fanruan.log 檔案,無法查看工程執行情況。

而且報錯:

java.io.FileNotFoundException: /var/lib/tomcat8/../logs/fanruan.log (No such file or directory)

解決方案:

1)在 %Tomcat_HOME%\webapps\webroot\WEB-INF 路徑下建立一個名為 config 的資料夾。

2)在 config 資料夾中新增 log4j.properties 檔案,如下圖所示:

檔案內容如下所示:

log4j.rootLogger=${LOG_ROOT_LEVEL},standard,stdout
log4j.appender.standard=com.fr.third.apache.log4j.DailyRollingFileAppender
log4j.appender.standard.DatePattern='.'yyyy-MM-dd
log4j.appender.standard.File=${LOG_HOME}/../logs/fanruan.log
log4j.appender.standard.layout=com.fr.third.apache.log4j.PatternLayout
log4j.appender.standard.layout.ConversionPattern=%d{HH\:mm\:ss} %t %p [%c] %m%n
log4j.appender.standard.Append=true
  
log4j.appender.stdout=com.fr.third.apache.log4j.ConsoleAppender                        
log4j.appender.stdout.layout=com.fr.third.apache.log4j.PatternLayout                         
log4j.appender.stdout.layout.ConversionPattern=%d{HH\:mm\:ss} %t %p [%c] %m%n

使用者可在程式碼第四行修改日誌存放路徑。

7. 工程啟動時閃退

問題描述:

使用者將 FineReport 工程部署到 Tomcat 伺服器上,啟動 FineReport 工程時出現閃退現象;將 Tomcat 中部署的 FineReport 工程刪除,單獨啟動 Tomcat ,可以正常啟動。日誌報錯如下圖所示:

運作到 ResourceUpdateActivator 模組時閃退。

原因分析:

360 安全軟體阻擋。

解決方案:

1)把運作 java 程式的 java.exe 新增到信任中,即可正常運作。

注:該方法適用範圍:360 天擎-Windows 伺服器版。

2)若採取步驟一後還是無法啟動,需關閉「檔案系統防護」按鈕。

8. Post 提交參數過多時子報表無法顯示

9. Tomcat 前端報錯 400

問題描述

高版本 Tomcat(7.0.76以後)會嚴格按照對 RFC 3986 規範進行存取解析,而 RFC 3986 規範定義了 URL 中只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字元以及所有保留字元(RFC3986中指定了以下字元為保留字元:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。傳入的參數若不在 RFC3986中 的保留欄位中,會報 400 錯誤。

解決方案

1)修改 %Tomcat_HOME%/conf/server.xml 檔案,增加下面程式碼:

maxpostsize="209715200"
maxHttpHeaderSize="16384"
relaxedPathChars="[]|"
relaxedQueryChars="[]|{}^\`"<>"
useBodyEncodingForURI="
true"
URIEncoding="
UTF-8"

如下圖所示:

2)重啟工程。

10. 雲遷移目錄丟失

11. 請求目標中找到無效字元

問題描述:

啟動Tomcat工程報錯:在請求目標中找到無效字元。有效字元在RFC 7230和RFC 3986中定義。

原因分析:

有些地址被Tomcat收信確認存在不合法字元

7.0.76及之後版本Tomcat中的新特性,嚴格按照 RFC 3986 規範進行存取解析

RFC 3986規範定義了URL中只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字元以及所有保留字元(RFC3986中指定了以下字元為保留字元:! * ’ ( ) ; : @ & = + $ , / ? # [ ])

解決方案:

1)檢查不合法字元

檢查系統地址和地址傳參中,是否存在不合法字元。

例如在URL中傳入了一段json,傳入的參數中有"{"字元,不在RFC3986中的保留欄位中

2)放行不合法字元

在/conf/catalina.properties檔案中,找到最後註釋掉的一行

#tomcat.util.http.parser.HttpParser.requestTargetAllow=|

改成

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}

表示把{}放行