6

मेरा पहला प्रश्न यहां है और मैं विशिष्ट होने की कोशिश करूंगा। मैं वसंत के लिए काफी नया हूं और मैं काफी सरल आरक्षण प्रणाली बनाने की कोशिश कर रहा हूं (लेकिन यह वास्तव में कोई फर्क नहीं पड़ता)। क्या मायने रखता है कि मैं कुछ बुनियादी टेम्पलेट बना रहा हूं जिसे मैं वास्तविक वेबपृष्ठों द्वारा भर दूंगा। आवेदन हाइबरनेट, MySQL पर काम करता है, मैं i18n और वसंत सुरक्षा भी स्थापित करता हूं। पोबलेम यह है कि मैं अपना लोकेल नहीं बदल सकता। काम करने वाली एकमात्र चीज डिफ़ॉल्ट बदल रही है। सबसे पहले मैंने वेब को बहुत कम किया और मुझे पता चला कि वसंत सुरक्षा के साथ एक i18n एक साथ उपयोग आमतौर पर अधिक जटिल है।वसंत सुरक्षा + i18n = इसे एक साथ कैसे काम करना है?

<filter> 
    <filter-name>localizationFilter</filter-name> 
    <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>localizationFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

क्या मुझे पता चला है कि इस फिल्टर वास्तव में सुरक्षा एक है लेकिन यह एक रूप में अनुरोध पार्स नहीं करता है से पहले संसाधित की जाती है: http://someserver.com/bla/home?locale=en क्या मैं पता चला कि मैं अतिरिक्त फिल्टर की आवश्यकता है। मैंने इसे डीबग किया और ऐसा लगता है कि यह इस उद्देश्य के लिए नहीं बनाया गया है (और यही मुझे चाहिए)। यह वसंत नमूना "संपर्क" से लिया जाता है हालांकि इस उदाहरण में मुझे कोई भी कोड नहीं मिला जो वास्तव में भाषा को बदलने में लक्षित था। प्रभाव यह है कि यह बस काम नहीं करता है। यह हमेशा लोकेल को मेरे डिफ़ॉल्ट में बदलने की कोशिश करता है। अच्छी खबर यह है कि यदि डीबग मोड में मैंने मैन्युअल रूप से लोकेल-टू-सेट को किसी अन्य व्यक्ति में बदल दिया तो यह ठीक काम करता था इसलिए मुझे अपने दिल में आशा महसूस हुई ... ;-)

फिर मुझे कुछ और रास्ता मिला - अपना खुद का फ़िल्टर बनाकर। मैंने क्या किया है RequestContextFilter कैसे बनाया गया है, इसके साथ मिला उदाहरण (उदाहरण के लिए लेखक को दोबारा नहीं) मिलाएं। सभी RequestContextFilter ठीक काम करने के बाद - बस मेरे अनुरोधों का विश्लेषण करें। आप देख सकते हैं अनुरोध पैरामीटर स्थान पार्स किया गया है और स्थान सेट कर दिया जाता

public class InternationalizationFilter extends OncePerRequestFilter { 

@Override 
public void destroy() { 
    // TODO Auto-generated method stub 

} 


@Override 
protected void doFilterInternal(final HttpServletRequest request, 
     final HttpServletResponse response, final FilterChain filterChain) 
     throws ServletException, IOException { 
    final String newLocale = request.getParameter("locale"); 
    if (newLocale != null) { 
     final Locale locale = StringUtils.parseLocaleString(newLocale 
       .toLowerCase()); 
     LocaleContextHolder.setLocale(locale); 
    } 
    try { 
     filterChain.doFilter(request, response); 
    } finally { 

     LocaleContextHolder.resetLocaleContext(); 
    } 
} 

} 

: यह नए फ़िल्टर का कोड है। 2 समस्याएं हैं: 1. अनुरोध भेजने के बाद xxxxx?locale=en यह "देश" विशेषता के बिना लोकेल बनाता है (केवल भाषा सेट है)। ईमानदार होने के लिए मुझे नहीं पता कि यह कोई समस्या है - शायद नहीं। 2. अधिक गंभीर समस्या यह है कि यह काम नहीं करता है ... मेरा मतलब है कि यह फ़िल्टर श्रृंखला (सुरक्षा से पहले) में सही जगह पर है, यह सही लोकेल का उत्पादन करता है और इसे RequestContextFilter जैसे ही ठीक से सेट करता है। .. लेकिन यह बस काम नहीं करता है।

मैं बहुत खुश अगर किसी को दे सकता है मुझे पता है मेरी उदाहरण दिया या किसी अन्य पर वसंत-सुरक्षा आधारित साथ i18n काम करने के लिए कैसे ...

धन्यवाद होगा!

अतिरिक्त जानकारी: मैंने कुछ प्रयोग किए और ऐसा लगता है कि अनुरोध से लोकेल उदाहरण किसी भी तरह विशिष्ट है। इस कोड (RequestContextFilter वर्ग संशोधित) पर

देखो:

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

    final ServletRequestAttributes attributes = new ServletRequestAttributes(
      request); 
    final Locale l = Locale.GERMAN; 
    final Locale l2 = request.getLocale(); 
    LocaleContextHolder.setLocale(l, 
      this.threadContextInheritable); 
    RequestContextHolder.setRequestAttributes(attributes, 
      this.threadContextInheritable); 
    if (logger.isDebugEnabled()) { 
     logger.debug("Bound request context to thread: " + request); 
    } 
(...) 

इस विधि के लिए यदि: LocaleContextHolder.setLocale(l, this.threadContextInheritable); मैं लोकेल 'l' यह बिल्कुल काम नहीं करता है गुजरती हैं। मेरा मतलब है कि लोकेल भी नहीं बदलता है, यह भी स्पष्ट रूप से बदल गया है। दूसरी ओर यदि मैं वहां स्थानांतरित करता हूं तो लोकेल 'एल 2' जिसे जर्मन में संशोधित किया जाता है (डीबग मोड में) यह ठीक काम करता है!

इसका मतलब है कि किसी कारण से request.getLocale() से लोकेल उदाहरण किसी भी तरह का समर्थन किया है, हो सकता है कुछ पर बाद में कोड में understant जा रहा है जो मैं नहीं जानता/...

कृपया मुझे पता कैसे देना चाहिए मैं इस i18n का उपयोग सुरक्षा कारण के साथ करता हूं, मुझे उस बिंदु पर पहुंचा जहां मुझे यह स्वीकार करना होगा कि मुझे नहीं पता कि क्या हो रहा है ...

- ==== - ====== - ====== - ======= - ====

अंतिम समाधान/उत्तर (लेकिन अभी भी छोटे प्रश्न के साथ) राल्फ के लिए धन्यवाद मैं अपनी समस्या को ठीक करने में कामयाब रहा। पहले मैं गलत दिशा में जा रहा था लेकिन आरयू उत्पन्न परियोजना ने मुझे आगे धकेल दिया। ऐसा लगता है कि मैं एक गलत/नहीं सही तरीके से इंटरसेप्टर (पिछले कोड) जोड़ने रखा:

<bean id="localeChangeInterceptor" 
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> 
</bean> 
<bean id="localeResolver" 
    class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> 
    <property name="defaultLocale" value="pl"/> 
</bean> 
<bean id="handlerMapping" 
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="interceptors"> 
     <ref bean="localeChangeInterceptor" /> 
    </property> 
</bean> 

इस तरह इंटरसेप्टर किसी कारण से लागू नहीं किया गया।

को डीईएफ़ इंटरसेप्टर बदलने के बाद:

<mvc:interceptors> 
<bean id="localeChangeInterceptor" 
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> 
</bean> 
</mvc:interceptors> 

<bean id="localeResolver" 
    class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> 
    <property name="defaultLocale" value="pl"/> 
</bean> 

<bean id="handlerMapping" 
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
</bean> 

... यह सुरक्षा/web.xml में कोई अन्य परिवर्तन के बिना ठीक से काम शुरू कर दिया।

अब समस्या खत्म हो गई है, हालांकि मुझे यकीन नहीं है कि क्या हुआ। दूसरे उदाहरण में जो मैं समझता हूं उससे (जो काम करता है) मैंने इंटरसेप्टर "ग्लोबल" बनाया है। लेकिन क्यों पहले उदाहरण में interceptor definded काम नहीं किया? कोई संकेत?

मदद के लिए फिर से धन्यवाद! एन

+0

हाय..मैंने इंटरसेप्टर की कॉन्फ़िगरेशन की कोशिश की है, लेकिन यह काम नहीं कर रहा है। मेरा लोकेल लॉगिन पेज पर नहीं बदल रहा है। लेकिन सफल लॉगिन के बाद यह ठीक काम कर रहा है। लॉगिन पेज पर यह केवल सिस्टम लोकेल पर ही मारा जाता है। –

उत्तर

1
  1. के बाद अनुरोध xxxxx भेजने? लोकेल = hi यह "देश" के बिना लोकेल बनाता विशेषता (केवल भाषा सेट कर दिया जाता)।

यह अपेक्षित व्यवहार है। जावा में कुछ प्रकार का पदानुक्रम है। देश भाषा अधिक सामान्य है।

पीछे विचार यह है कि उदाहरण के लिए आप अधिक आम धारणा में पाठ कर सकते हैं लेकिन कुछ विशिष्ट इकाइयों (जैसे मुद्रा) देश विशिष्ट फाइलों में।

@see: http://java.sun.com/developer/technicalArticles/Intl/IntlIntro/


  1. अधिक गंभीर समस्या यह है कि यह काम नहीं करता है ...

यह किसी भी हाथ बिना काम करना चाहिए कार्यान्वयन बनाया!

आपको स्थानीय चेंज इंटरसेप्टर पंजीकृत करने की आवश्यकता है, और लॉगिन पेज के लिए अनुमति सेट करने की आवश्यकता है। (applicationContext-security.xml)

// Spring Roo 1.1.5.RELEASE [rev d3a68c3] log opened at 2011-12-13 09:32:23 
project --topLevelPackage de.humanfork.test --projectName localtest --java 6 
persistence setup --database H2_IN_MEMORY --provider HIBERNATE 
ent --class ~.domain.Stuff 
field string --fieldName title 
controller all --package ~.web 
security setup 
web mvc language --code de 
web mvc language --code es 

तो फिर तुम केवल सुरक्षा फिल्टर intersept-url प्रतिमानों में परिवर्तन करना होगा जैसे मैं ऊपर से पता चला है:

<mvc:interceptors>   
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" p:paramName="lang"/> 
</mvc:interceptors> 

<http auto-config="true" use-expressions="true"> 
    <form-login login-processing-url="/resources/j_spring_security_check" login-page="/login" authentication-failure-url="/login?login_error=t"/> 
    <logout logout-url="/resources/j_spring_security_logout"/> 

    <!-- Configure these elements to secure URIs in your application --> 
    <intercept-url pattern="/login" access="permitAll" /> 
    <intercept-url pattern="/resources/**" access="permitAll" /> 
    <intercept-url pattern="/**" access="isAuthenticated()" /> 
</http> 

इस उदाहरण चल देखने के लिए, कि Roo स्क्रिप्ट के साथ एक Roo परियोजना बनाने!

अब आप एक आवेदन जहाँ उपयोगकर्ता आवेदन (जब उपयोगकर्ता के प्रवेश) में स्थानीय परिवर्तन इंटरसेप्टर के माध्यम से अपने स्थानीय बदल सकते हैं और साथ ही जब वह प्रवेश न होने के रूप में (प्रवेश पृष्ठ में)

+0

त्वरित उत्तर के लिए ठीक है धन्यवाद - यही मेरी अपेक्षा है। हो सकता है कि आप मुख्य मुद्दे (लोकेल चेंज) के मामले में भी मुझे सही रास्ते पर डाल सकें। एक बार फिर धन्यवाद! – Nirwan

+0

@ निर्वाण: मेरा विस्तारित उत्तर देखें - यह वास्तव में यह नहीं बताता कि यह आपके लिए क्यों काम नहीं करता है, लेकिन यह आपको एक उदाहरण के लिए मार्गदर्शन करता है जहां स्थानीय परिवर्तन इंटरसेप्टर अच्छी तरह से काम करता है। – Ralph

+0

धन्यवाद राल्फ। आरयू उदाहरण के साथ मैं अंत में इसे चलाने में कामयाब रहा। जैसा कि आपने कहा है कि मैन्युअल कार्यान्वयन की कोई आवश्यकता नहीं थी ... कृपया विवरण के लिए मेरा प्रश्न देखें कि क्या गलत था - हो सकता है कि आप मुझे बता सकें कि मैंने वास्तव में क्या किया क्योंकि मुझे यकीन नहीं है;) फिर भी धन्यवाद! ! – Nirwan

0
है

जब मैं जीडब्ल्यूटी ऐप के साथ काम कर रहा था तब मुझे स्थानीयकरण के साथ एक ही समस्या थी। मैंने जो मुद्दा देखा था वह यह था कि जब हम

<filter-mapping> 
<filter-name>localizationFilter</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping> 

फ़िल्टर पर, यहां तक ​​कि छवि अनुरोध फ़िल्टर पर रूट किए जाते हैं। ये अनुरोध कभी-कभी लोकेल पैरामीटर छोड़ देते हैं और इसलिए जब एकाधिक अनुरोध फ़िल्टर को दबाते हैं, तो लोकेल पैरामीटर नहीं था। इसलिए जैसे ही मुझे लोकेल पैरामीटर प्राप्त हुआ, मैंने इसे एक सत्र में रखा। सभी अनुरोध शीर्षलेखों और मानों को लॉग करें और आपको मूल कारण मिल सकता है।

संबंधित मुद्दे