博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
系统登录探究——(三)自动登录
阅读量:2393 次
发布时间:2019-05-10

本文共 3548 字,大约阅读时间需要 11 分钟。

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

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

你可能感兴趣的文章
Tensorflow-Python-API-翻译(constant_op)
查看>>
Tensorflow-Python-API-翻译(framework)
查看>>
Tensorflow-Python-API-翻译(math_ops)(第二部分)
查看>>
Tensorflow-Python-API-翻译(math_ops)(第一部分)
查看>>
Tensorflow-Python-API-翻译(nn)
查看>>
Tensorflow-Python-API-翻译(sparse_ops)
查看>>
论文阅读---An-Artificial-Neural-Network-based-Stock-Trading-System-Using-T
查看>>
A-Paper-A-Day--#1-Convolutional-Sequence-to-Sequence-Learning
查看>>
7个很棒的-chatbot-应用场景
查看>>
标记问题:词性标注(POS)和命名实体识别(NER)
查看>>
标记问题:介绍
查看>>
标记问题:生成模型和噪声通道模型
查看>>
机器学习算法在文本分类中的应用综述
查看>>
利用-TensorFlow-构建卷积神经网络
查看>>
利用-TensorFlow-实现排序和搜索算法
查看>>
利用TensorFlow实现卷积神经网络做文本分类
查看>>
如何构建高可读性和高可重用的-TensorFlow-模型
查看>>
使用TensorFlow识别交通标志
查看>>
122. Best Time to Buy and Sell Stock II [medium] (Python)
查看>>
推荐-线下AUC提升,线上CTR无提升
查看>>