सफल प्रमाणीकरण के बाद मुझे लोकेल सेटिंग्स बदलने की जरूरत है।

स्थानीय समाधानकर्ता:

    <bean id="localeChangeInterceptor"
    class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <property name="paramName" value="lng" />
    </bean>

   <bean id="localeResolver"
     class="web.MyLocaleResolver">
   </bean>

   public class MyLocaleResolver extends AbstractLocaleResolver {

   private Locale default = Locale.ENGLISH;

       @Override
       public Locale resolveLocale(HttpServletRequest hsr) {
           return this.default;
       }

       @Override
       public void setLocale(HttpServletRequest hsr, HttpServletResponse hsr1,         Locale default) {
           this.default = default;
       }

   }

सुरक्षा:

     <form-login login-page="/login" 
          authentication-success-handler- ref="MySuccessAuthHandler"/>
     <beans:bean id="MySuccessAuthHandler" class="web.MySuccessfulAuthenticationHandler">
         <beans:property name="defaultTargetUrl" value="/index.htm"></beans:property>
     </beans:bean>

public class MySuccessfulAuthenticationHandler extends  SavedRequestAwareAuthenticationSuccessHandler  {
  @Override
  public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
        Authentication authentication) throws ServletException, IOException {

        super.onAuthenticationSuccess(request, response, authentication);
        RequestContextUtils.getLocaleResolver(request).setLocale(request, response, Locale.ENGLISH);
   }

}

जब मैं RequestContextUtils द्वारा लोकेल सेट करने का प्रयास करता हूं तो मुझे NullPointer अपवाद मिलता है।

4
elas 6 नवम्बर 2011, 14:03
फिर स्टैक ट्रेस की पहली पंक्ति को देखें: यह आपको बताएगा कि किस फ़ाइल में अपवाद होता है। आपका कोड बहुत अजीब है: आप i18n के बारे में परवाह करते हैं, हालांकि आप प्रत्येक उपयोगकर्ता के लिए एक अद्वितीय लोकेल का समर्थन करते हैं: अंग्रेजी।
 – 
JB Nizet
6 नवम्बर 2011, 14:14

2 जवाब

काफ्केस्क से समाधान पूरा नहीं हुआ है।

लेकिन वसंत सुरक्षा दस्तावेज भी गलत है:

लोकेल कॉन्टेक्स्टहोल्डर को फिल्टर को कॉल करने से पहले सही लोकेल रखने के लिए स्थापित करने की आवश्यकता है। आप इसे या तो फ़िल्टर में स्वयं कर सकते हैं (जो web.xml में स्प्रिंग सुरक्षा फ़िल्टर से पहले आना चाहिए) या आप स्प्रिंग के RequestContextFilter का उपयोग कर सकते हैं।

देखें https://docs .spring.io/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#localization

आप RequestContextFilter का उपयोग नहीं कर सकते क्योंकि यह फ़िल्टर आपके applicationContext के अंदर किसी LocaleResolver के बारे में नहीं जानता है। यह सिर्फ request.getLocale() से लोकेल का उपयोग करता है जो कि Accept-Language हैडर है।

यदि आप इस फ़िल्टर में अपने स्वयं के लोकेल रिसोल्वर का उपयोग करना चाहते हैं तो आपको अपना खुद का लिखना होगा:

@Component
public class LocaleRequestContextFilter extends OncePerRequestFilter
{
    // basiert auf RequestContextFilter
    @Inject
    private LocaleResolver      localeResolver;

    @Override
    protected void doFilterInternal ( HttpServletRequest request, HttpServletResponse response, FilterChain filterChain ) throws ServletException, IOException
    {
        ServletRequestAttributes attributes = new ServletRequestAttributes(request, response);
        initContextHolders(request, attributes);
        try
        {
            filterChain.doFilter(request, response);
        }
        finally
        {
            resetContextHolders();
            attributes.requestCompleted();
        }
    }

    private void initContextHolders ( HttpServletRequest request, ServletRequestAttributes requestAttributes )
    {
        LocaleContextHolder.setLocaleContext(buildLocaleContext(request));
        RequestContextHolder.setRequestAttributes(requestAttributes, false);
    }

    private LocaleContext buildLocaleContext ( final HttpServletRequest request )
    {
        request.setAttribute(DispatcherServlet.LOCALE_RESOLVER_ATTRIBUTE, localeResolver);
        if (this.localeResolver instanceof LocaleContextResolver)
        {
            return ( (LocaleContextResolver) this.localeResolver ).resolveLocaleContext(request);
        }
        else
        {
            return new LocaleContext()
            {
                @Override
                public Locale getLocale ( )
                {
                    return localeResolver.resolveLocale(request);
                }
            };
        }
    }

    private void resetContextHolders ( )
    {
        LocaleContextHolder.resetLocaleContext();
        RequestContextHolder.resetRequestAttributes();
    }
}

और फिर अपना web.xml कॉन्फ़िगर करें

<filter>
    <filter-name>localeRequestContextFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>localeRequestContextFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
3
Janning 13 सितंबर 2017, 18:29
कोशिश की लेकिन RequestContextUtils.getLocaleResolver(request) रिक्त होना जारी है।
 – 
robert trudel
11 जिंदा 2018, 21:21
@ रॉबर्ट: आप गलत विधि कह रहे हैं। RequestContextUtils.getLocaleResolver (अनुरोध) के लिए जावाडोक कहता है "लोकेल रीसोलवर लौटाएं जो डिस्पैचर सर्वलेट द्वारा अनुरोध के लिए बाध्य है।"। फ़िल्टर के अंदर डिस्पैचरसर्वलेट अभी तक नहीं चला है। और आप लोकेल रीसोल्वर नहीं चाहते हैं, आप लोकेल या लोकेल कॉन्टेक्स्ट चाहते हैं। हो सकता है कि आपको यहां प्रस्तुत समाधान के संदर्भ में एक नया प्रश्न पूछना चाहिए।
 – 
Janning
16 जिंदा 2018, 13:37

भले ही स्प्रिंग सुरक्षा का उपयोग करते समय डिस्पैचरसर्वलेट सामान्य रूप से नहीं पहुंचता है, आप अपनी सुरक्षा फ़िल्टर श्रृंखला से पहले RequestContextFilter जोड़ सकते हैं जो लोकेल रीसोल्वर जैसी सभी अनुरोध विशेषताओं को उजागर करती है।

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

भले ही इससे आपका उदाहरण काम करना चाहिए। अन्य लोगों के लिए: एक अन्य विकल्प WebApplicationContextUtils.getWebApplicationContext(ServletContext) का उपयोग करके इसे ServletContext पास करना है जो HttpServletRequest में उपलब्ध है

2
Kafkaesque 16 जून 2015, 18:28