摘要
本文将在Spring MVC的框架下介绍如何使用java代码在后台使用cookie设置用户的浏览器记住用户的用户名和密码。
本文将在Spring MVC的框架下介绍如何使用java代码在后台使用cookie设置用户的浏览器记住用户的用户名和密码。
本文不是坑,作者已试,完美解决用户记住登陆状态的问题。本示例需要使用Spirng的拦截器。
前端代码:
<form id="login_form" action="<%=path%>/login/toLogin" method="post" class="login-form"> <div class="form-group"> <label class="sr-only" for="userName">用户名</label> <input type="text" name="userName" placeholder="用户名" class="form-username form-control" id="userName" maxlength="20" required> </div> <div class="form-group"> <label class="sr-only" for="password">密码</label> <input type="password" name="password" placeholder="密码" required class="form-password form-control" id="password" maxlength="16"> </div> <div class="checkbox"> <label> <input name="rememberPwd" type="checkbox"> 记住我 </label> </div> </form>
cokkieTool.java工具类,用户可以完全拷贝此类的内容:
package com.blog.util; import java.util.HashMap; import java.util.Map; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.blog.constraint.BlogConstraint; import com.blog.entity.User; /** * cookie设置工具类 * * @author guopengfei 2016/12/28 * @since v2.0 * */ public class CookieTool { /** * 设置cookie(接口方法) * * @author 郭鹏飞 码上中国博客(www.blog-china.cn) * @param response * @param name * cookie名字 * @param value * cookie值 * @param maxAge * cookie生命周期 以秒为单位 */ public static void addCookie(HttpServletResponse response, String name, String value, int maxAge) { Cookie cookie = new Cookie(name, value); cookie.setPath("/"); if (maxAge > 0) { cookie.setMaxAge(maxAge); } response.addCookie(cookie); } /** * 根据名字获取cookie(接口方法) * * @author guopengfei * @param request * @param name * cookie名字 * @return */ public static Cookie getCookieByName(HttpServletRequest request, String name) { Map<String, Cookie> cookieMap = ReadCookieMap(request); if (cookieMap.containsKey(name)) { Cookie cookie = (Cookie) cookieMap.get(name); return cookie; } else { return null; } } /** * 将cookie封装到Map里面(非接口方法) * * @author guopengfei * @param request * @return */ private static Map<String, Cookie> ReadCookieMap(HttpServletRequest request) { Map<String, Cookie> cookieMap = new HashMap<String, Cookie>(); Cookie[] cookies = request.getCookies(); if (null != cookies) { for (Cookie cookie : cookies) { cookieMap.put(cookie.getName(), cookie); } } return cookieMap; } /** * 获取请求中的session用户 * @param request * @return */ public static User getSessionUser(HttpServletRequest request) { return (User) request.getSession().getAttribute(BlogConstraint.SESSION_USER); } }
拦截器代码,此处仅仅处理了用户是否登陆,cookie是否存有用户信息,session中是否存在用户信息,cookie中保存的用户信息是否能够在系统中查找到该用户:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { String uri = request.getRequestURI();// 返回请求行中的资源名称 String contextPath = request.getContextPath(); User users = null; System.out.println("拦截URL为:\t" + uri); //获取session中的用户 User utcUsers = (User) request.getSession().getAttribute( BlogConstraint.SESSION_USER); if(utcUsers !=null){ System.out.println("session中存在用户"); return true; } /* * 注意:每次重新启动浏览器会重新启动一个sessionId和Cookie,之前设置的session会因为sessionId的变化而取不到, * 所以会出现用户明明已经登录,但是重开浏览器又需要登录. 流程: * 1、用户选择记住密码:取出cookie中的用户名和密码查询,如果此用户已不存在 * ,则清除cookie中的值,如果存在则判断用户是否重新登录,如果未重新登录则将cookie中用户信息设置到session中 * ,如果用户重新登录了则判断登录用户是否与cookie中用户一致 * ,一致则将cookie中用户信息设置到session中,不一致则将当前登录用户的信息设置到session中。 * 将用户信息放入session中是为了(通过cookie中的用户名密码可以得到用户信息): * 1、重开浏览器的时候如果已经登录的用户可以直接进入 * 2、防止用户直接将执行方法的连接拷贝进地址栏,而方法中又需要在session中取用户信息的错误 * 2、用户未选记住密码:判断session中是否存在用户信息,如果存在,则true,如果不存在则返回登录页面 */ Cookie cokLoginName = CookieTool.getCookieByName(request, "loginName"); Cookie cokLoginPwd = CookieTool.getCookieByName(request, "loginPwd"); // 如果前面的人登录勾选了记住密码,cookie中存在上一个人的信息 if (cokLoginName != null && cokLoginPwd != null && cokLoginName.getValue() != "" && cokLoginPwd.getValue() != "") { String loginName = cokLoginName.getValue(); String loginPwd = cokLoginPwd.getValue(); // 检查到客户端保存了用户的密码,进行该账户的验证 users = userDao.findUserByNameAndPwd(loginName,loginPwd); if (users == null) { //cookie中缓存的用户在数据库中不存在 CookieTool.addCookie(response, "loginName", null, 0); // 清除Cookie CookieTool.addCookie(response, "loginPwd", null, 0); // 清除Cookie } else { // cookie中缓存的用户在数据库中存在 request.getSession().setAttribute( BlogConstraint.SESSION_USER, users); } } }
用户点击登陆时的controller代码下面代码的含义是,当用户登录时勾选了name属性为“rememberPwd”的复选框时,传递到后台的值默认就是on,如果没勾选,值为空或者in,当用户勾选了记住我的选项,则将用户的信息保存进入session,同时设置cookie信息:
int loginMaxAge = Integer.MAX_VALUE; //定义账户密码的生命周期,这里是一个月。单位为秒 String rememberPwd = request.getParameter("rememberPwd")==null?"":request.getParameter("rememberPwd").toString(); if ("on".equals(rememberPwd)) { CookieTool.addCookie(response , "loginName" , user.getUserName() , loginMaxAge); //将姓名加入到cookie中 CookieTool.addCookie(response , "loginPwd" , user.getPassword() , loginMaxAge); //将密码加入到cookie中 } request.getSession().setAttribute(BlogConstraint.SESSION_USER, (User) map.get("user"));
记得用户点击退出登录时,需要将cokkie中的用户信息抹除:
@RequestMapping("/singUp") public String singUp(HttpServletRequest request,HttpServletResponse response) { String prePage = request.getParameter("prePage"); request.getSession().removeAttribute(BlogConstraint.SESSION_USER); CookieTool.addCookie(response, "loginName", null, 0); // 清除Cookie CookieTool.addCookie(response, "loginPwd", null, 0); // 清除Cookie if(prePage == null || prePage.trim().equals("")) prePage = "/"; logger.info("退出时的当前页面为:" + prePage); return "redirect:" + prePage; }
至此,就完成了使用java设置浏览器cookie记住用户登录信息的功能。