2010-03-19 73 views
3

我使用Spring MVC + Hibernate應用程序,使用MySQL(ver.5.0.51a)和InnoDB引擎。Spring MVC + Hibernate編碼問題

當我使用西里爾文字符發送表單時出現問題。因此,數據庫包含未知編碼中的無意義字符。

所有JSP頁面,使用UTF-8創建的數據庫(+表和字段)。 Hibernate配置還包含將編碼設置爲UTF-8的屬性。

我已經通過創建使用UTF-8編碼請求內容的過濾器來解決此問題。 示範代碼:

… 
encoding = "UTF-8"; 
request.setCharacterEncoding(encoding); 
chain.doFilter(request, response); 
… 

但它明顯減慢的應用程序。

有趣的是,直接從應用程序執行插入查詢(即從Eclipse作爲Java應用程序運行)是完美的。

UPD。

據我所知,使用過濾器是我的情況下唯一的工作解決方案。

我不知道標準的CharacterEncodingFilter。現在使用它,效果很好!

<filter> 
    <filter-name>CharacterEncodingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>CharacterEncodingFilter</filter-name> 
    <url-pattern>*</url-pattern> 
</filter-mapping> 
+0

像這樣改變請求對象中的字符編碼應該*不*對應用程序的速度有明顯影響。還有什麼其他的必須進行 – 2010-03-19 01:17:55

+0

你有沒有可能聲明'doFilter()'方法是'syncrhonized'? – Bozho 2010-03-19 06:24:37

回答

3

你的JSP文件必須在兩個方面是UTF-8:

  • <%@page pageEncoding="UTF-8" %>
  • 他們的內容 - right-click > properties在日食,使他們的編碼UTF-8中(可以拒絕轉換,所以當前內容,改變編碼,然後將其粘貼回)

然後彈簧具有這種情況下的CharacterEncodingFilter,它不應該有任何顯著績效Ë擊:

<filter> 
    <filter-name>CharacterEncodingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 

其實,沒有過濾器應具有顯著的性能影響,除非其doFilter()方法聲明​​。

+0

@Bozko。我在頁眉和頁面都使用了UTF-8。 doFilter()方法不包含關鍵字«synchronized»。看起來減速只是我的主觀看法。 CharacterEncodingFilter工作正常!謝謝。 – 0x2D9A3 2010-03-19 10:10:19

+0

-1表示「如果這不起作用」。如果你的頁面不是'ISO-8859-1'(在瀏覽器端),你必須使用'CharacterEncodingFilter'來正確處理非us-ascii輸入(除非你的servlet容器違反了servlet規範,比如Jetty)。 – axtavt 2010-03-19 14:13:34

+0

@axtavt我修復了那個微小的細節。 – Bozho 2010-03-19 14:40:36

2

這是你的價格做了正確的編碼轉換:UTF-8(要求) - > UTF-16(爪哇) - > UTF-8(DB)。

我會很驚訝,但如果它(改造)花費超過百分之幾的整體請求時間。如果確實如此,有什麼事情做錯了恕我直言。

所有JSP頁面...創建使用UTF-8

請問您的集裝箱集UTF-8編碼的頁面? (請參閱生成的頁面屬性)。如果是這樣,你不需要設置過濾器,瀏覽器會以UTF-8格式提交表單。

+0

瀏覽器在提交表單時通常不會發送編碼,而servlet容器假定它是「ISO-8859-1」,所以在這種情況下過濾器是唯一正確的解決方案。 – axtavt 2010-03-19 00:52:21

+0

生成的頁面包含行 但是,正如我所提到的,沒有過濾器沒有成功。 如果您認爲轉型過程比較先進,那麼在這種情況下更好的解決方案是什麼? – 0x2D9A3 2010-03-19 01:36:02

+0

瀏覽器發送編碼 - 與頁面原始編碼相同,或UTF-8。否則,我們非拉丁裔人會如何提交可憐的多字節表單? :D – 2010-03-20 00:45:38