虽然不太推荐使用记住我功能, 但是,还是讲一下这个功能,实际上大多数使用session来管理。
1、applicationContext-shiro.xml文件
<!-- 安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!-- 配置记住我 -->
<property name="rememberMeManager" ref="rememberMeManager"></property>
</bean>
<!-- 记住密码Cookie -->
<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<constructor-arg value="rememberMe"/>
<!-- 7天,采用spring el表达式来计算,方便修改 -->
<property name="maxAge" value="#{7 * 24 * 60 * 60}"/>
<property name="domain" value=".yzixi.com"/>
</bean>
<!-- rememberMe管理器,cipherKey生成见{@code Base64Test.java} -->
<bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
<property name="cookie" ref="rememberMeCookie"/>
</bean>
2、登录页面
<div class="form-actions">
<div class="pull-left">
<label class="rememberme mt-checkbox mt-checkbox-outline">
<input type="checkbox" name="isRememberMe" value="1" /> 记住我
<span></span>
</label>
</div>
</div>
3、controller
@RequestMapping(value = "/login", method = RequestMethod.POST)
@ResponseBody
public LeeJSONResult doPostlogin(String username, String password, String captcha, @RequestParam(value="isRememberMe", defaultValue="0") Integer isRememberMe, HttpServletRequest request, HttpServletResponse response) {
if (StringUtils.isBlank(username)) {
return LeeJSONResult.errorMsg("用户名不能为空");
}
if (StringUtils.isBlank(password)) {
return LeeJSONResult.errorMsg("密码不能为空");
}
if (!itzixiCaptcha.validate(request, response, captcha)) {
return LeeJSONResult.errorMsg("验证码错误, 请重新输入...");
}
Subject user = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password.toCharArray());
if (isRememberMe == 1) {
token.setRememberMe(true);
}
try {
user.login(token);
} catch (UnknownAccountException e) {
return LeeJSONResult.errorMsg("账号不存在");
} catch (DisabledAccountException e) {
return LeeJSONResult.errorMsg("账号未启用");
} catch (IncorrectCredentialsException e) {
return LeeJSONResult.errorMsg("密码错误");
} catch (RuntimeException e) {
return LeeJSONResult.errorMsg("未知错误,请联系管理员");
}
return LeeJSONResult.ok();
}
主要是下面这个代码
if (isRememberMe == 1) {<!-- -->
token.setRememberMe(true);
}
当我们选中了记住我后,设置到token中即可。