顯示具有 tomcat 標籤的文章。 顯示所有文章
顯示具有 tomcat 標籤的文章。 顯示所有文章

2024-09-13

TOMCAT設定特定目錄不得執行JSP及JSPX

如果網站允許使用者上傳檔案,通常會禁止上傳可執行檔(如jsp & jspx),

除了檢查副檔名外,也可在app的web.xml加上以下設定,讓jsp/jspx變成唯讀:

<servlet>

        <servlet-name>DefaultServlet</servlet-name>

        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>

        <init-param>

            <param-name>readonly</param-name>

            <param-value>true</param-value>

        </init-param>

        <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>

        <servlet-name>DefaultServlet</servlet-name>

        <url-pattern>/path/to/upload/*</url-pattern>

    </servlet-mapping>


但像jspx一般也很少人會去寫,建議直接在tomcat/conf/web.xml禁用:

<servlet-mapping>

        <servlet-name>jsp</servlet-name>

        <url-pattern>*.jsp</url-pattern>

        <!--<url-pattern>*.jspx</url-pattern>-->

 </servlet-mapping>

2022-09-08

Netbeans 啟動 tomcat 時,顯示"Starting of Tomcat failed, the server port 8084 is already in use."(8084端口被占用)

 在netbeans設定tomcat時,若port設定為8084,且又打開 HTTP monitor功能的話,會導致tomcat開啟不了,顯示"Starting of Tomcat failed, the server port 8084 is already in use."

這是因為HTTP Monitor打開後,netbeans會啟動內建的tomcat 3 server,導致占port 8084,
要嘛將Server port改掉,要嘛關掉HTTP Monitor (這功能是會在HTTP Server Monitor顯示GET/POST等訪問紀錄)


另外,netbeans的web專案要是出現 "Deployment descriptor directory could not be found" 訊息,那可能就是少了web.xml 或WEB-INF資料夾,在專案按右鍵新增web.xml檔案即可。

2022-04-21

tomcat 9 發生 "too many open files" (開啟太多檔案)

 前二天早上tomcat突然掛掉,log 顯示如下:

  20-Apr-2022 10:22:41.714 嚴重 [https-jsse-nio2-8443-Acceptor-0] org.apache.tomcat.util.net.Acceptor.run Socket accept failed
 java.util.concurrent.ExecutionException: java.io.IOException: 開啟太多檔案
	at sun.nio.ch.CompletedFuture.get(CompletedFuture.java:69)
	at org.apache.tomcat.util.net.Nio2Endpoint.serverSocketAccept(Nio2Endpoint.java:334)
	at org.apache.tomcat.util.net.Nio2Endpoint.serverSocketAccept(Nio2Endpoint.java:59)
	at org.apache.tomcat.util.net.Acceptor.run(Acceptor.java:95)
	at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: 開啟太多檔案
	at sun.nio.ch.UnixAsynchronousServerSocketChannelImpl.accept0(Native Method)
	at sun.nio.ch.UnixAsynchronousServerSocketChannelImpl.accept(UnixAsynchronousServerSocketChannelImpl.java:344)
	at sun.nio.ch.UnixAsynchronousServerSocketChannelImpl.implAccept(UnixAsynchronousServerSocketChannelImpl.java:280)
	at sun.nio.ch.AsynchronousServerSocketChannelImpl.accept(AsynchronousServerSocketChannelImpl.java:125)
	... 4 more

初步調查是tomcat開啟了太多檔案,造成"too many open files" (開啟太多檔案),網路上一般說法是說要調整系統的ulimit上限才行,但想想不太對,這系統會需要同時開啟的檔案不多,而且運行了幾年也沒有發生file leak的狀況。

先找出tomcat的pid,再用 ls -al /proc/<pid>/fd | wc -l,就可以知道tomcat目前開啟多少檔案(包含unix socket file)。

後來發現是tomcat自已的bug,會一直存取tomcat-users.xml卻沒有釋放資源,解法是升級 tomcat 9 >= 9.0.14+,或修改 server.xml,加入watchSource="false":

<resource 
 auth="Container"
 description="User database that can be updated and saved"
 factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
 name="UserDatabase" pathname="conf/tomcat-users.xml"
 type="org.apache.catalina.UserDatabase"
 watchsource="false">
ref:
https://bz.apache.org/bugzilla/show_bug.cgi?id=62924#c2
https://zhuanlan.zhihu.com/p/75897823
https://www.cnblogs.com/linus-tan/p/10328801.html

2021-08-25

tomcat啟用jstatd及jmx (VisualVM)

因為jmx及jstatd二個用VisualVM連線時,jmx無法使用Visual GC,jstatd無法使用Mbeans(怎麼這麼煩啊),所以二個乾脆都給它同時啟用。


1.新增 /usr/lib/systemd/system/tomcat-jstatd.service:(jstatd預設port開在1099)
#Tomcat jstatd monotor service
[Unit]
Description=jstatd monitor for tomcat
Wants==tomcat.service
After=tomcat.service

[Service]
Type=simple
ExecStartPre=/bin/bash -c "echo -e 'grant { permission java.security.AllPermission; };' > /tmp/jstatd.policy"
ExecStart=/usr/bin/jstatd -p 1099 -J-Djava.security.policy=/tmp/jstatd.policy -J-Djava.rmi.server.hostname=<your_public_ip>
ExecStopPost=/bin/bash -c "rm /tmp/jstatd.policy"
User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target

2.修改  /usr/lib/systemd/system/tomcat.service: (rmi port固定在1100,若不設定的話會隨機; jmx port開在1101,一定要設)

[Service]
...
#JMX form VisualVMEnvironment='JAVA_OPTS=-Djava.rmi.server.hostname=<your_public_ip> -Dcom.sun.management.jmxremote.rmi.port=1101 -Dcom.sun.management.jmxremote.port=1100 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false'


3.防火牆規則記得修改開通1099, 1100, 1101,不過我是直接把自已的網段加入zone=trusted,這樣所有的port都可以連:

sudo firewall-cmd --zone=trusted --add-source=100.101.102.0/24 --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all --zone=trusted

ref:
https://tomcat.apache.org/tomcat-10.1-doc/monitoring.html#Enabling_JMX_Remote

2021-08-24

升級JDK 1.8至最新版本後,MySQL Connector/J (TOMCAT JDBC)無法正常連線MySQL

升級JDK後,發現MYSQL JDBC無法連到資料庫,查了一下log,發現以下錯誤訊息:

javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

看來又是TLS無法自動降級使用的問題,先到mysql下指令看一下目前使用的tls版本:

mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';
+---------------+-----------------------+
| Variable_name | Value                 |
+---------------+-----------------------+
| tls_version   | TLSv1,TLSv1.1      |
+---------------+-----------------------+

1.首先嘗試修改JDBC連線字串,加入
jdbc:mysql://<host>:<port>/<dbname>?enabledTLSProtocols=TLSv1,TLSv1.1(...後略)

然後在tomcat.service的Java啟動選項加入:
‑Djdk.tls.client.protocols="TLSv1,TLSv1.1,TLSv1.2" (但不清楚是不是會影響到tomcat網站的tls 1.3連線)

結果無效。
  
2.直接去jre修改/jre/lib/security/java.security,把以下統統mark起來
#jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
#    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
#    include jdk.disabled.namedCurves

好了,JDBC連線字串跟tomcat.service復原回原來也沒問題。
  
由於試了太多次,還被mysql server block了,用以下指令可以解除:
mysqladmin -h 192.168.1.1 -u root -p flush-hosts

ref:

2021-06-18

tomcat若前面有proxy,但又有阻擋ip的需求

 tomcat若前面有proxy,但又有阻擋ip的需求,可以如下設定
(假設ip放在X-Forwarded-For裡):

<Valve className="org.apache.catalina.valves.RemoteIpValve"

        remoteIpHeader="X-Forwarded-For" 

        requestAttributesEnabled="true" />

<Valve className="org.apache.catalina.valves.RemoteAddrValve"

   deny="1\.2\.3\.\d+|5\.5\.\d+\.\d+" />


REF:
https://tomcat.apache.org/tomcat-8.0-doc/config/valve.html#Proxies_Support
https://stackoverflow.com/questions/33495416/restrict-access-to-tomcat-manager-by-ip

2021-05-20

tomcat 版本slowlirs dos攻擊修改

 很簡單,Connector加上connectionTimeout="8000" (不要大於8秒,不然會失敗) 即可,

測試工具:

https://github.com/shekyan/slowhttptest/wiki


ref

https://stackoverflow.com/questions/49442855/mitigating-slow-http-post-vulnerability-on-tomcat-8

2021-02-25

tomcat 使用特殊字元網址或參數,造成400 bad request錯誤訊息

tomcat 使用特殊字元網址或參數,會造成400 bad request錯誤訊息,即使在web.xml設置error-page也無法禁止顯示系統報告(想不透...),需更改 server.xml,在<Host>加入:

<Valve className="org.apache.catalina.valves.ErrorReportValve" errorCode.0="conf/error.html" showReport="false" showServerInfo="false" />

其中 errorCode.0代表所有錯誤訊息,error.html 選擇使用$CATALINA_BASE相對路徑放在conf/error.html

ref:

https://stackoverflow.com/questions/794329/disable-all-default-http-error-response-content-in-tomcat

http://tomcat.apache.org/tomcat-9.0-doc/config/valve.html#Error_Report_Valve

2018-04-29

CenOS上升級JRE及TOMCAT

切換為root
sudo -i

安裝tomcat9
cd /www
wget http://ftp.mirror.tw/pub/apache/tomcat/tomcat-9/v9.0.7/bin/apache-tomcat-9.0.7.tar.gz
tar zxvf apache-tomcat-9.0.7.tar.gz

新增tomcat使用者及群組
groupadd tomcat useradd -s /bin/false -g tomcat -d /www/apache-tomcat-9.0.7 tomcat

修改tomcat目錄owner及group
chwon -hR tomcat.tomcat /www/apache-tomcat-9.0.7

安裝jre
cd /usr/java
wget https://www.oracle.com/paht/to/jre/for/jdk-XXX-linux-x64.tar.gz
tar zxvf jre-XXX-linux-x64.tar.gz
alternatives --install /usr/bin/java java /usr/java/jdkXXX/jre/bin/java 300
rm latest
ln -s /usr/java/jdkXXX latest

修改jre路徑
update-alternatives --config java

移除原來jre
sudo update-alternatives --remove java /usr/java/jdk_oldXXX/jre/bin/java

重建並移除無用soft link
cd /etc/alternatives
ln -sf /usr/java/jdkXXX/jre/bin/* .
ln -sf /usr/java/jdkXXX/bin/* .
ln -sf /usr/java/jdkXXX/man/man1/* .
find -xtype l -delete

修改 /etc/profile
-----------------
...
export JAVA_HOME=/usr/java/jdkXXX
export CATALINA_HOME=/apps/tomcat-x.x.x
-----------------
source /etc/profile
java -version
echo $JAVA_HOME

修改 /etc/systemd/system/multi-user.target.wants/tomcat.service
將 jre跟tomcat路徑改掉
=====================
# Systemd unit file for tomcat
[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target

[Service]
Type=forking
User=tomcat
Group=tomcat

#restart after failure
Restart=on-failure
RestartSec=5
TimeoutStartSec=60
TimeoutStopSec=60


export JAVA_HOME=/usr/java/jdk1.8.0_172
export CATALINA_HOME=/apps/tomcat-9.0.7

Environment=JAVA_HOME=/usr/java/jdk1.8.0_172
Environment=CATALINA_PID=/apps/tomcat-9.0.7/temp/tomcat.pid
Environment=CATALINA_HOME=/apps/tomcat-9.0.7
Environment=CATALINA_BASE=/apps/tomcat-9.0.7
Environment='CATALINA_OPTS=-Xms512M -Xmx4096M -server -XX:+UseParallelGC'
#Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'

ExecStart=/apps/tomcat-9.0.7/bin/startup.sh
ExecStop=/apps/tomcat-9.0.7/bin/shutdown.sh
#ExecStop=/bin/kill -15 $MAINPID

[Install]
WantedBy=multi-user.target
=====================
systemctl daemon-reload

=========
找出檔案的mod number
stat --format '%a' filename

找出有+s的檔案
find . -perm -4000
find . -perm -2000

ref:

2018-03-23

修改TOMCAT的預設ROOT位置

方法一(建議):
新增一個要做為網站根目錄的資料夾(注意不可放在webapps裡,以免重複deploy)
新增 ROOT.xml 到 conf\Catalina\localhost
(ROOT名稱不可改變,且為大寫,因為路徑是以xml的檔名判斷的)
ROOT.xml 新增一行(其中path屬性可不需要,因如前述原因,是以xml的檔名為路徑)
<Context path="" docBase="資料夾所在的絕對路徑,或相對於webapps的相對路徑" />


方法二:
新增一個要做為網站根目錄的資料夾(可放在webapps裡,也可放其它地方)
修改 conf/server.xml
修改<Host>屬性 autoDeploy = fasle, deployOnStartup = false 以免自動deploy
在 <Host> 標籤中新增(需要 path = "" 即路徑為 \ )
<Context path="" docBase="資料夾所在的絕對路徑,或相對於webapps的相對路徑" />

ref:
https://stackoverflow.com/questions/715506/how-to-change-the-root-application
http://staraphd.blogspot.tw/2009/10/change-default-root-folder-in-tomcat.html

2017-10-23

讓TOMCAT 8.5, TOMCAT 9 支援 SSL over HTTP/2

TOMCAT 8.5以上可支援HTTP/2,而HTTP/2+ALPN為目前瀏覽器支援的主流,
需要openssl的支援,而舊版本openssl只支援NPN,
若要支援ALPN,那麼openssl版本需 >= 1.0.2,
若未滿足上述條件,瀏覽器會自動降級為使用HTTP/1.1協定,
或瀏覽器本來就不支援HTTP/2,伺服器會改使用HTTP/1.1協定。

TOMCAT 8.5要支援HTTP/2需要使用APR(Tomcat Native library)
TOMCAT9.X要支援HTTP/2,可以使用APR,或使用Java >=9版本(建議)。

(UPDATE: TOMCAT 8.5 +JDK8使用APR有不太穩定的現象,建議升級為TOMCAT 9)
(UPDATE: TOMCAT 9 +JDK8使用APR運行了幾天後突然噴掉,查了 /tmp/hs_err_pid22617.log
,stack trace顯示錯誤為:
Stack: [0x00007f2eb16f8000,0x00007f2eb17f9000], sp=0x00007f2eb17f74a0, free space=1021k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [libc.so.6+0x7c418] _int_free+0x2f8

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
J 7361 org.apache.tomcat.jni.Socket.destroy(J)V (0 bytes) @ 0x00007f2ec140ba81 [0x00007f2ec140ba40+0x41]

看起來是底層系統做記憶體回收時噴掉,網路上一查似乎很多人都有不定時噴掉的情形,
看來APR似乎是不太可靠…或者是libc.so要去更新才行,因此為了暫時解決此問題,
在tomcat.service加了crash後自動restart的機制:
[Service]
...
Restart=on-failure
RestartSec=5
TimeoutStartSec=60
TimeoutStopSec=60

1.先確定OPENSSL >= 1.0.2,若不是請先升級
openssl version
==> OpenSSL 1.0.2k-fips  26 Jan 2017

2.安裝gcc、OpenSSL libraries及APR library,等下編譯 tc-native需用到
apt-get install gcc libapr1.0-dev libssl-dev

yum install apr-devel openssl-devel
/usr/bin/apr-1-config --version
==> 1.4.8


注意最後訊息所顯示的apr安裝位置,譬如CentOS用yum是安裝在/usr/bin/apr-1-config

3.下載Apache Tomcat Native Library,解壓縮,./configure,make,make install
(可直接使用tomcat/bin/tomcat-native.tar.gz)
(新版下載位置:http://tomcat.apache.org/download-native.cgi)
cd path/to/tomcat/bin/
tar zxvf ttomcat-native.tar.gz
cd tomcat-native-1.2.16-src/native

自動安裝到tomcat/lib:
./configure --prefix=$CATALINA_HOME
make
make install

或不make install,手動搬移library(建議):
./configure && make
mkdir -p path/to/tomcat/lib_tc
cp .libs/* path/to/tomcat/lib_tc
chown -R tomcat.tomcat path/to/tomcat/lib_tc
cd path/to/tomcat/lib_tc
ln -f -s libtcnative-1.so libtcnative-1.so.0.2.16
ln -f -s libtcnative-1.so.0 libtcnative-1.so.0.2.16

4.make install後,會在tomcat/lib多了
libtcnative-1.a
libtcnative-1.la
libtcnative-1.lai
libtcnative-1.so (link)
libtcnative-1.so.0 (link)
libtcnative-1.so.0.2.16
這些函式庫檔案跟目錄,記得檢查並chmod及chown一下。

5.之後我們需要把這些lib路徑加到環境變數LD_LIBRARY_PATH,
可以用編輯tomcat/bin/setenv.sh的方法(無此檔案請自行新增),加入:

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CATALINA_HOME/lib_tc
export LD_LIBRARY_PATH

記得chmod +x setenv.sh

6.修改tomcat/conf/server.xml

檢查一下AprLifecycleListener是否有加入此行啟動監聽:
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

修改Connector,注意憑證需轉換為PEM格式
<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
            maxThreads="150" SSLEnabled="true" >
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
    <SSLHostConfig>
      <Certificate certificateKeyFile="conf/private_key.pkcs8"
                        certificateChainFile="conf/ca_chain.cer"
                        certificateFile="conf/ca.cer"/>
    </SSLHostConfig>
</Connector>

若無申請正式憑證,可先自行生成自簽憑證使用:
openssl genrsa -out private_key.pkcs8 2048
openssl rsa -in private_key.pkcs8 -out private_key.pkcs8
openssl req -new -x509 -key private_key.pkcs8 -out ca.crt -days 3650


7.重啟TOMCAT,
檢查catalina logs是否成功載入APR
INFO: Loaded APR based Apache Tomcat Native library [1.x.y]
["https-openssl-apr-8443"]
如有以上訊息代表成功。


上述做法我在tomcat 9是成功的,但tomcat 8.5.4似乎有掉資料的現象,所以建議升級至TOMCAT 9。

TOMCAT9的HTTP/2若不使用APR,需使用JDK >= 9,這樣Connector就直接使用NIO2就好而不需要用到APR。

ref:
http://tomcat.apache.org/whichversion.html
https://tomcat.apache.org/tomcat-9.0-doc/config/http2.html
https://linux.cn/article-7934-1.html
https://dzone.com/articles/configure-tomcat-9-forhttp2
https://stackoverflow.com/questions/30855281/tomcat-support-for-http-2-0/37889873#37889873
https://readlearncode.com/configure-tomcat-9-for-http2/
http://tomcat.apache.org/native-doc/
https://tomcat.apache.org/tomcat-8.5-doc/apr.html
http://jmchung.github.io/blog/2013/09/06/centos-installing-apache-portable-runtime-apr-for-tomcat/

2017-06-04

tomcat server的CPU突然飆高,連線遺失

今天發現在VM上面RUN的TOMCAT會隨機掉連線(400, 500都出現了),
密集REQUEST的時候就會發生問題,而且CPU TIME都超過100%了!
後來發現是 server.xml 中 connector 的問題,預設是用 org.apache.coyote.http11.Http11NioProtocol (NIO),
後來改為 org.apache.coyote.http11.Http11Nio2Protocol (NIO2),
然後就,好了,也不知道是不是舊 NIO 跟 VM 犯沖,改成效能比較好的NIO2似乎就沒事兒了。

2017-03-31

TOMCAT的安全性header設定

TOMCAT有內建一些關於CORS及SECURITY的HEADER, 可以的話建議打開,以利用瀏覽器所提供的安全性功能,以下是個人常用的預設設定:

修改 tomcat-home/conf/web.xml (對所有apps生效):

    HeaderSecurityFilter
    org.apache.catalina.filters.HttpHeaderSecurityFilter
    
      hstsEnabledtrue
    
      hstsMaxAgeSeconds15768000
    
      hstsIncludeSubDomainstrue
    
      antiClickJackingEnabledtrue
    
      antiClickJackingOptionSAMEORIGIN
    
      antiClickJackingUri
    
      blockContentTypeSniffingEnabledtrue
    
      xssProtectionEnabledtrue


  CorsFilter
org.apache.catalina.filters.CorsFilter
  
    cors.allowed.originshttps://your.domain.com
  



    HeaderSecurityFilter
    /*
    
    REQUEST
    FORWARD
    INCLUDE
    ERROR
    ASYNC


    CorsFilter
    /*
    
    REQUEST
    FORWARD
    INCLUDE
    ERROR
    ASYNC



ref:
https://tomcat.apache.org/tomcat-8.5-doc/config/filter.html#CORS_Filter
https://tomcat.apache.org/tomcat-8.5-doc/config/filter.html#HTTP_Header_Security_Filter
https://wiki.mozilla.org/Security/Guidelines/Web_Security#Content_Security_Policy
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
HTTP Headers 的資安議題 (1)
HTTP Headers 的資安議題 (2)
HTTP Headers 的資安議題 (3)

TOMCAT自訂共用library目錄

常常TOMCAT裡的apps都會共用一些library,而通常的做法是直接丟到${catalina.base}/lib裡面去,不過有時在搬移網站時,常常就會忘了哪些是自已新增的lib.jar了 XDD
因此可以另外建一個目錄來放自已的共用jar library。譬如先建一個common-lib專放自已共用的jar:

修改/conf/catalina.properties的shared.loader or common.loader屬性,新增路徑:
shared.loader="${catalina.base}/common-lib","${catalina.base}/common-lib/*.jar","${catalina.home}/common-lib","${catalina.home}/common-lib/*.jar"
...或
common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar"

2017-03-27

讓TOMCAT能辨識URLEncode的中文檔名

TOMCAT預設是以ISO-8859-1來解讀經過URL Encode的URL的,因此要改為告訴TOMCAT所有URL經過URL Decode後要以UTF-8來解讀。

修改 bin/catalina.sh:
JAVA_OPTS="-Djavax.servlet.request.encoding=UTF-8 -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Duser.timezone=GMT+08 ${JAVA_OPTS}"
(-Dsun.jnu.encoding=UTF-8可有可無)

或修改 conf/web.xml (有修改catalina.sh就不用改web.xml)

 
 
        setCharacterEncodingFilter
        org.apache.catalina.filters.SetCharacterEncodingFilter
        
            encoding            UTF-8        
 

  
  
        setCharacterEncodingFilter
        /*
  

修改 conf/server.xml:
<Connector port="80" protocol="HTTP/1.1"
...
URIEncoding="utf-8" useBodyEncodingForURI="true"
...
>

URIEncoding:對於URI,決定要以何種編碼來處理。
useBodyEncodingForURI:對於URI,決定是否要以request HEADER中的Content-Type中的編碼類型訊息、或request.setCharacterEncoding()方法中指定的編碼來處理,若為false則一律以URIEncoding所指定的編碼來處理。

而編寫網頁時,最好能自行將下載鏈結等先做URL Encode,而不是讓瀏覽器去幫你做,因為不是每個瀏覽器都會自動以URL Encode(UTF-8)來傳送的。 如果是有在寫jsp,那麼在web.xml加上:

  
    *.jsp
    UTF-8
  

2017-02-26

對遠端的tomcat除錯,且又有二個以上專案時

如果對遠端的tomcat用netbeans除錯,且伺服器又有二個以上的專案,

必須在netbeans的 Window/Debugging/Sources 視窗去調整 source 的順序,

因為預設是以在遠端找到的第一個專案來除錯,反正要除錯的專案就在source往前調整就是了,

不然就會陷入無限的鬼打牆,怎麼斷點都會跟你說無法submit到遠端伺服器。

2016-09-06

tomcat 8.5 在 netbeans上無法正常運作 (netbeans無法得知tomcat已啟動)

今天在mac上跑tomcat 8.5遇到很雷的事,
在netbeans上設定tomcat 8.5後,過一陣子netbeans會報tomcat start fail,
但實際上server log是顯示有正常啟動tomcat的,
後來發現是Server header的問題,因此從8.5後開始,必須手動在server.xml加一個「server="Apache-Coyote/1.1"」的attribute:



然後…然後就好了。真的很雷。

ref:
http://stackoverflow.com/questions/22225764/starting-of-tomcat-failed-from-netbeans

2016-08-30

TOMCAT伺服器無回應!

今天一大早進辦公室就在救火,原因是人事系統掛掉了...

掛的方式很奇怪,一開始重啟會維持幾分鐘的正常,之後就無回應了,

仔細點說,就是TCP/IP有成功連線到TOMCAT,但沒有回應字串,直到TIMEOUT。

這種半路就死的反而是最難找原因的,

於是大家就開始猜了,防火牆、資料庫、connection pool.....開始找原因,

最後還把application乾脆移到新的tomcat主機,還是會死掉。

後來我在application的context.xml加了一個設定:


...

...


讓server log 十秒以上沒反應的程式,結果發現是一個syslog程式作怪,把那段程式移除就好了。

(但沒移除之前也活得好好的呀...超怪)

ref:
http://stackoverflow.com/questions/7145131/tomcat-request-timeout
http://tomcat.apache.org/tomcat-7.0-doc/config/valve.html#Stuck_Thread_Detection_Valve