여기 내 첫 번째 질문과 나는 구체적으로하려고 노력할 것이다. 나는 봄에 아주 익숙하다. 그리고 나는 아주 간단한 예약 시스템을 만들려고 노력하고있다. (그러나 이것은 실제로 중요하지 않다.) 중요한 것은 제가 실제 웹 페이지로 채울 기본 템플릿을 만드는 것입니다. 응용 프로그램은 최대 절전 모드, 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 파일에 대한 변경없이 잘 작동하기 시작했다.
이제 문제는 사라졌지만 어떤 일이 일어 났는지 확실하지 않습니다. 두 번째 예제 (작동하는 예제)에서 이해할 수있는 것으로부터 인터셉터를 "전역 적"으로 만들었습니다. 그러나 첫 번째 예제에서 정의한 인터셉터가 왜 효과가 없었습니까? 어떤 힌트?
다시 도움에 감사드립니다!
이
안녕하세요. 귀하의 인터셉터 구성을 시도했지만 작동하지 않았습니다. 내 로케일은 로그인 페이지에서 변경되지 않습니다. 그러나 로그인 성공 후 잘 작동합니다. 로그인 페이지에서 시스템 로케일에만 적용됩니다. –