今天在使用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注解指明想要获取的参数名。