用户每天在同一台电脑用同一账号登录同一网站时,可以设置记住我功能,这样在一段时间内无需每天输入用户名密码登录。系统实现自动登录之前,用户肯定是在第一次登录(输入用户名密码)时设置了登录按钮下方的“记住我”选项框,系统记住了用户的登录信息,所以之后一段时间内用户无需输入。用户第一次登录系统时“记住”功能的技术实现如下,下面来看代码。
public static void setUserCookie(HttpServletRequest req,HttpServletResponse res,User user,String flag){ //cookie默认的生命周期 int maxAgeTemp=-1; //flag判断用户是否勾选了“记住我”选项,若值为1则设置cookie的生命周期,一般为15天 if("1".equals(flag)){ maxAgeTemp = (Integer) PropertiesPlugin.getParamMapValue(DictKeys.config_maxAge_key); } //设置Cookie addCookie(res,"","/",true,"userName",user.getStr("username"),maxAgeTemp); String userid = user.getInt("Id").toString(); String ip = getIpAddr(req); String userAgent = req.getHeader("User-Agent"); long date = getTime(); StringBuilder token = new StringBuilder(); token.append(date).append(".#.").append(userid).append(".#.").append(ip).append(".#.").append(userAgent); String authToken = token.toString(); byte[] authTokenByte = null; try { authTokenByte = authToken.getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } String securityKey = (String) PropertiesPlugin.getParamMapValue(DictKeys.config_securityKey_key); byte[] keyByte = Base64.decodeBase64(securityKey); // 4. 认证cookie加密 byte[] securityByte = null; try { securityByte = ToolSecurityIDEA.encrypt(authTokenByte, keyByte); } catch (Exception e) { e.printStackTrace(); } String securityCookie = Base64.encodeBase64String(securityByte); // 5. 认证cookie Base64编码 try { byte[] b = Base64.encodeBase64URLSafe(securityCookie.getBytes("UTF-8")); securityCookie = new String(b, "UTF-8"); } catch (Exception e) { e.printStackTrace(); } //设置Cookie addCookie(res,"","/",true,"authmark",securityCookie,maxAgeTemp);}
当用户第二次登录系统时系统发现此人之前设置过自动登录功能,所以此时无需用户输入用户名和密码,系统自动实现登录。此时只需要在登录方法中加入判断,判断该用户是否第一次登录时设置过“记住我”功能。实现的代码如下:
public static User getCookieUser(HttpServletRequest request, boolean userAgentVali) { String loginCookie = ToolWeb.getCookieValueByName(request, "authmark"); if (null != loginCookie && !loginCookie.equals("")) { // 1. Base64解码cookie令牌 try { loginCookie = ToolString.decode(loginCookie); } catch (Exception e) { e.printStackTrace(); } // 2. 解密cookie令牌 byte[] securityByte = Base64.decodeBase64(loginCookie); String securityKey = (String) PropertiesPlugin.getParamMapValue(DictKeys.config_securityKey_key); byte[] keyByte = Base64.decodeBase64(securityKey); byte[] dataByte = null; try { dataByte = ToolSecurityIDEA.decrypt(securityByte, keyByte); } catch (Exception e) { e.printStackTrace(); } String data = new String(dataByte); String[] datas = data.split(".#."); //arr[0]:时间戳,arr[1]:USERID,arr[2]:USER_IP, arr[3]:USER_AGENT // 3. 获取数据 long loginDateTimes = Long.parseLong(datas[0]);// 时间戳 String userIds = datas[1];// 用户id String ips = datas[2];// ip地址 String userAgent = datas[3];// USER_AGENT String newIp = ToolWeb.getIpAddr(request); String newUserAgent = request.getHeader("User-Agent"); Date start = getDate(); start.setTime(loginDateTimes); int day = getDateDaySpace(start, getDate()); // 4. 验证数据有效性 if (ips.equals(newIp) && (userAgentVali ? userAgent.equals(newUserAgent) : true) && day <= 365) { Object userObj = User.dao.cacheGet(userIds); if (null != userObj) { User user = (User) userObj; return user; } } } return null;}
若用户返回不为空,则说明用户之前设置过“记住我”功能,且在有效期内,则系统直接登录;如果user返回为空,说明用户未设置或设置“记住我”功能已过期,需要重新输入用户名密码登录系统。