标签:
网站登录的时候一般会有一个“记住密码”或者“一周之内记住我”之类的勾选框,勾选之后指定时间内访问同一网站将不需要再次输入账号密码,很方便,如下图所示
原理很简单,如下
先看看登录方法
@RequestMapping("/login")
public String login(LoginModel login, HttpServletRequest req, HttpServletResponse res, Model model) {
//...
}
登录对象 LoginModel 用来接收登录参数,当然需要添加一个 rememberMe 的 Field 了
public class LoginModel {
//省略其他 Field
private String rememberMe;
//省略 getters & setters
}
对应于登录表单的同名属性
<div class="form-group">
<input id="rememberMe" name="rememberMe" type="checkbox" style="vertical-align:middle;"/>
<label for="rememberMe" style="vertical-align:middle;">记住我</label>
</div>
这样提交表单之后就可以正常接收到是否记住我的开关值了,然后后台方法需要这样处理:向客户端写入 Cookie
//省略验证用户名密码获取用户对象user的过程
if ("on".equals(login.getRememberMe())) {
Tools.addCookie(res, Constant.SESSION_USER_NAME, user.getUserName(), Integer.MAX_VALUE);
Tools.addCookie(res, Constant.SESSION_PASSWORD, user.getPassword(), Integer.MAX_VALUE);
}
addCookie() 方法:
public static void addCookie(HttpServletResponse res, String key, String value, int age) {
Cookie cookie = new Cookie(key, value);
cookie.setMaxAge(age);
//更多设置请参考 API 文档
res.addCookie(cookie);
}
登录完可以在浏览器查看是否成功的写入了 Cookie ,打开 firebug 在控制台输入 document.cookie就可以看到了
Cookie 设置成功之后,下次登录时 Filter 就可以判断是否需要再次认证用户名和密码了,Filter 需要加上如下代码
//如果有cookie,用cookie登录
String userName = Tools.getCookie(req, Constant.SESSION_USER_NAME);
String password = Tools.getCookie(req, Constant.SESSION_PASSWORD);
if (userName != null && password != null) {
req.setAttribute("userName", userName);
req.setAttribute("password", password);
req.getRequestDispatcher("/login").forward(req, res);return;
}
getCookie() 方法:
public static String getCookie(HttpServletRequest req, String key) {
if (key == null || "".equals(key) || req == null) return null;
Cookie[] cookies = req.getCookies();
if (cookies == null || cookies.length == 0) return null;
for (Cookie cookie : cookies) {
if (cookie.getName().equals(key)) {
return cookie.getValue();
}
}
return null;
}
获取到 Cookie 的用户信息后,把userName 和 password 放入请求参数,使用 forward 自动登录,这个时候登录方法需要修改,特殊处理转发的登录请求
@RequestMapping("/login")
public String login(LoginModel login, HttpServletRequest req, HttpServletResponse res, Model model) {
HttpSession session = req.getSession();
login.setPassword(Tools.md5(Constant.MD5_PREFIX + login.getPassword()));
//如果转发的请求,关闭验证码,密码也不需要加密
if (req.getDispatcherType().equals(DispatcherType.FORWARD)) {
vcodeSwitch = false;
login = new LoginModel((String)req.getAttribute("userName"), (String)req.getAttribute("password"));
}
}
如果是转发的登录请求,需要特殊处理,比如关闭验证码验证、不用密码加密等等,保证能正常登录即可。
标签:
原文地址:http://www.cnblogs.com/ywlaker/p/5157960.html