問題起因:
今天遇到一個(gè)亂碼問題,以前已經(jīng)配置好了的呀。而且是普遍現(xiàn)象,看來是公共的變更引起的問題。
分析過程:
于是開始進(jìn)行調(diào)試,因?yàn)槭枪矄栴},所以就對web.xml最近的變更進(jìn)行增刪調(diào)試,發(fā)現(xiàn)如果使用SecurityFilter就報(bào)錯(cuò),去掉久正常了。
仔細(xì)檢查,發(fā)現(xiàn)如下現(xiàn)象:
1、在設(shè)置字符集之前, 提前調(diào)用了request.getParameter()方法,就會出現(xiàn)問題。即使后來再設(shè)置字符集,隨后的action接收的數(shù)據(jù)也會亂碼。
2、對于同一個(gè)url,如:*.do,filter-mapping 是有順序的,按照web.xml中的配置順序。
從網(wǎng)上查到的結(jié)論:
根據(jù)servlet2.3規(guī)范filter執(zhí)行是按照web.xml配置的filter-mapping先后順序進(jìn)行執(zhí)行,所以上面的配置會導(dǎo)致遇見*.do的url請求,先進(jìn)行SecurityFilter的過濾器處理,這時(shí)候沒有做編碼處理,已經(jīng)是亂碼,到下面的filter處理時(shí)已經(jīng)時(shí)亂碼,再做編碼處理已經(jīng)沒有用處。
解決辦法:
錯(cuò)誤的順序:
<filter-mapping>
<filter-name>SecurityFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CharacterEncoding</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CharacterEncoding</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
正確的順序:
<filter-mapping>
<filter-name>CharacterEncoding</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CharacterEncoding</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>SecurityFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>