通过cookie实现记住登录状态

通过cookie实现记住登录状态


基于用session来判断用户的登录状态,然后用存放在浏览器的cookie来判断是否需要帮助登录
登录时存cookie到客户端

// 是否记住登录状态
if (remember != null && remember == 1) {
     
	// 免登录,将登录信息放入cookie
	String cookieValue = CookieUtils.getCookieValue(userAccount, md5, request);
	if (StringUtils.isBlank(cookieValue)) {
     
		// 生成cookie失败,放弃设置cookie
		return Message.success();
	}
	// 过期时间
	String cookieTimeout = Conf.getValue(CookieUtils.COOKIE_TIMEOUT, CookieUtils.COOKIE_PATH);
	try {
     
		int cookieTimeoutInt = Integer.parseInt(cookieTimeout);
		// 创建Cookie  
		Cookie cookie = new Cookie(CookieUtils.COOKIE_KEY, cookieValue);
		cookie.setHttpOnly(true);
		// 有效期,秒为单位  
		cookie.setMaxAge(cookieTimeoutInt);
		// 设置cookie  
		response.addCookie(cookie);
	} catch (NumberFormatException e) {
     
		e.printStackTrace();
	}
} else {
     
	// 不记住登录状态,则让cookie过期
	CookieUtils.invalidateCookie(request, response);
}

验证是否有cookie

/**
* 判断用户是否是登录状态
*/
private boolean isLogin(HttpServletRequest request) {
     
      	//验证session是否存在
	HttpSession session = request.getSession();
	Object obj = session.getAttribute("user");
	if(obj == null) {
     
		// 没有session,验证cookie
		Cookie[] cookies = request.getCookies();
		if (cookies != null) {
     
			for (Cookie c : cookies) {
     
				// cookie键
				String name = c.getName();
				// cookie值
				String value = c.getValue();
				if (!StringUtils.isAnyBlank(name, value) && name.equals(CookieUtils.COOKIE_KEY)) {
     
					System.out.println(name + " --->> " + value);
					// 解密cookie值
					String valueDe = ASEPSW.decrypt(value);
					// 截取出用户名和加密的cookie字符串
					String[] cookieStrings = valueDe.split("\\|");
					if (cookieStrings != null && cookieStrings.length == 2) {
     
						// 用户名
						String userAccount = cookieStrings[0];
						// 加密后的cookie值
						String cookieValue = cookieStrings[1];
						if (!StringUtils.isAnyBlank(userAccount, cookieValue)) {
     
							// 生成新cookie
							String cookieValueNew = CookieUtils.getCookieValue(userAccount, request);
							// 判断是否匹配
							if (value.equals(cookieValueNew)) {
     
								// 匹配成功,重新赋值session
								return ukUserService.reflashInfo(userAccount, request);
							}
						}
					}
				}
			}
		}
	    return false;
	}
	return true;
}

cookie工具类

@Component
public class CookieUtils {
     

	/**
	 * cookie key
	 */
	public final static String COOKIE_KEY = "123";
	
	/**
	 * cookie配置文件地址
	 */
	public final static String COOKIE_PATH = "/conf/cookie.properties";

	/**
	 * cookie有效时间key
	 */
	public final static String COOKIE_TIMEOUT = "cookieTimeout";

	/**
	 * cookie用户密码(加密后的)的位数设置:加密密码的前N位 key
	 */
	public final static String COOKIE_PASSWORD_DIGIT = "cookiePasswordDigit";

	/**
	 * cookie加密盐key
	 */
	public final static String COOKIE_SALT = "cookieSalt";


	@Autowired
	private UkUserMapper userMapper;
	
	public static CookieUtils cookieUtils;
    
    @PostConstruct
    public void init() {
         
    	cookieUtils = this;
    } 
    
	/**
	 * 获取cookie值
	 * 	规则:
	 * 		cookie值组成:登录名|“加密过后的md5值”,后加密过后的字符串
	 * 		md5值:登录名+有效时间Expires+用户密码(加密后的)的前几位 + salt + 请求头中的User-Agent值
	 */
	public static String getCookieValue(String userAccount, String password, HttpServletRequest request) {
     
		// 过期时间
		String cookieTimeout = Conf.getValue(COOKIE_TIMEOUT, COOKIE_PATH);
		// 密码截取位数
		String cookiePasswordDigit = Conf.getValue(COOKIE_PASSWORD_DIGIT, COOKIE_PATH);
		// 加密盐
		String cookieSalt = Conf.getValue(COOKIE_SALT, COOKIE_PATH);
		// 判空
		if (StringUtils.isAnyBlank(userAccount, password, cookieTimeout, cookiePasswordDigit, cookieSalt)) {
     
			return null;
		}
		// 截取密码
		String passwordSub = password.substring(0, Integer.parseInt(cookiePasswordDigit));
		// 请求头中的User-Agent值
		String userAgent = request.getHeader("User-Agent");
		// 组装
		String value = userAccount + cookieTimeout + passwordSub + cookieSalt + (StringUtils.isNotBlank(userAgent) ? "" : userAgent);
		// 加密
		String valueMd5 = Md5Util.md5(value, 10);
		return ASEPSW.encrypt(userAccount + "|" + valueMd5);
	}
	
	/**
	 * 通过账号获取cookie
	 * 	规则:
	 * 		cookie值组成:登录名|“加密过后的md5值”,后加密过后的字符串
	 * 		md5值:登录名+有效时间Expires+用户密码(加密后的)的前几位 + salt + 请求头中的User-Agent值
	 */
	public static String getCookieValue(String userAccount, HttpServletRequest request) {
     
		// 获取用户密码
		EntityWrapper<UkUser> ew=new EntityWrapper<UkUser>();
		ew.eq("unique_id", userAccount).eq("status", 1);
		List<UkUser> list = cookieUtils.userMapper.selectList(ew);
		if(list != null && list.size() == 1) {
     
			String password = list.get(0).getPassword();
			return getCookieValue(userAccount, password, request);
		}
		return null;
	}
	
	/**
	 * 清除cookie
	 */
	public static void invalidateCookie(HttpServletRequest request, HttpServletResponse response) {
     
		Cookie[] cookies = request.getCookies();
		if (cookies != null) {
     
			for (Cookie c : cookies) {
     
				// cookie键
				String name = c.getName();
				// cookie值
				String value = c.getValue();
				if (!StringUtils.isAnyBlank(name, value) && name.equals(CookieUtils.COOKIE_KEY)) {
     
					// 删除cookie
					c.setMaxAge(0);
					response.addCookie(c);
				}
			}
		}
	}
}

cookie配置文件


#	cookie加密配置,修改以下任意一个参数都会造成
#
#		所有用户记住的登录状态失效
#
#	请谨慎

#有效时间,单位秒
cookieTimeout=2592000
#用户密码(加密后的)的位数设置:加密密码的前N位,不能超过密码总长度(当前为32位)
cookiePasswordDigit=29
#加密盐
cookieSalt=2019

这样就实现了通过cookie记录登录状态了

你可能感兴趣的:(java,java)