Spring не будет перехватывать параметр локали + безопасность [Java, i18n] - PullRequest
1 голос
/ 08 февраля 2011

Я использую Spring Security и Spring i18n. Это моя конфигурация безопасности:

<security:http access-denied-page="/denied.htm">
    <security:form-login login-page="/login.htm"
        authentication-failure-url="/login.htm?login_error=true" />

    <security:intercept-url pattern="/denied.htm" filters="none"/>
    <security:intercept-url pattern="/login.htm*" filters="none"/>

    <security:intercept-url pattern="/*" access="IS_AUTHENTICATED_FULLY" />

    <security:logout/>
</security:http>

Кроме того, я установил authenticationManager для базы данных с кодировкой MD5 для пароля. Охрана работает просто отлично. Мой конфиг i18n:

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="messages" />
</bean>

Он отлично работает с чтением локалей из HTTP-запроса веб-браузера, но я хочу, чтобы он изменил локаль, если я нажму на ссылку на странице (добавляет параметр ?lang=hr на текущую страницу). Поэтому, когда я добавляю это, локаль вообще не меняется:

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

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
    <property name="defaultLocale" value="en"/>
</bean>

<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">
    <property name="interceptors">
        <ref bean="localeChangeInterceptor" />
    </property>
</bean>

Так что у меня есть несколько вопросов.

  1. Почему перехват локали вдруг не работает и как это исправить?
  2. Как прочитать текущую выбранную локаль для сеанса пользователя из класса Java? У меня есть класс Java, где мне нужно получить сообщение Spring из файла message_en.properties или message_hr.properties. Джаспер рапорт.
  3. Мне нужно добавить перехватчик (или что-то в этом роде), чтобы ограничить пользователя паролем по умолчанию только для работы со страницей /changePassword.htm. Какое самое простое решение?

Большое спасибо

Ответы [ 2 ]

2 голосов
/ 10 марта 2013

Попробуйте зарегистрировать localeChangeInterceptor таким образом. У меня это сработало.

<mvc:interceptors>  
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
              <property name="paramName" value="lang"></property>
        </bean>
</mvc:interceptors>
2 голосов
/ 08 февраля 2011
  1. Почему перехват языка неожиданно не работает и как это исправить?

Я предполагаю: чтобы "исправить" ваш локальный перехватчик, вы должны проверить, что локальный перехватчик может быть вызван, даже если пользователь не вошел в систему.

_2.Как прочитать текущую выбранную локаль для сеанса пользователя из класса Java?

Используйте метод RequestContext.getLocale().@see http://static.springsource.org/spring/docs/2.0.x/reference/mvc.html#mvc-localeresolver

добавлено Лучшим местом (в дизайне / архитектуре) для получения локальной формы запроса является веб-контроллер.Если вы используете Spring 3.0, вы можете получить HttpServletRequest напрямую, если поместите параметр этого типа в ваш метод обработчика запросов контроллера.Но у вас есть лучший выбор: просто добавьте параметр Local в метод обработчика вашего контроллера @see http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-arguments

_3.Мне нужно добавить перехватчик (или что-то в этом роде), чтобы ограничить пользователя паролем по умолчанию только для работы со страницей /changePassword.htm.Какое самое простое решение?

Один из способов (возможно, не самый простой, и для которого требуется документация) - предоставить пользователю пароль по умолчанию, а не полный наборПривилегии (только те привилегии, которые ему необходимы для установки нового пароля), после изменения пароля дают пользователю полный набор привилегий, которые позволяют ему делать все остальное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...