सफल प्रमाणीकरण के बाद मुझे लोकेल सेटिंग्स बदलने की जरूरत है।
स्थानीय समाधानकर्ता:
<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 अपवाद मिलता है।
2 जवाब
काफ्केस्क से समाधान पूरा नहीं हुआ है।
लेकिन वसंत सुरक्षा दस्तावेज भी गलत है:
लोकेल कॉन्टेक्स्टहोल्डर को फिल्टर को कॉल करने से पहले सही लोकेल रखने के लिए स्थापित करने की आवश्यकता है। आप इसे या तो फ़िल्टर में स्वयं कर सकते हैं (जो web.xml में स्प्रिंग सुरक्षा फ़िल्टर से पहले आना चाहिए) या आप स्प्रिंग के RequestContextFilter का उपयोग कर सकते हैं।
आप 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>
भले ही स्प्रिंग सुरक्षा का उपयोग करते समय डिस्पैचरसर्वलेट सामान्य रूप से नहीं पहुंचता है, आप अपनी सुरक्षा फ़िल्टर श्रृंखला से पहले 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 में उपलब्ध है
संबंधित सवाल
नए सवाल
java
जावा एक उच्च स्तरीय प्रोग्रामिंग भाषा है। इस टैग का उपयोग तब करें जब आपको भाषा का उपयोग करने या समझने में समस्या हो। इस टैग का उपयोग शायद ही कभी किया जाता है और इसका उपयोग अक्सर [वसंत], [वसंत-बूट], [जकार्ता-ई], [Android], [javafx], [हडूप], [श्रेणी] और [मावेन] के साथ किया जाता है।