读书人

j2ee cookie 兑现自动登录

发布时间: 2012-10-20 14:12:48 作者: rapoo

j2ee cookie 实现自动登录

2、在负责处理登录过程的Servlet中,判断用户是否选择了该复选框。如果是,则执行这两个操作:向用户发送两个Cookie,以及向数据库写入一条相应的记录。

代码:

Cookie ckUsername, ckSessionid;

if (autologin.equals("on")) {
?? // 如果用户选择了“两周内自动登录”,则向用户发送两个cookie。
?? // 一个cookie记录用户名,另一个记录唯一的验证码,
?? // 并将此验证码写入数据库,以备用户返回时查询。(防止伪造cookie)
?? ckUsername = new Cookie("autoLoginUser", user.getUsername()); // user是代表用户的bean
?? ckUsername.setMaxAge(60 * 60 * 24 * 14);?? //设置Cookie有效期为14天
?? res.addCookie(ckUsername);

?? sessionid = session.getId(); // 取得当前的session id
?? ckSessionid = new Cookie("sessionid", sessionid);
?? ckSessionid.setMaxAge(60 * 60 * 24 * 14);
?? res.addCookie(ckSessionid);

?? // 在数据库中插入相应记录
?? userSessionDAO.insertUserSession(user, sessionid);
}

3、实现自动登录。因为用户下次访问的时候,可能直接访问网站的任何页面(例如通过收藏夹),而不一定是首页或者登录页面,所以我们需要用Filter拦截到达该网站的所有请求,并执行自动登录。

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
?? HttpServletRequest request = (HttpServletRequest) req;
?? HttpSession session = request.getSession(true);
?? String username;
?? String sessionid;?? // 此sessionid是上次用户登录时保存于用户端的识别码,用于用户后续访问的自动登录。不是本次访问的session id。
?? Cookie[] cookies;
?? CookieManager cm = new CookieManager(); // CookieManager是一个自定义的类,用于从Cookie数组中查找并返回指定名称的Cookie值。
?? boolean isAutoLogin;

?? // 如果session中没有user对象,则创建一个。
?? User user = (User) session.getAttribute("user");
?? if (user == null) {
??? user = new User(); // 此时user中的username属性为"",表示用户未登录。
?? }

?? // 如果user对象的username为"",表示用户未登录。则执行自动登录过程。
?? // 否则不自动登录。
?? if (user.getUsername().equals("")) {
??? // 检查用户浏览器是否发送了上次登录的用户名和sessionid,
??? // 如果是,则为用户自动登陆。
??? cookies = request.getCookies();
??? username = cm.getCookieValue(cookies, "autoLoginUser");
??? sessionid = cm.getCookieValue(cookies, "sessionid");
??? isAutoLogin = userSessionDAO.getAutoLoginState(username, sessionid); // 如果在数据库中找到了相应记录,则说明可以自动登录。

??? if (isAutoLogin) {
???? user.setUsername(username);
???? user.setNickname(DBUtil.getNickName(username));
???? session.setAttribute("user", user); // 将user bean添加到session中。
??? }
?? }
?? chain.doFilter(req, resp);
}

4、注销。只有当用户在上次访问时,未经注销就离开网站,我们才能在该用户下次访问时执行自动登录。如果用户显式的执行了注销操作,那就表示该用户 不希望我们记住他。我们需要在执行注销操作的Servlet中,从数据库中删除相应记录。这样,下次用户访问的时候就不会执行自动登录了。

五、改进

用户可能为了方便,自行修改Cookie中的有效期,从而达到长期自动登录的目的。对某些存有敏感信息的网站来说,这样做并不安全。当用户长时间没有使用他的电脑,或者将电脑遗弃、转让了,而保存于其中的Cookie仍然是有效的,这就为用户和网站带来潜在的风险。

要解决这个问题,我们可以在数据库中增加一个字段,用以记录自动登录的过期日。这样,是否执行自动登录就不再以客户端的Cookie有效期为准,而 是以服务器端数据库中的信息为准。当我们想要调整用户自动登录的有效期的时候,只需要修改数据库中相应的日期字段即可,因而这一过程变得更加安全。

读书人网 >J2EE开发

热点推荐