【问题标题】:Spring won't intercept locale parameter + security [Java, i18n]Spring不会拦截语言环境参数+安全[Java,i18n]
【发布时间】: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>

所以我有几个问题。

  1. 为什么语言环境拦截突然不起作用以及如何解决?
  2. 如何从 java 类中为用户会话读取当前选择的语言环境?我有 java 类,我需要从 message_en.propertiesmessage_hr.properties 文件中获取 spring 的消息。贾斯珀报告。
  3. 我需要添加一些拦截器(或类似的东西)来限制使用默认密码的用户只能使用/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


【解决方案1】:
  1. 为什么语言环境拦截突然不起作用以及如何修复 是吗?

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

_2。如何从java读取用户会话的当前选择的语言环境 上课?

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

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

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

一种方法(可能不是最简单的,也是一种需要文档的方法)是为用户提供默认密码而不是完整的权限集(只有他需要设置的权限新密码),更改密码后,授予用户全套权限,允许他执行所有其他操作。

【讨论】:

  • [1.] 在用户未通过身份验证的登录页面上,区域设置拦截也不起作用(如果您的意思是这样的话)。 [2.] 我发现 RequestContext requestContext = new RequestContext(request);之后,我可以获得当前的语言环境 Locale locale = RequestContext.getLocale();这里的问题是变量 request 是 HttpServletRequest 类的对象。我不知道在哪里设置它。但是,我只需要最简单的示例即可从 java 类中设置和获取语言环境。非常感谢!
  • @Mario [1] - 我的意思是:我猜这个错误是,您的安全拦截器在本地更改拦截器可以处理之前“捕获”更改区域设置的请求。 (easyset的处理方式,就是不拦截登录页面的本地变更请求)
  • @Mario [2] - 在您的控制器中很容易,(Spring 3.0)只需向您的控制器方法添加一个 HttpServletRequest 参数,或者这也是可能的只需添加一个参数 Locale local 到您的控制器方法。 (请参阅我的答案的添加部分)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 2014-10-02
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    相关资源
    最近更新 更多