springboot基础——mvc扩展:登陆拦截器、转发、国际化

一、自定义拦截器和转发

1.实现拦截器
component/LoginHandlerInterceptor

// 实现拦截器接口,写完后要记得加入springmvc的扩展配置中
public class LoginHandlerInterceptor implements HandlerInterceptor {
    // preHandle:目标方法执行前进行拦截
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Object user = request.getSession().getAttribute("loginUser");
        if (null==user){
            request.setAttribute("msg","请先登陆");
            // 未登录,重定向到/login
            request.getRequestDispatcher("/login").forward(request,response);
            return false;
        }
        return true;
    }
}

2.注册拦截器
config/MyMvcConfig
扩展springmvc配置

// WebMvcAutoConfiguration 这个类中做了springMVC的默认配置
// @Configuration 申明这是一个配置类,实现接口WebMvcConfigurer 中的某些方法来扩展spingMVC配置
// 该接口中都定义的默认方法(default修饰,提供了空方法体),所以可以有选择性的重写
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    // 通过注入容器的方式实现转发,自定义的mvc配置,最后要通过@Bean注入
    @Bean
    public WebMvcConfigurer webMvcConfigurer(){
        return new WebMvcConfigurer() {
            @Override
            public void addViewControllers(ViewControllerRegistry registry) {
                // 直接将请求转发到视图层,不经过控制器,直接找模板中的dashboard.html
                registry.addViewController("/").setViewName("dashboard");
            }
			// 注册拦截器
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**").
                        excludePathPatterns("/login","/webjars/**","/asserts/**");
            }
        };
    }

    // 通过重写的方式实现转发
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //
        registry.addViewController("/kzzf").setViewName("login");
        registry.addViewController("/index").setViewName("dashboard");
    }

    // 注入我们自定义的国际化配置,原配置中有@ConditionalOnMissingBean
    // 也就是在没有配置locale时才会生效,现在我们写了就用这个了
    @Bean
    public LocaleResolver localeResolver(){
        return new MyLocaleResolver();
    }
}

3.登陆控制层

@Controller
public class LoginController {
    @GetMapping
    @RequestMapping("/login")
    public String login(){
        return "login";
    }

//    @RequestMapping(value = "/login", method = RequestMethod.POST)
    @PostMapping("/login")
    // @RequestParam("username") 将请求的参数赋值给username,若没取到参数就直接返回400
    public String doLogin(@RequestParam("username") String username,
                          @RequestParam("password") String password,
                          Map<String,Object> map,
                          HttpSession session){
        if("admin".equals(username) && "123456".equals(password)){
            // 向session中写入内容
            session.setAttribute("loginUser", username);
            // 登陆成功后重定向到首页
            return "redirect:/index";
        }
        map.put("msg","用户名或密码错误");
        return "login";
    }
}

二、国际化

1.实现
component\MyLocaleResolver

// 实现国际化的切换,默认会获取请求头中的语言信息,这里进行重写
public class MyLocaleResolver implements LocaleResolver {
    @Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
        String l = httpServletRequest.getParameter("l");
        // 获取操作系统默认的国际化语言
        Locale locale = Locale.getDefault();
        if(!StringUtils.isEmpty(l)){
            String[] language = l.split("_");
            locale = new Locale(language[0], language[1]);
        }
        return locale;
    }

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

    }
}

2.注册
参考拦截器注册

3.翻译配置
以login视图为例,新建如下文件,进行配置
resources\i18n\login.properties
resources\i18n\login_en_US.properties
resources\i18n\login_zh_CN.properties

3.页面

<!-- #号用来国际化,这里的tip就是上面配置的标签 -->
<h1 class="h3 mb-3 font-weight-normal" th:text="#{tip}">Please sign in</h1>

<!-- 登陆错误提示:if判断,当msg不为空时才显示这个p标签,thymeleaf中封装了一些对象的方法,通过#调用 -->
<p style="color: red" th:text="${msg}" th:if="${not #strings.isEmpty(msg)}"></p>

<!-- 行内用双中括号 -->
<input type="checkbox" value="remember-me"> [[#{remember}]]

<!-- 使用@添加href属性,url参数写在括号里,实现国际化切换 -->
<a class="btn btn-sm" th:href="@{/login(l='zh_CN')}">中文</a>
<a class="btn btn-sm" th:href="@{/login(l='en_US')}">English</a>

4.指定国际化配置的路径
resources\application.properties

# 给login页面配置国际化
spring.messages.basename=i18n.login

参考:https://www.bilibili.com/video/BV1Et411Y7tQ

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值