在一般情况下:我们登录系统时,第一次登录当用户名或密码输入错误,在登录页面给出错误原因,当我们再刷新登录页面,应该是首次登录系统的页面(这时就不应该再给出出错提示),这时我们就应该想到错误提示信息到底放在哪个作用域中能满足这样的要求,我们常见的作用域有三个:request,session,application.就当前需求,session和application显然不满足要求,request作用域又仅限于当次请求,如果我们重定向传参,request显然无法把值传到另一个方法中.所以request也不好.但spring给我们提供了一个方案,就是RedirectAttributes 类.使用如下:
我们登录系统时,form表单的method设定为post,form表单代码如下:
<form action="/sh/login" method="post">
Usersname:<input type="text" name="username" value="${users.username }"><br>
Password:<input type="text" name="password" value="${users.password }"><br>
<input type="submit" value="submit">
</form>
我们可以专门写一个登录控制器来处理这个问题,让登录时根据method值的不同访问不同的方法
@Controller
@RequestMapping
public class LoginController {
@Autowired
private UsersService usersService;
@Autowired
private HttpSession session;
@RequestMapping(value="/login",method=RequestMethod.GET)
//当登录页面刷新时就会执行这个方法
public String login(){
return "login";
}
@RequestMapping(value="/login",method=RequestMethod.POST)
//参数RedirectAttributes attr是spring自动创建的
public String login(Users users,RedirectAttributes attr){
if(StringUtils.hasLength(users.getUsername())){
Users u = this.usersService.findByUsername(users.getUsername());
//有值就跳转到系统的首页
if(u!=null&&u.getPassword()!=null&&u.getPassword().equals(users.getPassword())){
session.setAttribute("admin", u);
return "redirect:/users/index";
}
}
//这里必须使用addFlashAttribute方法,这样在刷新登录页面时,attr中就没有值了
attr.addFlashAttribute("msg","用户名或密码错误");
//登录数据回显时使用的
attr.addFlashAttribute("users",users);
//这时我们重定向或者转发都可以满足要求
return "redirect:/login";
}
}