我想为用户提供在登录时选择应用程序语言的可能性。但是由于我们使用的是spring security,我真的不确定如何从请求参数中获取选定的语言参数?
有没有办法在不修改流程本身的情况下拦截 Spring Security 身份验证过程(因为我找到了一些自定义身份验证的示例,但我目前不需要)?
或者在进一步重定向之前检索请求参数的最佳做法是什么?谢谢。
我想为用户提供在登录时选择应用程序语言的可能性。但是由于我们使用的是spring security,我真的不确定如何从请求参数中获取选定的语言参数?
有没有办法在不修改流程本身的情况下拦截 Spring Security 身份验证过程(因为我找到了一些自定义身份验证的示例,但我目前不需要)?
或者在进一步重定向之前检索请求参数的最佳做法是什么?谢谢。
您可以在以下位置设置自己的(而不是默认的)身份验证成功处理程序resources.groovy
:
authenticationSuccessHandler(MyAuthenticationSuccessHandler) {
}
在哪里MyAuthenticationSuccessHandler
实现的类AuthenticationSuccessHandler
,或者更好地扩展AjaxAwareAuthenticationSuccessHandler
默认使用的类,例如:
authenticationSuccessHandler(AjaxAwareAuthenticationSuccessHandler) {
requestCache = ref('requestCache')
defaultTargetUrl = conf.successHandler.defaultTargetUrl // '/'
alwaysUseDefaultTargetUrl = conf.successHandler.alwaysUseDefault // false
targetUrlParameter = conf.successHandler.targetUrlParameter // 'spring-security-redirect'
ajaxSuccessUrl = conf.successHandler.ajaxSuccessUrl // '/login/ajaxSuccess'
useReferer = conf.successHandler.useReferer // false
redirectStrategy = ref('redirectStrategy')
}
此类可以在以下位置访问实际请求:
void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException;
Grails 已经内置支持在独立于 spring-security 的每个请求上更改用户的语言。如果您lang
在任何请求上调用了一个参数,它将被拦截并用于设置用户的语言环境。
例如,您可以在提交的登录表单上放置一个输入元素,lang=XX
其中 XX 是两个字符的语言代码或语言/国家/地区组合,如en_GB
. Grails 将自动更新与该会话关联的语言环境。请注意,这将覆盖Accept-Language
用户浏览器可能已经发送的标头。
要手动更新语言环境,您可以执行以下操作:
import org.springframework.web.servlet.support.RequestContextUtils
import org.springframework.beans.propertyeditors.LocaleEditor
def localeResolver = RequestContextUtils.getLocaleResolver(request)
def localeEditor = new LocaleEditor()
localeEditor.setAsText(params.lang)
localeResolver?.setLocale(request, response, localeEditor.value)