मेरा पहला प्रश्न यहां है और मैं विशिष्ट होने की कोशिश करूंगा। मैं वसंत के लिए काफी नया हूं और मैं काफी सरल आरक्षण प्रणाली बनाने की कोशिश कर रहा हूं (लेकिन यह वास्तव में कोई फर्क नहीं पड़ता)। क्या मायने रखता है कि मैं कुछ बुनियादी टेम्पलेट बना रहा हूं जिसे मैं वास्तविक वेबपृष्ठों द्वारा भर दूंगा। आवेदन हाइबरनेट, 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 काम नहीं किया? कोई संकेत?
मदद के लिए फिर से धन्यवाद! एन
हाय..मैंने इंटरसेप्टर की कॉन्फ़िगरेशन की कोशिश की है, लेकिन यह काम नहीं कर रहा है। मेरा लोकेल लॉगिन पेज पर नहीं बदल रहा है। लेकिन सफल लॉगिन के बाद यह ठीक काम कर रहा है। लॉगिन पेज पर यह केवल सिस्टम लोकेल पर ही मारा जाता है। –