zoukankan      html  css  js  c++  java
  • Spring MVC之LocaleResolver(解析用户区域)

    为了让web应用程序支持国际化,必须识别每个用户的首选区域,并根据这个区域显示内容。

    在Spring MVC应用程序中,用户的区域是通过区域解析器来识别的,它必须实现LocaleResolver接口。Spring MVC提供了几个LocaleResolver实现,让你可以按照不同的条件来解析区域。除此之外,你还可以实现这个接口,创建自己的区域解析器。

    要定义一个区域解析器,只需在web应用程序上下文中注册一个LocaleResolver类型的Bean就可以了。你必须将区域解析器的Bean名称设置为localeResolver,这样DispatcherServlet才能自动侦测到它。请注意,每DispatcherServlet只能注册一个区域解析器。

    1.按HTTP请求头部解析区域

    Spring采用的默认区域解析器是AcceptHeaderLocaleResolver。它通过检验HTTP请求的accept-language头部来解析区域。这个头部是由用户的web浏览器根据底层操作系统的区域设置进行设定。请注意,这个区域解析器无法改变用户的区域,因为它无法修改用户操作系统的区域设置。

    2.按会话属性解析区域

    解析区域的另一种方法是通过SessionLocaleResolver。它通过检验用户会话中预置的属性来解析区域。如果该会话属性

    不存在,它会根据accept-language HTTP头部确定默认区域。

    Xml代码  
    <bean id="localeResolver" class="org.springframewrok.web.servlet  
        .i18n.SessionLocaleResolver">  
        <property name="defaultLocale" value="en"/>  
    </bean>  
    如果会话属性不存在,可以为这个解析器设置defaultLocale属性。请注意,通过修改保存该区域的会话属性,这个区域

    解析器可以改变用户的区域设置。

    3.按Cookie解析区域

    你也可以检验用户浏览器中的Cookie,用CookieLocaleResolver来解析区域。如果Cookie不存在,它会根据accept-language HTTP头部确定默认区域。 

    Xml代码  
    <bean id="localeResolver" class="org.springframework.web.servlet  
        .i18n.CookieLocaleResolver"/>  
    这个区域解析器所采用的Cookie可以通过cookieName和cookieMaxAge属性进行定制。cookieMaxAge属性表示这个Cookie应该持续多少秒,-1表示这个Cookie在浏览器关闭之后就失效。 

    Xml代码  
    <bean id="localeResolver" class="org.springframework.web.servlet  
        .i18n.CookieLocaleResolver">  
        <property name="cookieName" value="language"/>  
        <property name="cookieMaxAge" value="3600"/>  
        <property name="defaultLocale" value="en"/>  
    </bean>     
    如果用户浏览器中不存在该Cookie,你也可以为这个解析器设置defaultLocale属性。通过修改保存该区域的Cookie,这个区域解析器能够改变用户的区域。
     

    4.FixedLocaleResolver 

     一直使用固定的Local, 改变Local 是不支持的 。

    5.修改用户的区域

    除了显式调用LocaleResolver.setLocale()来修改用户的区域之外,还可以将LocaleChangeInterceptor拦截器应用到处理程序映射中,它会发现当前HTTP请求中出现的特殊参数。其中的参数名称可以通过拦截器的paramName属性进行自定义。如果这种参数出现在当前请求中,拦截器就会根据参数值来改变用户的区域。

    Xml代码  
    <beans...>  
        ...  
        <bean id="localeChangeInterceptor"  
            class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">  
            <property name="paramName" value="language"/>  
        </bean>  
        <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
            <property name="interceptors">  
                <list>  
                    ...  
                    <ref bean="localeChangeInterceptor"/>  
                </list>  
            </property>  
        </bean>  
        <bean class="org.springframework.web.servlet.mvc.support  
            .ControllerClassNameHandlerMapping">  
            <property name="interceptors">  
                <list>  
                    ...  
                    <ref bean="localeChangeInterceptor"/>  
                </list>  
            </property>  
        </bean>  
    <beans>  
    LocaleChangeInterceptor只能为启用了它的那些处理程序映射侦测参数。因此,如果web应用程序上下文中配置了不止一个处理程序映射,就必须在所有处理程序映射中注册这个拦截器,以便能在任意URL中改变它们的区域设置。

    现在,利用language参数,可以通过任意URL修改用户的区域。例如,下面两个URL分别将用户的区域语言改成了美式

    英语和德语。 

    Java代码  
    http://localhost:8080/court/welcome.htm?language=en_US  
    http://localhost:8080/court/welcome.htm?language=de  

    6.使用Spring MVC时,  controller如何得到请求的 Local
    DispatchServlet 会在 processRequest(HttpServletRequest request, HttpServletResponse response) 方法中设置LocaleContext, 把LocalContext 和当前线程关联起来. 代码如下:

    LocaleContextHolder.setLocaleContext (buildLocaleContext(request), this. threadContextInheritable );

    DispatchServlet 中buildLocalContext代码如下:

    protected LocaleContext buildLocaleContext( final HttpServletRequest request) {
    return new LocaleContext() {
    public Locale getLocale() {
    return localeResolver .resolveLocale(request);
    }
    @Override
    public String toString() {
    return getLocale().toString();
    }
    };
    }

    这里的Local通过localResolver 解析得到,  localResolver 即是从Spring 配置文件配置的localResolver, 默认是"AcceptHeaderLocaleResolver".

    如果你想要在 controller 中得到当前请求的Local,  代码可以如下写:

    Locale locale = LocaleContextHolder.getLocale();
    或者你可以用Spring 中的RequestContextUtils 类方法getLocal得到 request 中保存的localResolver, 并用localResolver 解析得到Local.   代码如下:

    public static Locale getLocale (HttpServletRequest request) {
    LocaleResolver localeResolver = getLocaleResolver (request);
    if (localeResolver != null ) {
    return localeResolver.resolveLocale(request);
    }
    else {
    return request.getLocale();
    }
    }
    localResolver 会在DispatcherServlet的doService 方法中,将localResolver保存到request 属性中 代码如下:

    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);


    ---------------------
    作者:rj042
    来源:CSDN
    原文:https://blog.csdn.net/rj042/article/details/23354225
    版权声明:本文为博主原创文章,转载请附上博文链接!

    @ https://blog.csdn.net/qq924862077/article/details/52878507

  • 相关阅读:
    项目经理必备的8个要素:沟通、总结、懂技术
    完工概率计算总结
    PMP--可能会涉及到的计算题
    六顶思考帽子法
    预测技术
    React.Component与React.PureComponent的区别
    简单理解JavaScript,TypeScript和JSX
    自己常用的linux命令
    ES6 promise 用法
    node的express框架接收get/post请求时,参数获取方式
  • 原文地址:https://www.cnblogs.com/xingzc/p/9945330.html
Copyright © 2011-2022 走看看