Spring不会拦截locale参数+ security [Java,i18n]

时间:2011-02-08 08:34:39

标签: java security spring internationalization

我正在使用Spring安全性和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>

从Web浏览器的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类,我需要从message_en.propertiesmessage_hr.properties文件中获取spring的消息。贾斯珀报告。
  3. 我需要添加一些拦截器(或类似的东西)来限制用户使用默认密码才能使用/changePassword.htm页面。什么是最简单的解决方案?
  4. 非常感谢

2 个答案:

答案 0 :(得分:2)

  
      
  1. 为什么区域设置拦截突然不起作用以及如何修复   它?
  2.   

我猜:要“修复”你的本地拦截器,你应该检查,即使用户没有登录也可以调用本地拦截器。

  

_2。如何从java中读取用户会话的当前所选语言环境   类?

使用RequestContext.getLocale()方法。 @see http://static.springsource.org/spring/docs/2.0.x/reference/mvc.html#mvc-localeresolver

<强>加入 获取本地表单请求的最佳位置(在design / architecure中)是Web控制器。如果您使用的是Spring 3.0,则可以直接获取HttpServletRequest,如果您将此类型的参数放入Controller Request Handler方法中。但是您有更好的选择:只需在控制器处理程序方法中添加Local参数 @see http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-arguments

  

_3。我需要添加一些拦截器(或类似的东西)来约束用户   使用默认密码才能工作   使用/changePassword.htm页面。什么是   最简单的解决方案?

一种方式(可能不是最简单的,一种需要文档)是为用户提供默认的密码而不是完整的priveleges(他需要设置的权限)新密码),在查询密码后,为用户提供全套权限,这使他可以完成所有其他工作。

答案 1 :(得分:2)

尝试以这种方式注册localeChangeInterceptor。它对我有用。

<mvc:interceptors>  
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
              <property name="paramName" value="lang"></property>
        </bean>
</mvc:interceptors>