2012-07-27 15 views
6

मैं स्प्रिंग एमवीसी द्वारा प्रदान किए गए कैरेक्टर एन्कोडिंगफिल्टर पर एक नज़र डाल रहा था। मैं सोच रहा था कि अनुरोध एन्कोडिंग को दिए गए एन्कोडिंग पर मजबूर होने पर प्रतिक्रिया एन्कोडिंग क्यों सेट करना संभव था? स्वीकृति हेडर फ़ील्ड में कुछ भी निर्दिष्ट नहीं होने पर डिफ़ॉल्ट प्रतिक्रिया एन्कोडिंग सेट करने में सक्षम क्यों नहीं हो? या अगर अनुरोध में कोई एन्कोडिंग मौजूद नहीं थी?स्प्रिंग एमवीसी: कैरेक्टर एन्कोडिंगफिल्टर; बलपूर्वक प्रतिक्रिया एन्कोडिंग क्यों सेट करें?

कोड:

@Override 
protected void doFilterInternal(
    HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 
    throws ServletException, IOException { 

    if (this.encoding != null && (this.forceEncoding 
     || request.getCharacterEncoding() == null)) { 

    request.setCharacterEncoding(this.encoding); 
    if (this.forceEncoding) { 
     response.setCharacterEncoding(this.encoding); 
    } 
    } 
    filterChain.doFilter(request, response); 
} 

मैं संदर्भ https://jira.springsource.org/browse/SPR-3328?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel बताते हुए प्रतिक्रिया एन्कोडिंग केवल सेट किया जा सकता है कि जब अनुरोध एन्कोडिंग जबरन सेट किया गया है के रूप में इस पाया। क्यूं कर?

अग्रिम धन्यवाद, मार्टिन

+1

संभवतः यह http://stackoverflow.com/questions/3616359/who-sets-response-content-type साथ संबंधित है -इन-वसंत-एमवीसी-प्रतिक्रियाकर्ता (अगर मुझे कुछ याद नहीं आ रहा है) –

उत्तर

5

मैं आपको बता सकता क्या जुएर्गेन Hoeller लिंक https://jira.springsource.org/browse/SPR-3328?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel पर कहते हैं,

web.xml (सर्वलेट 2.4+) एन्कोडिंग सेट करने के लिए में

जोड़ें निम्न फ़िल्टर:

<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> 

संपादित करें:

CharacterEncodingFilter: Cu ट्रेंट ब्राउज़र आमतौर पर HTML पृष्ठ या फ़ॉर्म में निर्दिष्ट होने पर भी एक वर्ण एन्कोडिंग सेट नहीं करते हैं। उपरोक्त फ़िल्टर या तो एन्कोडिंग लागू कर सकता है अगर अनुरोध पहले से ही एन्कोडिंग निर्दिष्ट नहीं करता है, या किसी भी मामले में इस फ़िल्टर के एन्कोडिंग को लागू करता है ("forceEncoding" = "true")। अगर हम कड़ाई से पात्रों को एन्कोड करना चाहते हैं, तो हम इसे जबरन सेट करते हैं।

  1. कारण है कि यह प्रतिक्रिया एन्कोडिंग सेट करने के लिए जब अनुरोध एन्कोडिंग दिया एन्कोडिंग के लिए मजबूर किया गया था ही संभव था?
  2. स्वीकृति हेडर फ़ील्ड में कुछ भी निर्दिष्ट नहीं होने पर डिफ़ॉल्ट प्रतिक्रिया एन्कोडिंग सेट करने में सक्षम क्यों नहीं है? या अगर अनुरोध में कोई एन्कोडिंग मौजूद नहीं थी?

मुझे लगता है कि Boris'slink टिप्पणी में इन सवालों का जवाब देंगे।

+0

आपके उत्तर के लिए धन्यवाद। लेकिन यह अनुरोध पर एन्कोडिंग को भी मजबूर करेगा। मैं जानना चाहता हूं कि प्रतिक्रिया एन्कोडिंग सेट करने के लिए वे अनुरोध एन्कोडिंग को क्यों सेट करते हैं। –

+0

@ मार्टिन बेकर: अद्यतन उत्तर, मुझे उम्मीद है कि यह आपको स्पष्ट करता है। –

+0

टॉमकैट 6 में यह काम नहीं करेगा..क्या करना है? –

0

यदि कुछ और काम नहीं करता है, तो आप सुरक्षा-Context.xml में एक फ़िल्टर (बीन) बना सकते हैं और बल सेट कर सकते हैं = सत्य;

<bean id="characterEncodingFilter" class="org.springframework.web.filter.CharacterEncodingFilter"> 
    <property name="encoding" value="utf-8"></property> 
    <property name="forceEncoding" value="true"></property> 
</bean> 

मत भूलना नई कस्टम फ़िल्टर सेट करने के लिए:

<security:custom-filter ref="characterEncodingFilter" after="FIRST"/> 
संबंधित मुद्दे