今天在使用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之后出现的专门用于重定向跳转时还能携带参数,只不过他的两个方法差别很大。
   
- 
     
 addAttribute
 
 ()是直接将参数和值一块拼接到了URL中,然后再从页面或者前端控制器中取出URL后面的参数值,因此这是很不安全的,后台的一些信息直接显示给了用户。
- 
     另个方法
 
 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注解指明想要获取的参数名。
 
版权声明:本文为qq_43672652原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
