Mi primera pregunta aquí y trataré de ser específico. Soy bastante nuevo en Spring y estoy tratando de crear un sistema de reservas bastante simple (pero esto en realidad no importa). Lo que importa es que estoy creando una plantilla básica que luego completaré con páginas web reales. La aplicación funciona en hibernate, mysql, también configuro i18n y seguridad de primavera. El problema es que no puedo cambiar mi configuración regional. Lo único que funciona es cambiar el predeterminado. Primero busqué Web MUCHO y descubrí que el uso de un i18n junto con la seguridad de primavera es más complicado que generalmente. Lo que descubrí es que necesito tener filtro adicional:Seguridad de primavera + i18n = ¿cómo hacerlo funcionar juntos?
<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>
Lo que descubrí es que este filtro es de hecho procesada antes de que la seguridad único sin embargo, no analiza la petición en un formulario: http://someserver.com/bla/home?locale=en
. Lo depuré y parece que no fue creado para tal fin (y eso es lo que necesito). Esto se toma de los "contactos" de muestra de primavera, sin embargo, en este ejemplo, no pude encontrar ningún código que realmente estuviera destinado a cambiar el idioma. El efecto es que simplemente no funciona. Siempre trata de cambiar la configuración regional a la predeterminada. La buena noticia es que si en el modo de depuración cambiaba manualmente la configuración regional a otra, funcionaba bien, así que sentí la esperanza en mi corazón ... ;-)
Luego he encontrado otra manera - creando nuestro propio filtro. Lo que hice fue fusionar el ejemplo encontrado (no recuerdo al autor) junto con la forma en que se creó RequestContextFilter
. Después de todo, el RequestContextFilter
funciona bien, simplemente no analice mis solicitudes. Eso es código del nuevo filtro:
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();
}
}
}
Como se puede ver la configuración regional solicitud parametro se analiza y la configuración regional está establecida. Hay 2 problemas: 1. Después de enviar la solicitud xxxxx?locale=en
, crea la configuración regional sin el atributo "país" (solo se establece el idioma). Para ser honesto, no sé si hay algún problema, tal vez no. 2. El problema más grave es que no funciona ... me refiero a que está en el lugar correcto de la cadena de filtros (antes de la de seguridad), produce la configuración regional correcta y la configura de la misma manera que RequestContextFilter
. .. pero simplemente no funciona.
Yo sería muy feliz si alguien puede que me haga saber cómo hacer que el trabajo con i18n-basar la seguridad de primavera en mi ejemplo dado o cualquier otro ...
Gracias!
INFORMACIÓN ADICIONAL: Realicé algunos experimentos y parece que la instancia de Locale from request es de alguna manera específica.
mirada a este código (modificado la clase 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);
}
(...)
si este método: LocaleContextHolder.setLocale(l, this.threadContextInheritable);
que pase locale 'l' no funciona en absoluto. Quiero decir que la configuración regional no cambia aunque haya cambiado explícitamente. Por otro lado, si paso allí Locale 'l2' que está modificado para alemán (en modo de depuración) ¡funciona bien!
Esto significa que por alguna razón la instancia de configuración regional de request.getLocale()
es de alguna manera favorecida, tal vez algo está pasando más adelante en el código que no sé/understant ...
Por favor, hágamelo saber cómo debe Utilizo este i18n junto con la seguridad porque llegué al punto en el que debo admitir que no tengo idea de lo que está pasando ...
- ==== - ====== - ====== - ======= - ====
solución final/RESPUESTA (pero aún con poca pregunta) Gracias a Ralph Logré solucionar mi problema. Anteriormente iba en la dirección equivocada, pero el proyecto generado por roo me empujó hacia adelante. Parece que seguía añadiendo el interceptor en un/a mal no es exacta (código anterior):
<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>
De esta manera el interceptor nunca fue invocado por alguna razón.
Después de cambiar interceptor def a:
<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>
... Comenzó a trabajar bien sin ningún otro cambio en la seguridad/web.xml.
Ahora el problema se ha ido sin embargo, no estoy seguro de lo que pasó. Por lo que entiendo en el segundo ejemplo (el que funciona) hice el interceptor "global". Pero ¿por qué el interceptor definido en el primer ejemplo no funcionó? ¿Alguna pista?
¡Gracias nuevamente por su ayuda! N.
Hola ... He intentado con tu configuración de interceptor, pero no funciona. Mi configuración regional no cambia en la página de inicio de sesión. Pero después de iniciar sesión correctamente, funciona bien. En la página de inicio de sesión, solo aparece en la configuración regional del sistema. –