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과 같은 방식으로 설정합니다. ..하지만 그것은 단순히 일을하지 않습니다. 누군가가 ... 내 주어진 예 또는 기타에 스프링 보안 기초를 두는과 국제화 작업을 만드는 방법을 알고

감사를 할 수 있다면

나는 매우 행복 할 것입니다!

추가 정보 : 몇 가지 실험을했는데 요청의 Locale 인스턴스가 어떻게 든 특수한 것으로 보입니다. 합니다 (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'을 전달합니다. 내 말은 로케일이 명시 적으로 변경 되더라도 변경되지 않는다는 의미입니다. 한편 로케일 'l2'가 독일어로 수정되면 (디버그 모드에서) 잘 동작합니다!

이 어떤 이유로 request.getLocale()에서 로케일 인스턴스가 어떻게 든 선호하는 것을 의미, 어쩌면 뭔가

내가 방법을 알려 주시기 바랍니다 ... understant/나도 몰라하는 코드에서 나중에한다 벌어지고 나는 보안 문제와 함께이 i18n을 사용한다. 내가 무슨 일이 일어나는지 전혀 모른다는 것을 인정해야한다.

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

최종 해결책/답변 (하지만 여전히 작은 질문 있음) Ralph 덕분에 문제를 해결할 수있었습니다. 이전에는 잘못된 방향으로 가고 있었지만 roo가 생성 한 프로젝트는 나를 밀어 붙였습니다. 그것은 내가 잘못/정확하지 방식으로 인터셉터 (이전 코드)를 추가 계속 것 같습니다 :

<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> 

인터셉터 어떤 이유로 호출되지 않았다 이쪽으로.

에 DEF 인터셉터를 변경 한 후 :

<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 파일에 대한 변경없이 잘 작동하기 시작했다.

이제 문제는 사라졌지만 어떤 일이 일어 났는지 확실하지 않습니다. 두 번째 예제 (작동하는 예제)에서 이해할 수있는 것으로부터 인터셉터를 "전역 적"으로 만들었습니다. 그러나 첫 번째 예제에서 정의한 인터셉터가 왜 효과가 없었습니까? 어떤 힌트?

다시 도움에 감사드립니다!

+0

안녕하세요. 귀하의 인터셉터 구성을 시도했지만 작동하지 않았습니다. 내 로케일은 로그인 페이지에서 변경되지 않습니다. 그러나 로그인 성공 후 잘 작동합니다. 로그인 페이지에서 시스템 로케일에만 적용됩니다. –

답변

1
  1. 후 요청 xxxxx는 전송? 로케일 =이 "국가"없이 로케일을 생성 도중 속성 (유일한 언어가 설정) N..

예상되는 동작입니다. 자바에서는 어떤 종류의 계층 구조가 있습니다. 언어는 국가보다 일반적입니다.

뒤에있는 생각은 예를 들어 더 일반적인 언어에서는 텍스트를 사용할 수 있지만 국가 별 파일에서는 통화와 같은 일부 단위를 사용할 수 있다는 것입니다.

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


  1. 더 심각한 문제는 그것이 작동하지 않는다는 것입니다 ...

그것은 어떤 손없이 작동 구현했다!

Local Change Interceptor를 등록해야하며 로그인 페이지에 대해 permitAll을 설정해야합니다.

<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> 

는 루 스크립트와 루 프로젝트를 만들고,이 예제를 실행 보려면 :

// 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 패턴을 보안 필터를 변경해야합니다 내가 위에서 보여 같은 (applicationContext-security.xml를)!이제

당신은 (로그인 페이지에서) 그가 로그인하지 않은 경우뿐만 아니라 사용자가 (사용자가 로그인) 응용 프로그램의 로컬 변경 인터셉터를 통해 그 지역을 변경할 수있는 응용 프로그램

+0

빠른 답변을 보내 주셔서 감사합니다. 어쩌면 당신은 주요 문제 (로케일 변경)의 경우에도 올바른 경로에 나를 넣을 수 있습니다. 다시 한 번 감사드립니다! – Nirwan

+0

@Nirwan : 내 확장 된 답변보기 - 실제로 작동하지 않는 이유를 설명하지는 않지만 로컬 변경 인터셉터가 잘 작동하는 예제로 안내합니다. – Ralph

+0

랄프에게 감사드립니다. 루오 예제를 통해 나는 그것을 마침내 달릴 수있었습니다. 당신은 수동 구현에 대한 필요성이 없다고 말한 것처럼 ... 내 질문에 대한 자세한 내용은 무엇을 잘못했는지 - 어쩌면 내가 실제로 무엇을했는지 알 수있을 것입니다.) 어쨌든 다시 감사드립니다 !! ! – Nirwan

0

GWT 앱으로 작업 할 때도 현지화와 비슷한 문제가있었습니다. 내가 언급 한 문제는 우리가 필터에

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

를 매핑 할 때, 심지어 이미지 요청을 필터로 라우팅이었다. 이러한 요청은 때때로 locale 매개 변수를 생략하므로 여러 요청이 필터에 도달 할 때 Locale 매개 변수가 사용되지 않습니다. 따라서 로캘 매개 변수를 받자 마자 세션에 넣습니다. 모든 요청 헤더와 값을 기록하면 근본 원인을 찾을 수 있습니다.