【发布时间】:2011-02-08 08:34:39
【问题描述】:
我同时使用 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>
它可以很好地从 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>
所以我有几个问题。
- 为什么语言环境拦截突然不起作用以及如何解决?
- 如何从 java 类中为用户会话读取当前选择的语言环境?我有 java 类,我需要从
message_en.properties或message_hr.properties文件中获取 spring 的消息。贾斯珀报告。 - 我需要添加一些拦截器(或类似的东西)来限制使用默认密码的用户只能使用
/changePassword.htm页面。最简单的解决方案是什么?
非常感谢
【问题讨论】:
-
对于以后的问题,请每个问题只问一个问题。
-
你的控制器真的用
ControllerClassNameHandlerMapping映射了吗? -
@Ralph 很抱歉有多个问题。 @axtavt 我不明白你的问题。有handlerMapping bean。我的一个控制器看起来像这样:@RequestMapping("/change.htm") public ModelAndView change(@RequestParam("oldPassword") String oldPassword, @RequestParam("newPassword") String newPassword){ ... }
-
所以它不需要“lang”参数。这是一个问题吗?我认为 Spring 会自动识别 lang 参数,因为它是在 localeChangeInterceptor bean 中定义的。
标签: java security spring internationalization