Springboot快速入门(四)——Web开发:国际化/登录/注销
2022-09-23 11:07:27

1. 页面国际化

1.1 配置文件编写

  • resources资源文件下新建一个i18n目录,存放国际化配置文件

  • 建立一个login.properties文件,一个login_zh_CN.properties,还有一个login_en_US.properties

    在这里插入图片描述

  • 编写配置

    • login.properties : 默认

      1
      2
      3
      4
      5
      login.btn=登录
      login.password=密码
      login.remember=记住我
      login.tip=请登录
      login.username=用户名
    • 英文

      1
      2
      3
      4
      5
      login.btn=Sign in
      login.password=Password
      login.remember=Remember me
      login.tip=Please sign in
      login.username=Username
    • 中文

      1
      2
      3
      4
      5
      login.btn=登录
      login.password=密码
      login.remember=记住我
      login.tip=请登录
      login.username=用户名
  • 配置页面国际化值

    在这里插入图片描述

1.2 配置生效

  • 点击链接让个人的国际化资源生效,就需要让我们自己的Locale生效! 需要去自己写一个自己的LocaleResolver,可以在链接上携带区域信息

    • 修改前端页面的跳转

      1
      2
      3
      <!-- 这里传入参数不需要使用 ? 使用 (key=value)-->
      <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>
    • 写一个处理的组件类(在config文件夹下)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      /**
      * 可以在链接上携带区域信息
      */
      public class MyLocaleResolver implements LocaleResolver {
      // 解析请求
      @Override
      public Locale resolveLocale(HttpServletRequest request) {
      String language = request.getParameter("l");
      Locale locale = Locale.getDefault(); // 如果没有获取到就使用系统默认的
      // 如果请求链接不为空
      if (!StringUtils.isEmpty(language)) {
      // 分割请求参数
      String[] split = language.split("_");
      // 国家,地区
      locale = new Locale(split[0], split[1]);
      }
      return locale;
      }
      @Override
      public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
      }
      }
    • 为了让区域化信息能够生效,需要再配置一下这个组件!在个人的MvcConofig下添加 bean;(在MyMvcConfig中)

      1
      2
      3
      4
      @Bean
      public LocaleResolver localeResolver(){
      return new MyLocaleResolver();
      }

2. 登录功能实现

2.1 登录

  • 登录的html页面提交地址,并且所有的表单标签都需要加上一个name属性

    1
    2
    3
    4
    <form class="form-signin" th:action="@{/user/login}" method="post">
    </form>
    ·············

  • 编写LoginController

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    @Controller
    public class LoginController {
    @PostMapping("/user/login")
    public String login(@RequestParam("username") String username,
    @RequestParam("password") String password,
    Model model, HttpSession session){
    if (!StringUtils.isEmpty(username) && "123456".equals(password)){
    // 登录成功!将用户信息放入session
    session.setAttribute("loginUser",username);
    return "dashboard"; // 跳转到首页
    }else {
    // 登录失败!存放错误信息
    model.addAttribute("msg","用户名密码错误");
    return "index";
    }
    }
    }
  • 登录失败的话,需要将后台信息输出到前台,可以在首页标题下面加上判断!

    1
    2
    3
    <!--判断是否显示,使用if, ${}可以使用工具类,可以看thymeleaf的中文文档-->
    <p style="color: red" th:text="${msg}" th:if="${not #strings.isEmpty(msg)}">
    </p>
  • 登录成功后,由于是转发,链接不变,可以重定向到首页

    • 再添加一个视图控制映射,在自己的MyMvcConfig中:

      1
      registry.addViewController("/main.html").setViewName("dashboard");
    • 将 LoginController 的代码改为重定向

      1
      2
      //登录成功!防止表单重复提交,我们重定向
      return "redirect:/main.html";

2.2 登录拦截器

  • 自定义拦截器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public class LoginHandlerInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    //获取loginUser信息进行判断
    Object user = request.getSession().getAttribute("loginUser");
    if(user==null){
    //未登录,返回首页
    request.setAttribute("msg","没有权限,请登录账户");
    request.getRequestDispatcher("/index.html").forward(request,response);
    return false;
    }else{
    //登录,放行
    return true;
    }
    }
    }
  • 将拦截器注册到SpringMVC配置类当中——MyMVCConfig.java

    1
    2
    3
    4
    5
    6
    7
    8
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    // 注册拦截器,及拦截请求和要剔除哪些请求!
    // 还需要过滤静态资源文件,否则样式显示不出来
    registry.addInterceptor(new LoginHandlerInterceptor())
    .addPathPatterns("/**")
    .excludePathPatterns("/index.html","/","/user/login","/static/**");
    }

3 注销页面

3.1 修改前端界面

在提取出来的公共commons页面,顶部导航栏处的标签添加href属性,实现点击发起请求user/logOut

1
<a class="nav-link" href="#" th:href="@{/user/loginOut}">Sign out</a>

3.2 修改后端界面

LoginController.java文件

处理点击注销标签的请求,在LoginController中编写对应的方法,清除session,并重定向到首页

1
2
3
4
5
@RequestMapping("/user/loginOut")
public String logout(HttpSession session) {
session.invalidate();
return "redirect:/index.html";
}