系统登录探究——(三)自动登录

用户每天在同一台电脑用同一账号登录同一网站时,可以设置记住我功能,这样在一段时间内无需每天输入用户名密码登录。系统实现自动登录之前,用户肯定是在第一次登录(输入用户名密码)时设置了登录按钮下方的“记住我”选项框,系统记住了用户的登录信息,所以之后一段时间内用户无需输入。用户第一次登录系统时“记住”功能的技术实现如下,下面来看代码。

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返回为空,说明用户未设置或设置“记住我”功能已过期,需要重新输入用户名密码登录系统。

转载于:https://my.oschina.net/powerisam/blog/483475

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值