国际化与拦截器
1、默认访问首页
- 在我们的项目中,如果public中有index.html那么将会默认访问那个
- 所以我们得在Controller使用控制器指定跳转页面
- 除了Controller控制器我们还可以使用实现WebMvcConfigurer接口的方法
public void addViewControllers(ViewControllerRegistry registry){ registry.addViewController("/404").setViewName("404"); registry.addViewController("/ddd").setViewName("login"); logger.info("记录下"); }
- 上面这种写法也可以写成下面这种
@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/**");
要放行的资源
}