关于使用th:text获取不到值

今天在使用thymeleaf模板引擎整合SpringBoot时,对于从controller层传递过来的参数“message”,无法获取。
控制层代码如下:

@PostMapping("/login")
    public String login(@RequestParam String username,
                        @RequestParam String password,
                        HttpSession session,
                        RedirectAttributes attributes){
        User user = userService.checkUser(username, password);
        if (user != null){
            user.setPassword(null);
            session.setAttribute("user",user);

            return "admin/index";
        }else{
            attributes.addAttribute("message","用户名或密码错误");
            return "redirect:/admin";
        }

    }

页面获取message代码如下:

 <!--校验登陆失败-->
 <div class="ui mini negative message" th:unless="${#strings.isEmpty(message)}"
  th:text="${message}">
                        
  </div>

仔细看了好久,开始以为是thymeleaf语法问题,后来查看官方文档没有问题。
再然后看前台页面时,看出了一些毛病;
在这里插入图片描述
发现返回的值在URL中,这时在https://www.cnblogs.com/zhujiabin/p/4935557.html这位前辈中,找到的错误,原来是对RedirectAttributes 这个类的方法理解不到位,它是springmvc3.1之后出现的专门用于重定向跳转时还能携带参数,只不过他的两个方法差别很大。

  1. addAttribute()是直接将参数和值一块拼接到了URL中,然后再从页面或者前端控制器中取出URL后面的参数值,因此这是很不安全的,后台的一些信息直接显示给了用户。
  2. 另个方法 addFlashAttribute();它也能重定向带参,而且能隐藏参数,其原理就是放到session中,session在跳到页面后马上清除session。但是这也有缺点,就是只能在页面中获取。但到这里就可以解决我的问题了,将addAttribute改为addFlashAttribute。

但是在此之前我还查了Model对象中设置的属性以及值,通过Thymeleaf获取时,获取失败,可能有以下几种原因:
1、首先检查返回值,就比如我这个方法返回值是String,因此如果你在这个方法中使用Model设置值是在页面取不到的。可以将返回值改为Model或者Object类型。

 @PostMapping("/login")
    public Object login(@RequestParam String username,
                        @RequestParam String password,
                        HttpSession session,
                        Model attributes){
        User user = userService.checkUser(username, password);
        if (user != null){
            user.setPassword(null);
            session.setAttribute("user",user);

            return "admin/index";
        }else{
            attributes.addAttribute("message","用户名或密码错误");
            return attributes;
        }

    }

2、第二种就是将一个controller中的请求转发或重定向到另一个controller,这时应该注意的是接收数据的类型,或者使用@ModelAttribute注解指明想要获取的参数名。

posted @ 2020-02-07 23:05  起个名字都这么男  阅读(1238)  评论(0编辑  收藏  举报