码迷,mamicode.com
首页 > 其他好文 > 详细

Cookie实现记住密码自动登录功能

时间:2016-01-25 19:18:48      阅读:258      评论:0      收藏:0      [点我收藏+]

标签:

网站登录的时候一般会有一个“记住密码”或者“一周之内记住我”之类的勾选框,勾选之后指定时间内访问同一网站将不需要再次输入账号密码,很方便,如下图所示

技术分享

原理很简单,如下

  1. 勾选复选框登录之后会传递一个开关值(on/off)给后台的登录方法(例如/login),以此为依据;
  2. 登录成功后,值为 on 时向客户端浏览器写入 Cookie 信息,包括用户名和密码(为安全计,可以更换或者加密要保存的信息);
  3. 再次访问站点时,读取浏览器传过来的 Cookie 信息并自动登录。

先看看登录方法

@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"));
    }
}

如果是转发的登录请求,需要特殊处理,比如关闭验证码验证、不用密码加密等等,保证能正常登录即可。

Cookie实现记住密码自动登录功能

标签:

原文地址:http://www.cnblogs.com/ywlaker/p/5157960.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!