有关验证码的博客请参看:https://hcshow.blog.csdn.net/article/details/109124877
修改ShiroConfig 首先在基中添加配置://记住我
@Bean(name = "rememberMeManager")
public CookieRememberMeManager rememberMeManager(){
CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
cookieRememberMeManager.setCookie(rememberMeCookie());
//这个地方有点坑,不是所有的base64编码都可以用,长度过大过小都不行,没搞明白,官网给出的要么0x开头十六进制,要么base64
cookieRememberMeManager.setCipherKey(Base64.decode("4AvVhmFLUs0KTA3Kprsdag=="));
return cookieRememberMeManager;
}
//cookie管理
@Bean
public SimpleCookie rememberMeCookie() {
SimpleCookie cookie = new SimpleCookie("rememberMe");
cookie.setHttpOnly(true);
cookie.setMaxAge(1 * 60 * 60);
return cookie;
}
修改创建DefaultWebSecurityManager方法的代码
登录
用户名:
密码:
验证码:
记住我
注册
后台控制器
@PostMapping("/login")
public String login(String username, String password, String verifyCode,Boolean rememberMe, HttpSession session, Model model) {
//判断用户名和密码为空
if (StringUtils.isEmpty(username)|| StringUtils.isEmpty(password) || StringUtils.isEmpty(rememberMe)){
model.addAttribute("msg","用户名和密码不能为空!");
return "login";
}
//比较验证码
String verifyCode0 = (String) session.getAttribute("verifyCode");
try {
if (verifyCode0.equalsIgnoreCase(verifyCode)) {
//获取当前的用户
Subject subject = SecurityUtils.getSubject();
//封装用户的登录数据
UsernamePasswordToken token = new UsernamePasswordToken(username, password,rememberMe);
//进行认证,认证时需要将用户名和密码封闭为token
subject.login(token);
return "index";
} else {
throw new RuntimeException("验证码错误");
}
} catch (UnknownAccountException e) { //用户名不存在
model.addAttribute("msg", "用户名错误");
return "login";
} catch (IncorrectCredentialsException e) { //用户名不存在
model.addAttribute("msg", "密码错误");
return "login";
}catch (LockedAccountException e){//账户锁定
model.addAttribute("msg","账户被锁定!");
return "login.html";
}catch (RuntimeException e){
model.addAttribute("msg", "验证码错误");
return "login";
}
}
结果
登录页面
下次再查看某个请求,不用登录就可以直接查看到结果了
退出登录添加记住我功能时,退出登录时,除了要当前的subject退出之外,还要删除用户浏览器上的Cookie信息
/**
* 退出登录
*
* 使用 setMaxAge(int expiry)方法来设置Cookie的存在时间,参数expiry应是一个整数。正值表示cookie将在这
* 么多秒以后失效。注意这个值是cookie将要存在的最大时间,而不是cookie现在的存在时间。 负值表示当浏览器关
* 闭时,Cookie将会被删除。零值则是要删除该Cookie
*
* @param model
* @return
*/
@RequestMapping("/logout")
public String lgout(Model model, HttpServletResponse response) {
Subject subject = SecurityUtils.getSubject();
if (subject.isAuthenticated()) {
subject.logout();
Cookie cookie = new Cookie("rememberMe", null);
cookie.setMaxAge(0);
response.addCookie(cookie);
}
return "index";
}