SpringBoot国际化与拦截器

国际化与拦截器

1、默认访问首页

  1. 在我们的项目中,如果public中有index.html那么将会默认访问那个
  2. 所以我们得在Controller使用控制器指定跳转页面
  3. 除了Controller控制器我们还可以使用实现WebMvcConfigurer接口的方法
    public void addViewControllers(ViewControllerRegistry registry){
         registry.addViewController("/404").setViewName("404");
         registry.addViewController("/ddd").setViewName("login");
         logger.info("记录下");
     }
    
  4. 上面这种写法也可以写成下面这种
        @Bean
     public WebMvcConfigurer webMvcConfigurer(){
         WebMvcConfigurer webMvcConfigurer = new WebMvcConfigurer() {
             /* 视图跳转控制器 */
             @Override
             public void addViewControllers(ViewControllerRegistry registry) {
                 registry.addViewController("/").setViewName("login");
                 registry.addViewController("/login.html").setViewName("login");
             }
         };
         return webMvcConfigurer;//返回一个webMvc对象
     }
    

2、国际化

1)、编写国际化配置文件;

2)、使用ResourceBundleMessageSource管理国际化资源文件

3)、创建.properties文件一旦带有en_US等内容idea会默认识别

4)、创建完文件后统一管理配置
在这里插入图片描述

5)、springboot自动配置好了国家化的资源文件的组件

    @Bean
    public MessageSource messageSource(MessageSourceProperties properties) {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        if (StringUtils.hasText(properties.getBasename())) {
            messageSource.setBasenames(StringUtils.commaDelimitedListToStringArray(StringUtils.trimAllWhitespace(properties.getBasename())));
        }

        if (properties.getEncoding() != null) {
            messageSource.setDefaultEncoding(properties.getEncoding().name());
        }

        messageSource.setFallbackToSystemLocale(properties.isFallbackToSystemLocale());
        Duration cacheDuration = properties.getCacheDuration();
        if (cacheDuration != null) {
            messageSource.setCacheMillis(cacheDuration.toMillis());
        }

        messageSource.setAlwaysUseMessageFormat(properties.isAlwaysUseMessageFormat());
        messageSource.setUseCodeAsDefaultMessage(properties.isUseCodeAsDefaultMessage());
        return messageSource;
    }

6)、更改idea设置
在这里插入图片描述

7)、会根据浏览器语言选择切换国际化信息

原理:Locale(区域信息对象);LocaleResolver(获取区域信息对象)

        @Bean
        @ConditionalOnMissingBean
        @ConditionalOnProperty(
            prefix = "spring.mvc",
            name = {"locale"}
        )
        public LocaleResolver localeResolver() {
            if (this.mvcProperties.getLocaleResolver() == org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties.LocaleResolver.FIXED) {
                return new FixedLocaleResolver(this.mvcProperties.getLocale());
            } else {
                AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
                localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
                return localeResolver;
            }
        }

8)、使用国际化资源(thyme leaf语法):

th:text="#{login.sgin}"
th:placeholder="#{login.username}"
[[#{login.remember}]] (在空白处书写)

9)、自定义切换国际化根据l的参数来

			<a class="btn btn-sm" th:href="@{/index.html(l='zh_CN')}">中文</a>
			<a class="btn btn-sm" th:href="@{/index.html(l='en_US')}">English</a>

10)、后台配置

@Component("localeResolver")
public class MyLocaleResolver implements LocaleResolver {
    Logger logger = LoggerFactory.getLogger(getClass());
    @Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
        String l = httpServletRequest.getParameter("l");
        logger.info("是否进入了国际化");
        Locale locale = Locale.getDefault();
        if (!StringUtils.isEmpty(l)){
            String[] split = l.split("_");
            locale = new Locale(split[0], split[1]);
        }
        return locale;
    }

    @Override
    public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {

    }
}

这里说明一下我们实现了LocaleResolver接口的resolveLocale方法
获取前台传过来的语言参数l,最后将语言字符串生成新的Locale对象返回
在这里要注意的是,我们写完要将它托给spring容器管理,并且名字是
localeResolver才能生效,除了上面的@Component命名我们也可以使用

    //@bean的默认name值是方法名,如果不是localeResolver将无法使用国际化
    @Bean
    public LocaleResolver localeResolver(){
        return new MyLocaleResolver();
    }

这种方法也是返回一个实例交给spring去管理
不过这里类名上还有个@Configuration注解,这种方式的话使用了cglib动态代理

3、登录与拦截

1、实现拦截

1)实现HandlerInterceptor接口
public class LoginHandlerInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Object user = request.getSession().getAttribute("username");
        if (user == null){
            request.setAttribute("msg","没有权限请先登录");
            request.getRequestDispatcher("/index.html").forward(request,response);
            return false;
        }else {
            //已登录,放行
            return true;
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}
2)配置拦截规则
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
                .excludePathPatterns("/index.html","/","/login"
                ,"/asserts/**","/webjars/**");
                要放行的资源
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值