content: package com.xxl.job.admin.service;
  
  import com.xxl.job.admin.core.model.XxlJobUser;
  import com.xxl.job.admin.core.util.CookieUtil;
  import com.xxl.job.admin.core.util.I18nUtil;
  import com.xxl.job.admin.core.util.JacksonUtil;
  import com.xxl.job.admin.dao.XxlJobUserDao;
  import com.xxl.job.core.biz.model.ReturnT;
  import org.springframework.context.annotation.Configuration;
  import org.springframework.util.DigestUtils;
  
  import javax.annotation.Resource;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import java.math.BigInteger;
  
  /**
   * @author xuxueli 2019-05-04 22:13:264
   */
  @Configuration
  public class LoginService {
  
  	public static final String LOGIN_IDENTITY_KEY = "XXL_JOB_LOGIN_IDENTITY";
  
  	@Resource
  	private XxlJobUserDao xxlJobUserDao;
  
  	private String makeToken(XxlJobUser xxlJobUser) {
  		String tokenJson = JacksonUtil.writeValueAsString(xxlJobUser);
  		String tokenHex = new BigInteger(tokenJson.getBytes()).toString(16);
  		return tokenHex;
  	}
  
  	private XxlJobUser parseToken(String tokenHex) {
  		XxlJobUser xxlJobUser = null;
  		if (tokenHex != null) {
  			String tokenJson = new String(new BigInteger(tokenHex, 16).toByteArray()); // username_password(md5)
  			xxlJobUser = JacksonUtil.readValue(tokenJson, XxlJobUser.class);
  		}
  		return xxlJobUser;
  	}
  
  	public ReturnT<String> login(HttpServletRequest request, HttpServletResponse response, String username,
  			String password, boolean ifRemember) {
  
  		// param
  		if (username == null || username.trim().length() == 0 || password == null || password.trim().length() == 0) {
  			return new ReturnT<String>(500, I18nUtil.getString("login_param_empty"));
  		}
  
  		// valid passowrd
  		XxlJobUser xxlJobUser = xxlJobUserDao.loadByUserName(username);
  		if (xxlJobUser == null) {
  			return new ReturnT<String>(500, I18nUtil.getString("login_param_unvalid"));
  		}
  		String passwordMd5 = DigestUtils.md5DigestAsHex(password.getBytes());
  		if (!passwordMd5.equals(xxlJobUser.getPassword())) {
  			return new ReturnT<String>(500, I18nUtil.getString("login_param_unvalid"));
  		}
  
  		String loginToken = makeToken(xxlJobUser);
  
  		// do login
  		CookieUtil.set(response, LOGIN_IDENTITY_KEY, loginToken, ifRemember);
  		return ReturnT.SUCCESS;
  	}
  
  	/**
  	 * logout
  	 * @param request
  	 * @param response
  	 */
  	public ReturnT<String> logout(HttpServletRequest request, HttpServletResponse response) {
  		CookieUtil.remove(request, response, LOGIN_IDENTITY_KEY);
  		return ReturnT.SUCCESS;
  	}
  
  	/**
  	 * logout
  	 * @param request
  	 * @return
  	 */
  	public XxlJobUser ifLogin(HttpServletRequest request, HttpServletResponse response) {
  		String cookieToken = CookieUtil.getValue(request, LOGIN_IDENTITY_KEY);
  		if (cookieToken != null) {
  			XxlJobUser cookieUser = null;
  			try {
  				cookieUser = parseToken(cookieToken);
  			}
  			catch (Exception e) {
  				logout(request, response);
  			}
  			if (cookieUser != null) {
  				XxlJobUser dbUser = xxlJobUserDao.loadByUserName(cookieUser.getUsername());
  				if (dbUser != null) {
  					if (cookieUser.getPassword().equals(dbUser.getPassword())) {
  						return dbUser;
  					}
  				}
  			}
  		}
  		return null;
  	}
  
  }
  