我一直在尝试登录后更改用户区域设置(我使用Spring Security)。
我曾尝试在Spring Security的成功事件处理程序(onInteractiveAuthenticationSuccessEvent)中更改语言环境,并创建自己的localeResolver并将其注册到resources.groovy上。
除主页外,其他所有页面似乎工作正常。
这是MyLocaleResolver
class MyLocaleResolver implements LocaleResolver {
def springSecurityService
private Locale defaultLocale = null;
@Override
Locale resolveLocale(HttpServletRequest httpServletRequest) {
User user = User.findByEmail(springSecurityService.authentication.principal.username)
if (user && !defaultLocale) {
if (user.lang) {
this.defaultLocale = new Locale(user.lang)
} else {
this.defaultLocale = Locale.ENGLISH
}
}
println "defaultLocale = $defaultLocale"
return this.defaultLocale
}
@Override
void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
this.defaultLocale = locale;
}
}
localeResolver(MyLocaleResolver){
springSecurityService = ref("springSecurityService")
}
class MyLocaleResolver extends CookieLocaleResolver{
def springSecurityService
@Override
Locale resolveLocale(HttpServletRequest httpServletRequest) {
super.resolveLocale(httpServletRequest)
User user = User.findByEmail(springSecurityService.authentication.principal.username)
Locale locale
if (user) {
if (user.lang) {
locale = new Locale(user.lang)
} else {
locale = Locale.ENGLISH
}
httpServletRequest.setAttribute(LOCALE_REQUEST_ATTRIBUTE_NAME, locale != null?locale:this.determineDefaultLocale(request));
}
return (Locale)httpServletRequest.getAttribute(LOCALE_REQUEST_ATTRIBUTE_NAME);
}
def localeResolver
@Override
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException {
User.withTransaction { status ->
User user = User.findByEmail(username)
if (!user) throw new UsernameNotFoundException(
'User not found', username)
try {
localeResolver.setDefaultLocale(user.lang ? new Locale(user.lang) : Locale.ENGLISH)
} catch (Exception e){
e.printStackTrace()
}
def authorities = user.authorities.collect {
new SimpleGrantedAuthority(it.authority)
}
return new MyUserDetails(user.username, user.password, user.enabled,
!user.accountExpired, !user.passwordExpired,
!user.accountLocked, authorities ?: MongoUserDetailsService.NO_ROLES, user.id, user.client, user.email,
user.dateCreated)
}
}
userDetailsService(net.ds.batto.MongoUserDetailsService){
localeResolver = ref("localeResolver")
}
最佳答案
对我而言,defaultLocale是整个应用程序的全局配置(或至少不是针对特定用户 session 的全局配置)
http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/i18n/SessionLocaleResolver.html
Custom controllers can override the user's locale and time zone by calling #setLocale(Context) on the resolver
localeResolver.setDefaultLocale(user.lang ? new Locale(user.lang) : Locale.ENGLISH)
class MyLocaleChangeInterceptor extends LocaleChangeInterceptor {
...
@Override
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
localeResolver.setLocale(user.lang ? new Locale(user.lang):Locale.ENGLISH)
}
}
https://stackoverflow.com/questions/29390550/
相关文章:
grails - Grails:如何从BuildConfig.groovy中知道正在执行哪个命令
php - 通过php我如何关闭由php ssh2_connect创建的事件ssh连接?
security - 在 Groovy 动态 SQL 中检测 SQL 注入(inject)
ruby-on-rails-3 - 使用 Heroku 访问和部署问题
mongodb - 在grails和MongoDB插件的条件查询中使用allowDiskUse?
macos - 假设我知道root密码,如何在OS X中使用标准帐户制作一个sudo本身的Bash脚
exception - 如何在事务中从 Grails 中的数据库错误中恢复