grails - 在Grails应用程序的主页中更改用户的语言环境

我一直在尝试登录后更改用户区域设置(我使用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;
    }
}

和resources.groovy部分
localeResolver(MyLocaleResolver){
    springSecurityService = ref("springSecurityService")
}

更新(07/04/2015):
我已经尝试扩展CookieLocaleResolver,因为它设置了cookie值,所以在所有情况下都可以正常工作,除了在第一个主页加载中设置默认语言而不是在resolveLocale中设置的语言。
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);
}

}

尽管我认为最好改写localeResolver,但我尝试了另一种方法。我试图在用户登录时更改语言环境,并在MongoUserDetailsS​​ervice的loadUserByUsername方法中更改defaultLocale。它的发生方式与以前的方法相同,除了登录后首次加载首页时,它运行良好。
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)
            }
}

和resources.groovy
userDetailsService(net.ds.batto.MongoUserDetailsService){
    localeResolver = ref("localeResolver")
}

另外,我认为grails默认情况下使用CookieLocaleResolver,但是我已经看到我所引用的localeResolver是SessionLocaleResolver。这是正确的行为还是配置错误?

最佳答案

对我而言,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)
    }
}

直接在LocaleChangeInterceptor中,我想当服务器到达“LocaleResolver”请求时已经为时已晚,只有以下请求会受到Locale更改的影响。

https://stackoverflow.com/questions/29390550/

相关文章:

grails - Grails:如何从BuildConfig.groovy中知道正在执行哪个命令

php - 通过php我如何关闭由php ssh2_connect创建的事件ssh连接?

ssh - 如何从第二台机器访问 Github 存储库?

security - 在 Groovy 动态 SQL 中检测 SQL 注入(inject)

ruby-on-rails-3 - 使用 Heroku 访问和部署问题

mongodb - 在grails和MongoDB插件的条件查询中使用allowDiskUse?

macos - 假设我知道root密码,如何在OS X中使用标准帐户制作一个sudo本身的Bash脚

exception - 如何在事务中从 Grails 中的数据库错误中恢复

grails - “grails -Dserver.port=9999 run-app”无效

grails - 使用插件时如何在Grails中添加Quartz监听器