Commit 3b01caa6 authored by 技术部-任文超's avatar 技术部-任文超

Merge branch '20191025-sonar' into 'master'

20191025 sonar

See merge request !36
parents 01111283 e866a8bf
......@@ -6,26 +6,26 @@ package cn.quantgroup.user.enums;
public enum MaritalStatus {
UNKNOWN("未知"),
SINGLE("未婚"), // 1
MARRIED("已婚"), // 2
DIVORCED("离异"), // 3
WINDOWED("丧偶"), // 4
SINGLE("未婚"),
MARRIED("已婚"),
DIVORCED("离异"),
WINDOWED("丧偶"),
OTHER("其他");
String description;
private String desc;
MaritalStatus(String desc) {
description = desc;
this.desc = desc;
}
public String getDescription() {
return description;
public String getDesc() {
return desc;
}
@Override
public String toString() {
String sb = "MaritalStatus{" + "description='" + description + '\'' +
String sb = "MaritalStatus{" + "desc='" + desc + '\'' +
'}';
return sb;
}
......
......@@ -15,19 +15,19 @@ public enum Relation {
SELF("本人"),
OTHER("其他");
String description;
private String desc;
Relation(String desc) {
description = desc;
this.desc = desc;
}
public String getDescription() {
return description;
public String getDesc() {
return desc;
}
@Override
public String toString() {
String sb = "Relation{" + "description='" + description + '\'' +
String sb = "Relation{" + "desc='" + desc + '\'' +
'}';
return sb;
}
......
......@@ -25,14 +25,58 @@ public interface Constants {
Long VERIFICATION_CODE_FINITE_COUNT = 3L;
String X_AUTH_TOKEN = "x-auth-token";
int VERIFICATION_LEN = 2;
int SMS_CODE_LEN_4 = 4;
int SMS_CODE_LEN_6 = 6;
int TOKEN_LENGTH = 36;
int MD5_LENGTH = 32;
int THOUSAND_SECOND = 1000;
int MILLIS_PER_SECOND = 1000;
int MILLIS_OF_TEN_SECOND = 10000;
int PAGE_SIZE_MAX = 200;
int PAGE_SIZE_DEFAULT = 30;
int DAY_NO_MAX = 31;
int DAY_NO_MIN = 1;
int MONTH_NO_MAX = 12;
int MONTH_NO_MIN = 1;
int AGE_MAX = 150;
int USER_QUERY_INFO_BATCH_SIZE = 3000;
int USER_ID_BATCH_SIZE = 500;
/** 垃圾,前辈竟然用这个办法来识别UUID */
int UUID_MIN_LENGTH = 10;
String AUTO_SORT_TYPE = "auto";
String CHECK_FAIL = "fail";
String SPLIT_CHAR = ":";
String TOKEN_MASTER = "*";
String PASSWORD_HEADER = "Basic ";
int AUTHORIZE_HEADER_SIZE = 2;
String PAGE_NEXT_KEY_XYQB = "xyqb";
/**
* 登录账号/手机号参数名
*/
String PHONE_NO = "phoneNo";
String ID_NO = "idNo";
String USER_ID = "userId";
String USER_NAME = "name";
String BANK_CARD = "bankCard";
String ADDRESS = "address";
String PASSWORD = "password";
String RESULT_CODE = "code";
String RESULT_DATA = "data";
String SUCCESS_CODE = "0000";
String PROTOCOL_HEAD_HTTPS = "https:";
String PROTOCOL_HEAD_HTTP = "http";
String REDIRECT = "redirect";
String LOCAL = "local";
String DOCKER_DOMAIN = "liangkebang";
/**
* 微信标识参数名
*/
String WECHAT_OPEN_ID = "wechat_open_id";
String MERCHANT_BAITIAO = "baitiao";
String MERCHANT_WECHAT_PAY = "wechat-pay";
// -- Start -- IPV4安全策略常量组
/**
......@@ -109,13 +153,19 @@ public interface Constants {
* 默认随机密码长度
*/
int RANDOM_PWD_LEN = 15;
/** 旧的大陆身份证号长度 */
int ID_NO_OLD_LENGTH = 15;
/** 标准大陆身份证号长度 */
int IDNO_LENGTH = 18;
int ID_NO_STANDARD_LENGTH = 18;
int ID_NO_CHECK_LENGTH = 17;
int ID_NO_AREA_CODE_LENGTH = 2;
int ID_NO_CHECK_MASK = 11;
int GENDER_MASK = 2;
interface Channel {
long BAITIAO = 222L;
String LKB_CODE = "0002"; // 量化派channnel_code
long WECHAT = 198L;
long HENGCHANG = 58L;
}
interface Session {
......
package cn.quantgroup.xyqb.aspect.accessable;
import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.util.IPUtil;
import cn.quantgroup.xyqb.util.IpUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
......@@ -20,10 +21,10 @@ import javax.servlet.http.HttpServletRequest;
* @author renwc
* @date 2017-12-01
*/
@Slf4j
@Aspect
@Component
public class IpValidateAdvisor {
private static final Logger LOGGER = LoggerFactory.getLogger(IpValidateAdvisor.class);
@Pointcut("execution(public * cn.quantgroup.xyqb.controller.internal..*.*Controller.*(..)) " +
" || execution(public * cn.quantgroup.xyqb.controller.dust..*.*Controller.*(..)) " +
......@@ -35,13 +36,13 @@ public class IpValidateAdvisor {
private Object doWhiteIpMatch(ProceedingJoinPoint pjp) throws Throwable {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
// 客户端IP
String clientIp = IPUtil.getRemoteIP(request);
String clientIp = IpUtil.getRemoteIP(request);
// 白名单
if (IPUtil.whiteOf(clientIp)) {
if (IpUtil.whiteOf(clientIp)) {
return pjp.proceed();
}
IPUtil.logIp(LOGGER, request);
LOGGER.error("Lock_ipv4: don't match white ip access:{}", clientIp);
IpUtil.logIp(log, request);
log.error("Lock_ipv4: don't match white ip access:{}", clientIp);
return JsonResult.buildErrorStateResult("非法访问", null);
}
}
......@@ -4,9 +4,10 @@ package cn.quantgroup.xyqb.aspect.captcha;
import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.thirdparty.jcaptcha.AbstractManageableImageCaptchaService;
import cn.quantgroup.xyqb.util.IPUtil;
import cn.quantgroup.xyqb.util.IpUtil;
import cn.quantgroup.xyqb.util.ValidationUtil;
import com.octo.captcha.service.CaptchaServiceException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
......@@ -37,11 +38,11 @@ import java.util.UUID;
* @version 1.0.0
* @since 2017-11-07
*/
@Slf4j
@Aspect
@Component
public class CaptchaFiniteValidateAdvisor {
private static final Logger LOGGER = LoggerFactory.getLogger(CaptchaFiniteValidateAdvisor.class);
private static final String SUPER_CAPTCHA_ID = UUID.nameUUIDFromBytes("__QG_APPCLIENT_AGENT__".getBytes(Charset.forName("UTF-8"))).toString();
private static final String SUPER_CAPTCHA = "__SUPERQG__";
......@@ -84,7 +85,7 @@ public class CaptchaFiniteValidateAdvisor {
String phoneNo = phonePasswordMap.get(Constants.PHONE_NO);
Long countErrorByPhone = getCount(phoneNo);
if (countErrorByPhone == null) {
LOGGER.info("用户名或密码不正确, phoneNo={}, countErrorByPhone={}, clientIp={}", phoneNo, countErrorByPhone, IPUtil.getRemoteIP(request));
log.info("用户名或密码不正确, phoneNo={}, countErrorByPhone={}, clientIp={}", phoneNo, countErrorByPhone, IpUtil.getRemoteIP(request));
return JsonResult.buildErrorStateResult("用户名或密码不正确", null);
}
if (countErrorByPhone > Constants.Image_Need_Count) {
......@@ -92,7 +93,7 @@ public class CaptchaFiniteValidateAdvisor {
String captchaId = Optional.ofNullable(request.getParameter(Constants.QG_CAPTCHA_ID)).orElse("");
String captchaValue = request.getParameter(Constants.QG_CAPTCHA_VALUE);
if (shouldSkipCaptchaValidate(registerFrom, captchaId, captchaValue)) {
LOGGER.info("使用超级图形验证码校验, registerFrom={}, clientIp={}", registerFrom, IPUtil.getRemoteIP(request));
log.info("使用超级图形验证码校验, registerFrom={}, clientIp={}", registerFrom, IpUtil.getRemoteIP(request));
return pjp.proceed();
}
if (StringUtils.isNotBlank(captchaValue)) {
......@@ -103,7 +104,7 @@ public class CaptchaFiniteValidateAdvisor {
try {
validCaptcha = imageCaptchaService.validateResponseForID(Constants.IMAGE_CAPTCHA_KEY + captchaId, captcha);
} catch (CaptchaServiceException ex) {
LOGGER.error("验证码校验异常, {}, {}", ex.getMessage(), ex);
log.error("验证码校验异常, {}, {}", ex.getMessage(), ex);
}
if (validCaptcha) {
return pjp.proceed();
......@@ -150,19 +151,18 @@ public class CaptchaFiniteValidateAdvisor {
* @return 账密参数Map 或 null
*/
private Map<String, String> getHeaderParam(HttpServletRequest request) {
String verificationHeader = "Basic ";
String credential = request.getHeader("authorization");
if (StringUtils.isBlank(credential) || !credential.startsWith(verificationHeader)) {
LOGGER.info("参数无效, credential:{}", credential);
if (StringUtils.isBlank(credential) || !credential.startsWith(Constants.PASSWORD_HEADER)) {
log.info("参数无效, credential:{}", credential);
return null;
}
credential = credential.substring(verificationHeader.length(), credential.length());
credential = credential.substring(Constants.PASSWORD_HEADER.length());
byte[] buf = Base64.decodeBase64(credential);
credential = new String(buf, Charset.forName("UTF-8"));
String[] credentialArr = credential.split(":");
boolean headerParamValid = credentialArr.length == 2;
if (!headerParamValid) {
LOGGER.info("参数无效, credential:{}", credential);
log.info("参数无效, credential:{}", credential);
return null;
}
// 当前用户手机号和密码
......@@ -170,10 +170,10 @@ public class CaptchaFiniteValidateAdvisor {
String password = credentialArr[1];
headerParamValid = headerParamValid && ValidationUtil.validatePhoneNo(phoneNo) && StringUtils.isNotBlank(password);
if (!headerParamValid) {
LOGGER.info("参数无效, credential:{}, phoneNo:{}, password:{}", credential, phoneNo, password);
log.info("参数无效, credential:{}, phoneNo:{}, password:{}", credential, phoneNo, password);
return null;
}
LOGGER.info("账密登录, phoneNo:{}", phoneNo);
log.info("账密登录, phoneNo:{}", phoneNo);
Map<String, String> phonePasswordMap = new HashMap<>(2);
phonePasswordMap.put(Constants.PHONE_NO, phoneNo);
phonePasswordMap.put("password", password);
......
......@@ -5,7 +5,7 @@ import cn.quantgroup.xyqb.model.ClientType;
import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.service.captcha.IGeetestCaptchaService;
import cn.quantgroup.xyqb.service.captcha.IQuantgroupCaptchaService;
import cn.quantgroup.xyqb.util.IPUtil;
import cn.quantgroup.xyqb.util.IpUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
......@@ -84,8 +84,8 @@ public class CaptchaNewValidateAdvisor {
String challenge = request.getParameter(Constants.FN_GEETEST_CHALLENGE);
String validate = request.getParameter(Constants.FN_GEETEST_VALIDATE);
String seccode = request.getParameter(Constants.FN_GEETEST_SECCODE);
log.info("Geetest - 极验二次校验, phoneNo:{}, uniqueKey:{}, clientType:{}, ip:{}, challenge:{}, validate:{}, seccode:{}", phoneNo, uniqueKey, clientType, IPUtil.getRemoteIP(request), challenge, validate, seccode);
return geetestCaptchaService.validGeetestCaptcha(uniqueKey, IPUtil.getRemoteIP(request), ClientType.valueByName(clientType), challenge, validate, seccode);
log.info("Geetest - 极验二次校验, phoneNo:{}, uniqueKey:{}, clientType:{}, ip:{}, challenge:{}, validate:{}, seccode:{}", phoneNo, uniqueKey, clientType, IpUtil.getRemoteIP(request), challenge, validate, seccode);
return geetestCaptchaService.validGeetestCaptcha(uniqueKey, IpUtil.getRemoteIP(request), ClientType.valueByName(clientType), challenge, validate, seccode);
}
/**
......@@ -99,7 +99,7 @@ public class CaptchaNewValidateAdvisor {
String phoneNo = request.getParameter(Constants.PHONE_NO);
String captchaId = Optional.ofNullable(request.getParameter(Constants.QG_CAPTCHA_ID)).orElse("");
String captchaValue = request.getParameter(Constants.QG_CAPTCHA_VALUE);
log.info("Quantgroup - 图形验证码校验, phoneNo:{}, ip:{}, captchaId:{}, captchaValue:{}", phoneNo, IPUtil.getRemoteIP(request), captchaId, captchaValue);
log.info("Quantgroup - 图形验证码校验, phoneNo:{}, ip:{}, captchaId:{}, captchaValue:{}", phoneNo, IpUtil.getRemoteIP(request), captchaId, captchaValue);
return quantgroupCaptchaService.validQuantgroupCaptcha(captchaId, captchaValue);
}
......
......@@ -3,8 +3,9 @@ package cn.quantgroup.xyqb.aspect.captcha;
import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.thirdparty.jcaptcha.AbstractManageableImageCaptchaService;
import cn.quantgroup.xyqb.util.IPUtil;
import cn.quantgroup.xyqb.util.IpUtil;
import com.octo.captcha.service.CaptchaServiceException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
......@@ -36,11 +37,11 @@ import java.util.UUID;
* 修改时间:15/11/17 14:49
* 修改备注:
*/
@Slf4j
@Aspect
@Component
public class CaptchaValidateAdvisor {
private static final Logger LOGGER = LoggerFactory.getLogger(CaptchaValidateAdvisor.class);
private static final String SUPER_CAPTCHA_ID = UUID.nameUUIDFromBytes("__QG_APPCLIENT_AGENT__".getBytes(Charset.forName("UTF-8"))).toString();
private static final String SUPER_CAPTCHA = "__SUPERQG__";
......@@ -79,7 +80,7 @@ public class CaptchaValidateAdvisor {
String captchaId = Optional.ofNullable(request.getParameter(Constants.QG_CAPTCHA_ID)).orElse("");
String captchaValue = request.getParameter(Constants.QG_CAPTCHA_VALUE);
if (shouldSkipCaptchaValidate(registerFrom, captchaId, captchaValue)) {
LOGGER.info("使用超级图形验证码校验, registerFrom={}, clientIp={}", registerFrom, IPUtil.getRemoteIP(request));
log.info("使用超级图形验证码校验, registerFrom={}, clientIp={}", registerFrom, IpUtil.getRemoteIP(request));
return pjp.proceed();
}
JsonResult result = JsonResult.buildSuccessResult("验证码不正确", "");
......@@ -92,7 +93,7 @@ public class CaptchaValidateAdvisor {
try {
validCaptcha = imageCaptchaService.validateResponseForID(Constants.IMAGE_CAPTCHA_KEY + captchaId, captcha);
} catch (CaptchaServiceException ex) {
LOGGER.error("验证码校验异常, {}, {}", ex.getMessage(), ex);
log.error("验证码校验异常, {}, {}", ex.getMessage(), ex);
}
if (validCaptcha) {
return pjp.proceed();
......
......@@ -5,7 +5,8 @@ import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.model.session.SessionStruct;
import cn.quantgroup.xyqb.session.XyqbSessionContextHolder;
import cn.quantgroup.xyqb.util.IPUtil;
import cn.quantgroup.xyqb.util.IpUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
......@@ -28,11 +29,11 @@ import java.util.Set;
* @version 1.0.0
* @since 2017-11-21
*/
@Slf4j
@Aspect
@Component
public class PasswordFreeAccessValidateAdvisor {
private static final Logger LOGGER = LoggerFactory.getLogger(PasswordFreeAccessValidateAdvisor.class);
private static final String USER_ID = "userId";
/**
......@@ -65,42 +66,42 @@ public class PasswordFreeAccessValidateAdvisor {
*/
private boolean tokenValid(HttpServletRequest request) {
Objects.requireNonNull(request, "无效请求");
String clientIp = IPUtil.getRemoteIP(request);
String clientIp = IpUtil.getRemoteIP(request);
Set<String> paramKeys = request.getParameterMap().keySet();
if (!paramKeys.contains(Constants.PHONE_NO) && !paramKeys.contains(USER_ID)) {
LOGGER.info("非法请求 - 缺少参数, paramKeys={}, clientIp={}", paramKeys, clientIp);
log.info("非法请求 - 缺少参数, paramKeys={}, clientIp={}", paramKeys, clientIp);
return false;
}
// 当前请求的phoneNo/userId
String phoneNo = request.getParameter(Constants.PHONE_NO);
String userId = request.getParameter(USER_ID);
if (StringUtils.isBlank(phoneNo) && StringUtils.isBlank(userId)) {
LOGGER.info("非法请求 - 缺少参数, phoneNo={}, userId={}, clientIp={}", phoneNo, userId, clientIp);
log.info("非法请求 - 缺少参数, phoneNo={}, userId={}, clientIp={}", phoneNo, userId, clientIp);
return false;
}
// 当前请求的Token
String token = request.getHeader(Constants.X_AUTH_TOKEN);
if (Objects.isNull(token) || token.length() != 36) {
LOGGER.info("非法请求 - 无效token, token={}, phoneNo={}, userId={}, clientIp={}", token, phoneNo, userId, clientIp);
if (StringUtils.length(token) != Constants.TOKEN_LENGTH) {
log.info("非法请求 - 无效token, token={}, phoneNo={}, userId={}, clientIp={}", token, phoneNo, userId, clientIp);
return false;
}
// 当前session
SessionStruct session = XyqbSessionContextHolder.getXSessionFromRedis(token);
if (Objects.isNull(session) || Objects.isNull(session.getValues()) || Objects.isNull(session.getValues().getUser())) {
LOGGER.info("非法请求 - 未登录, token={}, phoneNo={}, userId={}, clientIp={}", token, phoneNo, userId, clientIp);
log.info("非法请求 - 未登录, token={}, phoneNo={}, userId={}, clientIp={}", token, phoneNo, userId, clientIp);
return false;
}
// 当前用户
User user = session.getValues().getUser();
if (Objects.isNull(user.getId()) && StringUtils.isBlank(user.getPhoneNo())) {
LOGGER.info("非法请求 - 未登录, token={}, phoneNo={}, userId={}, clientIp={}", token, phoneNo, userId, clientIp);
log.info("非法请求 - 未登录, token={}, phoneNo={}, userId={}, clientIp={}", token, phoneNo, userId, clientIp);
return false;
}
// 校对用户信息是否匹配
boolean valid = (Objects.nonNull(user.getId()) && Objects.equals(userId, user.getId().toString()));
valid = valid || (StringUtils.isNotBlank(phoneNo) && Objects.equals(phoneNo, user.getPhoneNo()));
if (!valid) {
LOGGER.info("非法请求 - 身份不匹配, token={}, phoneNo=({},{}), userId=({},{}), clientIp={}", token, phoneNo, user.getPhoneNo(), userId, user.getId(), clientIp);
log.info("非法请求 - 身份不匹配, token={}, phoneNo=({},{}), userId=({},{}), clientIp={}", token, phoneNo, user.getPhoneNo(), userId, user.getId(), clientIp);
}
return valid;
}
......
......@@ -3,7 +3,8 @@ package cn.quantgroup.xyqb.aspect.lock;
import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.util.IPUtil;
import cn.quantgroup.xyqb.util.IpUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
......@@ -28,12 +29,11 @@ import java.util.Objects;
* @version 1.0.0
* @since 2017-11-23
*/
@Slf4j
@Aspect
@Component
public class PasswordErrorFiniteValidateAdvisor {
private static final Logger LOGGER = LoggerFactory.getLogger(PasswordErrorFiniteValidateAdvisor.class);
@Autowired
@Qualifier("stringRedisTemplate")
private RedisTemplate<String, String> redisTemplate;
......@@ -56,9 +56,9 @@ public class PasswordErrorFiniteValidateAdvisor {
private Object doFiniteValidate(ProceedingJoinPoint pjp) throws Throwable {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
// 客户端IP
String clientIp = IPUtil.getRemoteIP(request);
String clientIp = IpUtil.getRemoteIP(request);
// 白名单
if (IPUtil.whiteOf(clientIp)) {
if (IpUtil.whiteOf(clientIp)) {
return pjp.proceed();
}
// 补充白名单
......@@ -66,20 +66,20 @@ public class PasswordErrorFiniteValidateAdvisor {
return pjp.proceed();
}
// 入口服务器IP
if (StringUtils.startsWith(clientIp, "139.198.")) {
if (StringUtils.startsWith(clientIp, IpUtil.IO_IP)) {
return pjp.proceed();
}
// 黑名单
if (redisTemplate.opsForSet().isMember(Constants.IPV4_LOCK_BLACK, clientIp)) {
IPUtil.logIp(LOGGER, request);
LOGGER.info("Lock_ipv4: black ip access:{}", clientIp);
IpUtil.logIp(log, request);
log.info("Lock_ipv4: black ip access:{}", clientIp);
return JsonResult.buildErrorStateResult("登录失败", null);
}
String lockIpv4Key = getLockIpv4Key(clientIp);
String lock = redisTemplate.opsForValue().get(lockIpv4Key);
if (Objects.equals(Boolean.TRUE.toString(), lock)) {
IPUtil.logIp(LOGGER, request);
LOGGER.info("Lock_ipv4: locked ip access:{}", clientIp);
IpUtil.logIp(log, request);
log.info("Lock_ipv4: locked ip access:{}", clientIp);
return JsonResult.buildErrorStateResult("登录失败", null);
}
return pjp.proceed();
......
package cn.quantgroup.xyqb.aspect.logcaller;
import cn.quantgroup.xyqb.util.IPUtil;
import cn.quantgroup.xyqb.util.IpUtil;
import com.google.common.base.Stopwatch;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
......@@ -21,13 +22,12 @@ import java.util.concurrent.TimeUnit;
* 调用者记录
* Created by Administrator on 2017/5/15.
*/
@Slf4j
@Aspect
@Component
@Order(value = Ordered.HIGHEST_PRECEDENCE)
public class LogCallHttpAspect {
private static final Logger LOGGER = LoggerFactory.getLogger(LogCallHttpAspect.class);
@Pointcut(value = "execution(public * cn.quantgroup.xyqb.controller..*.*(..)) " +
"&& !execution(* cn.quantgroup.xyqb.controller.ExceptionHandlingController.*(..))")
private void logHttpCaller() {
......@@ -38,7 +38,7 @@ public class LogCallHttpAspect {
Stopwatch stopwatch = Stopwatch.createStarted();
ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attrs.getRequest();
String remoteIP = IPUtil.getRemoteIP(request);
String remoteIP = IpUtil.getRemoteIP(request);
Object[] args = pjp.getArgs();
boolean hasException = false;
Object result;
......@@ -50,7 +50,7 @@ public class LogCallHttpAspect {
} finally {
Stopwatch stop = stopwatch.stop();
long elapsed = stop.elapsed(TimeUnit.MILLISECONDS);
LOGGER.info("[httpRequestLog],url:[{}],remoteIP:[{}],args:[{}],duration:[{}],exception:[{}]",
log.info("[httpRequestLog],url:[{}],remoteIP:[{}],args:[{}],duration:[{}],exception:[{}]",
request.getRequestURL(), remoteIP, args, elapsed, hasException);
}
return result;
......
......@@ -25,7 +25,7 @@ public class CaptchaConfig {
@Bean
public CaptchaEngine initCaptchaEngine() {
return new CustomJCaptchaEngine();
return new CustomCaptchaEngine();
}
@Bean
......@@ -39,7 +39,7 @@ public class CaptchaConfig {
@Bean(name = "customCaptchaService")
@Autowired
public AbstractManageableImageCaptchaService initCaptchaService(CaptchaStore captchaStore, CaptchaEngine captchaEngine) {
return new CustomJCaptchaService(captchaStore, captchaEngine);
return new CustomCaptchaService(captchaStore, captchaEngine);
}
}
......@@ -23,7 +23,7 @@ import java.awt.*;
import java.awt.image.ImageFilter;
/**
* 类名称:CustomJCaptchaEngine
* 类名称:CustomCaptchaEngine
* 类描述:
*
* @author 李宁
......@@ -33,7 +33,7 @@ import java.awt.image.ImageFilter;
* 修改时间:15/11/17 12:04
* 修改备注:
*/
public class CustomJCaptchaEngine extends ListImageCaptchaEngine {
public class CustomCaptchaEngine extends ListImageCaptchaEngine {
private static final int MIN_WORD_LEN = 4;
private static final int MAX_WORD_LEN = 4;
......
......@@ -5,14 +5,13 @@ import com.octo.captcha.Captcha;
import com.octo.captcha.engine.CaptchaEngine;
import com.octo.captcha.service.CaptchaServiceException;
import com.octo.captcha.service.captchastore.CaptchaStore;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Locale;
/**
* 类名称:CustomJCaptchaService
* 类名称:CustomCaptchaService
* 类描述:自定义的验证马实现服务
*
* @author 李宁
......@@ -22,9 +21,8 @@ import java.util.Locale;
* 修改时间:15/11/17 19:41
* 修改备注:
*/
public class CustomJCaptchaService extends AbstractManageableImageCaptchaService {
private static final Logger LOGGER = LoggerFactory.getLogger(CustomJCaptchaService.class);
@Slf4j
public class CustomCaptchaService extends AbstractManageableImageCaptchaService {
/*
* 验证码管理策略:
......@@ -35,12 +33,12 @@ public class CustomJCaptchaService extends AbstractManageableImageCaptchaService
private static final Integer MAX_CAPTCHA_STORE_SIZE = 70000; // 最大容量, 默认值是10w
private static final Integer CAPTCHA_STORE_LOAD_BEFORE_GARBAGE_COLLECTION = 52500; // 配额, 超过此配额时执行一次垃圾清除, 默认值是:75000
public CustomJCaptchaService(CaptchaStore captchaStore, CaptchaEngine captchaEngine) {
public CustomCaptchaService(CaptchaStore captchaStore, CaptchaEngine captchaEngine) {
this(captchaStore, captchaEngine, MIN_GUARANTED_STORAGE_DELAY_IN_SECONDS, MAX_CAPTCHA_STORE_SIZE, CAPTCHA_STORE_LOAD_BEFORE_GARBAGE_COLLECTION);
}
protected CustomJCaptchaService(CaptchaStore captchaStore, CaptchaEngine captchaEngine, int minGuarantedStorageDelayInSeconds, int maxCaptchaStoreSize, int captchaStoreLoadBeforeGarbageCollection) {
protected CustomCaptchaService(CaptchaStore captchaStore, CaptchaEngine captchaEngine, int minGuarantedStorageDelayInSeconds, int maxCaptchaStoreSize, int captchaStoreLoadBeforeGarbageCollection) {
super(captchaStore, captchaEngine, minGuarantedStorageDelayInSeconds, maxCaptchaStoreSize, captchaStoreLoadBeforeGarbageCollection);
}
......@@ -70,7 +68,7 @@ public class CustomJCaptchaService extends AbstractManageableImageCaptchaService
}
valid = captcha.validateResponse(response);
} catch (Exception ex) {
LOGGER.warn("can not get captcha from redis");
log.warn("can not get captcha from redis");
valid = false;
}
......@@ -92,6 +90,7 @@ public class CustomJCaptchaService extends AbstractManageableImageCaptchaService
* @return
* @throws CaptchaServiceException
*/
@Override
public Object getChallengeForID(String ID, Locale locale) throws CaptchaServiceException {
Captcha captcha = this.generateAndStoreCaptcha(locale, ID);
Object challenge = this.getChallengeClone(captcha);
......
......@@ -5,6 +5,7 @@ import cn.quantgroup.xyqb.thirdparty.jcaptcha.SimpleCaptcha;
import com.octo.captcha.Captcha;
import com.octo.captcha.service.CaptchaServiceException;
import com.octo.captcha.service.captchastore.CaptchaStore;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisTemplate;
......@@ -25,9 +26,9 @@ import java.util.concurrent.TimeUnit;
* 修改时间:15/12/17 06:39
* 修改备注:
*/
@Slf4j
public class RedisCaptchaStore implements CaptchaStore {
private static final Logger LOGGER = LoggerFactory.getLogger(RedisCaptchaStore.class);
private static final long DEFAULT_EXPIRED_IN = 120L;
private static final TimeUnit DEFAULT_EXPIRED_TIMEUNIT = TimeUnit.SECONDS;
......@@ -103,7 +104,7 @@ public class RedisCaptchaStore implements CaptchaStore {
String captcharKey = buildCaptcharKey(captchaId);
Long expire = stringRedisTemplate.getExpire(captcharKey, TimeUnit.SECONDS);
Object value = stringRedisTemplate.opsForValue().get(captcharKey);
LOGGER.info("captchaId={},captchaCode={},expire={}秒", captcharKey, value, expire);
log.info("captchaId={},captchaCode={},expire={}秒", captcharKey, value, expire);
stringRedisTemplate.delete(captcharKey);
return value != null ? new SimpleCaptcha(captchaId, String.valueOf(value)) : null;
}
......
......@@ -114,7 +114,7 @@ public class RedisConfig {
template.setDefaultSerializer(jdkSerializationRedisSerializer);
template.setConnectionFactory(factory);
XyqbSessionContextHolder.redisTemplate = stringRedisTemplate(factory);
XyqbSessionContextHolder.setRedisTemplate(stringRedisTemplate(factory));
return template;
}
......
......@@ -10,13 +10,15 @@ final class IntegerToEnumConverterFactory implements ConverterFactory<String, En
IntegerToEnumConverterFactory() {
}
@Override
public <T extends Enum> Converter<String, T> getConverter(Class<T> targetType) {
Class<?> enumType = targetType;
while (enumType != null && !enumType.isEnum()) {
enumType = enumType.getSuperclass();
}
if (enumType == null) {
if (targetType == null) {
throw new IllegalArgumentException("The target type null does not refer to an enum");
}else if (enumType == null) {
throw new IllegalArgumentException("The target type " + targetType.getName() + " does not refer to an enum");
} else {
return new IntegerToEnumConverterFactory.IntegerToEnum(enumType);
......@@ -30,6 +32,7 @@ final class IntegerToEnumConverterFactory implements ConverterFactory<String, En
this.enumType = enumType;
}
@Override
public T convert(String source) {
T[] ts = enumType.getEnumConstants();
int ordinal = Integer.parseInt(source);
......
......@@ -19,7 +19,7 @@ import javax.annotation.Resource;
*/
@Primary
@Configuration
public class LoanVestMQConfig {
public class LoanVestMqConfig {
@Value("${loanvest.rabbitmq.queue}")
private String queueName;
@Value("${loanvest.rabbitmq.exchange}")
......
package cn.quantgroup.xyqb.controller;
import cn.quantgroup.xyqb.exception.PasswordErrorLimitException;
import cn.quantgroup.xyqb.exception.UserNotExistException;
import cn.quantgroup.xyqb.exception.VerificationCodeErrorException;
import cn.quantgroup.xyqb.exception.WechatRelateUserException;
import cn.quantgroup.xyqb.exception.*;
import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.util.IPUtil;
import cn.quantgroup.xyqb.util.IpUtil;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
......@@ -24,13 +22,12 @@ import java.util.Set;
* Created by Miraculous on 15/7/6.
* 出现异常,进入这个handler。
*/
@Slf4j
@ControllerAdvice
@RestController
public class ExceptionHandlingController implements IBaseController {
private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionHandlingController.class);
private static final JsonResult EXCEPTION_RESULT = new JsonResult("internal error", 500L, "");
private static final JsonResult EXCEPTION_RESULT = new JsonResult("internal error", (long)HttpStatus.INTERNAL_SERVER_ERROR.value(), "");
/**
* 密码错误次数达到上限异常
......@@ -40,7 +37,7 @@ public class ExceptionHandlingController implements IBaseController {
*/
@ExceptionHandler(PasswordErrorLimitException.class)
public JsonResult passwordErrorLimitException(PasswordErrorLimitException vce) {
LOGGER.info("throw PasswordErrorLimitException,msg={},businessCode={}, clientIp={}", vce.getMessage(), 2L, IPUtil.getRemoteIP(getRequest()));
log.info("throw PasswordErrorLimitException,msg={},businessCode={}, clientIp={}", vce.getMessage(), 2L, IpUtil.getRemoteIP(getRequest()));
return JsonResult.buildErrorStateResult(vce.getMessage(), null, 2L);
}
......@@ -52,7 +49,7 @@ public class ExceptionHandlingController implements IBaseController {
*/
@ExceptionHandler(VerificationCodeErrorException.class)
public JsonResult verificationCodeErrorException(VerificationCodeErrorException vce) {
LOGGER.info("throw VerificationCodeErrorException,msg={},businessCode={}, clientIp={}", vce.getMessage(), 1L, IPUtil.getRemoteIP(getRequest()));
log.info("throw VerificationCodeErrorException,msg={},businessCode={}, clientIp={}", vce.getMessage(), 1L, IpUtil.getRemoteIP(getRequest()));
return JsonResult.buildErrorStateResult(vce.getMessage(), null, 1L);
}
......@@ -65,8 +62,20 @@ public class ExceptionHandlingController implements IBaseController {
@ExceptionHandler(UserNotExistException.class)
@ResponseStatus(HttpStatus.UNAUTHORIZED)
public JsonResult userNotExistException(UserNotExistException unee) {
LOGGER.info("throw UserNotExistException,msg={},businessCode={},code={}", unee.getMessage(), 1L, 401L);
return new JsonResult(unee.getMessage(), 401L, null);
log.info("throw UserNotExistException,msg={},businessCode={},code={}", unee.getMessage(), 1L, (long)HttpStatus.UNAUTHORIZED.value());
return new JsonResult(unee.getMessage(), (long)HttpStatus.UNAUTHORIZED.value(), null);
}
/**
* 用户查询或导出异常
*
* @param uqle
* @return
*/
@ExceptionHandler(UserQueryLogException.class)
public JsonResult userQueryLogException(UserQueryLogException uqle) {
log.info("throw UserQueryLogException,msg={},businessCode={},code={}", uqle.getMessage(), 1L, 0L);
return JsonResult.buildErrorStateResult(uqle.getMessage(), null);
}
/**
......@@ -78,8 +87,8 @@ public class ExceptionHandlingController implements IBaseController {
@ExceptionHandler(WechatRelateUserException.class)
@ResponseStatus(HttpStatus.UNAUTHORIZED)
public JsonResult wechatRelateUserException(WechatRelateUserException wrue) {
LOGGER.info("throw WechatRelateUserException,msg={},businessCode={},code={}", wrue.getMessage(), 1L, 401L);
return new JsonResult(wrue.getMessage(), 401L, null);
log.info("throw WechatRelateUserException,msg={},businessCode={},code={}", wrue.getMessage(), 1L, (long)HttpStatus.UNAUTHORIZED.value());
return new JsonResult(wrue.getMessage(), (long)HttpStatus.UNAUTHORIZED.value(), null);
}
/**
......@@ -93,7 +102,7 @@ public class ExceptionHandlingController implements IBaseController {
HttpServletRequest request = getRequest();
String uri = request.getRequestURI();
String registerFrom = request.getParameter("registerFrom");
LOGGER.error("[exception][global_exception]接口异常 URI:{}, registerFrom:{},error={}", uri, registerFrom, e);
log.error("[exception][global_exception]接口异常 URI:{}, registerFrom:{},error={}", uri, registerFrom, e);
return EXCEPTION_RESULT;
}
......@@ -102,7 +111,7 @@ public class ExceptionHandlingController implements IBaseController {
ConstraintViolationException exs = (ConstraintViolationException) exception;
Set<ConstraintViolation<?>> constraintViolations = exs.getConstraintViolations();
if (constraintViolations.isEmpty()) {
LOGGER.error("这里出了个错....", exception.getMessage());
log.error("这里出了个错....", exception.getMessage());
return null;
}
String message = constraintViolations.iterator().next().getMessage();
......
......@@ -2,7 +2,7 @@ package cn.quantgroup.xyqb.controller;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.model.session.SessionStruct;
import cn.quantgroup.xyqb.util.IPUtil;
import cn.quantgroup.xyqb.util.IpUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
......@@ -56,7 +56,7 @@ public interface IBaseController {
default String getIp() {
HttpServletRequest request = getRequest();
return IPUtil.getRemoteIP(request);
return IpUtil.getRemoteIP(request);
}
default String getProtocol() {
......
......@@ -4,6 +4,7 @@ import cn.quantgroup.xyqb.entity.UserAuthorized;
import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.model.UserAuthorizedParam;
import cn.quantgroup.xyqb.service.auth.IUserAuthorizedService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
......@@ -14,19 +15,18 @@ import javax.annotation.Resource;
/**
* @author xufei on 2018/1/5.
*/
@Slf4j
@RestController
@RequestMapping("/user/auth")
public class UserAuthorizedController {
private static final Logger LOGGER = LoggerFactory.getLogger(UserAuthorizedController.class);
@Resource
private IUserAuthorizedService userAuthorizedService;
@RequestMapping(value = "/hasUserAuthorized")
public JsonResult hasUserAuthorized(String idNo) {
LOGGER.info("[hasUserAuthorized]需要校验的用户的身份证号为idNo:{}", idNo);
log.info("[hasUserAuthorized]需要校验的用户的身份证号为idNo:{}", idNo);
if (userAuthorizedService.hasUserAuthorized(idNo)) {
return JsonResult.buildSuccessResult(null, true);
} else {
......@@ -37,13 +37,13 @@ public class UserAuthorizedController {
@RequestMapping(value = "/createUserAuthorized")
public JsonResult createUserAuthorized(UserAuthorizedParam userAuthorizedParam) {
LOGGER.info("[createUserAuthorized]创建实名账户,userAuthorizedParam:{},", userAuthorizedParam);
log.info("[createUserAuthorized]创建实名账户,userAuthorizedParam:{},", userAuthorizedParam);
try {
if (userAuthorizedService.checkUserAuthorizedParam(userAuthorizedParam)) {
return JsonResult.buildErrorStateResult("参数异常", null);
}
} catch (Exception e) {
LOGGER.info("[createUserAuthorized]创建实名账户失败e:{}", e);
log.info("[createUserAuthorized]创建实名账户失败e:{}", e);
return JsonResult.buildErrorStateResult("参数异常", null);
}
UserAuthorized userAuthorized = userAuthorizedService.createUserAuthorized(userAuthorizedParam);
......@@ -57,7 +57,7 @@ public class UserAuthorizedController {
@RequestMapping(value = "/getUserAuthorizedId")
public JsonResult getUserAuthorizedId(String userUuid) {
LOGGER.info("[getUserAuthorizedId]获取实名账户的id,userUuid:{}", userUuid);
log.info("[getUserAuthorizedId]获取实名账户的id,userUuid:{}", userUuid);
return JsonResult.buildSuccessResult(null, userAuthorizedService.getUserAuthorizedId(userUuid));
}
}
......@@ -24,7 +24,7 @@ import cn.quantgroup.xyqb.service.user.IUserDetailService;
import cn.quantgroup.xyqb.service.user.IUserService;
import cn.quantgroup.xyqb.service.user.UserCenterService;
import cn.quantgroup.xyqb.service.wechat.IWechatService;
import cn.quantgroup.xyqb.util.IPUtil;
import cn.quantgroup.xyqb.util.IpUtil;
import cn.quantgroup.xyqb.util.MqUtils;
import cn.quantgroup.xyqb.util.PasswordUtil;
import cn.quantgroup.xyqb.util.ValidationUtil;
......@@ -121,7 +121,7 @@ public class UserController implements IBaseController {
if (merchant == null) {
return JsonResult.buildErrorStateResult("未知的连接", null);
}
if (!StringUtils.isEmpty(userId) && userId.length() > 10) {
if (StringUtils.length(userId) > Constants.UUID_MIN_LENGTH) {
return loginWithUserId(channelId, appChannel, createdFrom, userId, merchant, dimension, request);
} else {
return loginWithHttpBasic(channelId, appChannel, createdFrom, merchant, dimension, request);
......@@ -166,8 +166,9 @@ public class UserController implements IBaseController {
HttpServletRequest request) {
Map<String, JsonResult> validMap = getHeaderParam(request);
log.info("login/fast -> channelId:{},appChannel:{},createdFrom:{},btRegisterChannelId:{},key:{},dimension:{},clickId:{}", channelId, appChannel, createdFrom, btRegisterChannelId, key, dimension, clickId);
if (null != validMap.get("fail")) {
return validMap.get("fail");
JsonResult failResult = validMap.get(Constants.CHECK_FAIL);
if (null != failResult) {
return failResult;
}
Merchant merchant = merchantService.findMerchantByName(key);
if (merchant == null) {
......@@ -214,26 +215,26 @@ public class UserController implements IBaseController {
String verificationHeader = "Verification ";
String credential = request.getHeader("authorization");
if (StringUtils.isBlank(credential)) {
result.put("fail", JsonResult.buildErrorStateResult("登录失败", null));
result.put(Constants.CHECK_FAIL, JsonResult.buildErrorStateResult("登录失败", null));
return result;
}
if (!credential.startsWith(verificationHeader)) {
result.put("fail", JsonResult.buildErrorStateResult("登录失败", null));
result.put(Constants.CHECK_FAIL, JsonResult.buildErrorStateResult("登录失败", null));
return result;
}
credential = credential.substring(verificationHeader.length(), credential.length());
byte[] buf = Base64.decodeBase64(credential);
credential = new String(buf, Charset.forName("UTF-8"));
String[] credentialArr = credential.split(":");
if (credentialArr.length != 2) {
result.put("fail", JsonResult.buildErrorStateResult("登录失败", null));
String[] credentialArr = credential.split(Constants.SPLIT_CHAR);
if (credentialArr.length != Constants.VERIFICATION_LEN) {
result.put(Constants.CHECK_FAIL, JsonResult.buildErrorStateResult("登录失败", null));
return result;
}
String phoneNo = credentialArr[0];
String verificationCode = credentialArr[1];
log.info("用户快速登录,phoneNo:{} , verificationCode:{}", phoneNo, verificationCode);
if (!ValidationUtil.validatePhoneNo(phoneNo) || StringUtils.isBlank(verificationCode)) {
result.put("fail", JsonResult.buildErrorStateResult("登录失败", null));
result.put(Constants.CHECK_FAIL, JsonResult.buildErrorStateResult("登录失败", null));
return result;
}
result.put("success", JsonResult.buildSuccessResult(verificationCode, phoneNo));
......@@ -403,7 +404,7 @@ public class UserController implements IBaseController {
if (StringUtils.isEmpty(token)) {
return JsonResult.buildSuccessResult(null, false);
}
if (token.contains("*")) {
if (token.contains(Constants.TOKEN_MASTER)) {
return JsonResult.buildSuccessResult(null, false);
}
String tokenKey = Constants.SESSION_PREFIX + token;
......@@ -463,10 +464,10 @@ public class UserController implements IBaseController {
private User verificateUserNameAndPassword(HttpServletRequest request) {
String credential = request.getHeader("authorization");
if (StringUtils.isBlank(credential) || !credential.startsWith("Basic ")) {
if (StringUtils.isBlank(credential) || !credential.startsWith(Constants.PASSWORD_HEADER)) {
return null;
}
credential = credential.substring("Basic ".length(), credential.length());
credential = credential.substring(Constants.PASSWORD_HEADER.length());
byte[] buf = Base64.decodeBase64(credential);
String bufStr = "";
try {
......@@ -476,7 +477,7 @@ public class UserController implements IBaseController {
}
String clientIp = getIp();
String[] credentialArr = bufStr.split(":");
if (credentialArr.length != 2) {
if (credentialArr.length != Constants.AUTHORIZE_HEADER_SIZE) {
log.info("用户登录失败:{}", bufStr);
// 向该ipv4添加错误计数器
lockIpv4Service.countErrorByIpv4(clientIp);
......@@ -528,7 +529,7 @@ public class UserController implements IBaseController {
*/
private boolean wechatRelateUserIfNecessary(User user, HttpServletRequest request) {
Objects.requireNonNull(request, "无效请求");
String clientIp = IPUtil.getRemoteIP(request);
String clientIp = IpUtil.getRemoteIP(request);
Set<String> paramKeys = request.getParameterMap().keySet();
boolean ready = paramKeys.contains(Constants.WECHAT_OPEN_ID);
if (!ready) {
......
......@@ -20,8 +20,7 @@ import com.google.common.collect.ImmutableList;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.http.HttpStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PathVariable;
......@@ -48,10 +47,8 @@ import java.util.*;
@RequestMapping("/wechat")
public class WeChatController implements IBaseController {
private static final Logger LOGGER = LoggerFactory.getLogger(WeChatController.class);
// todo: 配置文件
private static final String TOKEN = "5YihkluEo5QuWAWpFwzvA";
private static final String WECHAT_DEVELOPOR_TOKEN = "5YihkluEo5QuWAWpFwzvA";
@Autowired
private IWechatService wechatService;
......@@ -111,7 +108,7 @@ public class WeChatController implements IBaseController {
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String[] arrs = new String[]{TOKEN, timestamp, nonce};
String[] arrs = new String[]{WECHAT_DEVELOPOR_TOKEN, timestamp, nonce};
Arrays.sort(arrs);
String joinStr = joinArray(arrs);
joinStr = sha1(joinStr);
......@@ -182,21 +179,21 @@ public class WeChatController implements IBaseController {
receiveCodeWithDefault(code, systemKey, schema, registerFrom, redirect, response);
return;
}
LOGGER.info("从微信extdata版本接口进入:{}, extData:{}", schema, extData);
log.info("从微信extdata版本接口进入:{}, extData:{}", schema, extData);
HashMap<String, Object> extDataObj;
try {
extDataObj = JSON.parseObject(extData, new TypeReference<HashMap<String, Object>>() {
});
} catch (Exception ex) {
LOGGER.error("解析extData发生错误", ex);
log.error("解析extData发生错误", ex);
receiveCodeWithDefault(code, systemKey, schema, registerFrom, redirect, response);
return;
}
schema = extDataObj.getOrDefault("protocol", "http:").toString();
LOGGER.info("从微信登录extData中获得协议信息,protocol:{}", schema);
schema = extDataObj.getOrDefault("protocol", Constants.PROTOCOL_HEAD_HTTP).toString();
log.info("从微信登录extData中获得协议信息,protocol:{}", schema);
registerFrom = Long.valueOf(extDataObj.getOrDefault("registerFrom", "1").toString());
redirect = (String) extDataObj.getOrDefault("redirect", "redirect");
LOGGER.info("从微信登录,registerFrom:{}, redirect:{}", registerFrom, redirect);
redirect = (String) extDataObj.getOrDefault(Constants.REDIRECT, Constants.REDIRECT);
log.info("从微信登录,registerFrom:{}, redirect:{}", registerFrom, redirect);
receiveCodeWithDefault(code, systemKey, schema, registerFrom, redirect, response);
}
......@@ -213,7 +210,7 @@ public class WeChatController implements IBaseController {
private void receiveCodeWithDefault(String code, String systemKey, String schema, Long registerFrom, String redirect, HttpServletResponse response) {
// 微信跳转请求入参监控
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
LOGGER.info("[WeChatController][receiveCodeWithDefault]微信授权及跳转:code:{},systemKey:{},schema:{},registerFrom:{},redirect:{},request:{}", code, systemKey, schema, registerFrom, redirect, JSON.toJSONString(getRequestHeaderMap(request)));
log.info("[WeChatController][receiveCodeWithDefault]微信授权及跳转:code:{},systemKey:{},schema:{},registerFrom:{},redirect:{},request:{}", code, systemKey, schema, registerFrom, redirect, JSON.toJSONString(getRequestHeaderMap(request)));
/*
* 预处理(容错)
*/
......@@ -221,13 +218,13 @@ public class WeChatController implements IBaseController {
redirect = Optional.ofNullable(redirect).orElse("");
schema = StringUtils.isBlank(schema) ? getProtocol() : schema;
String domain = userUiDomain;
if (Objects.equals(schema, "https:")) {
if (Objects.equals(schema, Constants.PROTOCOL_HEAD_HTTPS)) {
domain = userUiDomainS;
}
// 从code获取token
Merchant merchant = merchantService.findMerchantByName(systemKey);
AccessTokenResponse token = wechatService.getToken(code);
LOGGER.info("[WeChatController][receiveCodeWithDefault]微信授权及跳转:merchant:{},token:{}", merchant, token);
log.info("[WeChatController][receiveCodeWithDefault]微信授权及跳转:merchant:{},token:{}", merchant, token);
if (Objects.isNull(token) || StringUtils.isBlank(token.getOpenId())) {
// 让用户登录,不关联微信, 构造不关联微信的url
redirectNormalUrl(response, merchant, registerFrom, domain);
......@@ -235,11 +232,11 @@ public class WeChatController implements IBaseController {
}
// 获取已授权信息 - db
WechatUserInfo userInfoInDb = wechatService.findWechatUserInfoFromDb(token.getOpenId());
LOGGER.info("[WeChatController][receiveCodeWithDefault]微信授权及跳转:WechatUserInfo - from DB:{}", userInfoInDb);
log.info("[WeChatController][receiveCodeWithDefault]微信授权及跳转:WechatUserInfo - from DB:{}", userInfoInDb);
// welcome 首次登录
if (Objects.isNull(userInfoInDb)) {
WechatUserInfo userInfo = wechatService.getWechatUserInfoFromWechatServer(token.getAccessToken(), token.getOpenId());
LOGGER.info("[WeChatController][receiveCodeWithDefault]微信授权及跳转:WechatUserInfo - from wechat api:{}", userInfo);
log.info("[WeChatController][receiveCodeWithDefault]微信授权及跳转:WechatUserInfo - from wechat api:{}", userInfo);
if (Objects.isNull(userInfo) || StringUtils.isBlank(userInfo.getOpenId())) {
// 让用户登录,不关联微信, 构造不关联微信的url
redirectNormalUrl(response, merchant, registerFrom, domain);
......@@ -248,7 +245,7 @@ public class WeChatController implements IBaseController {
try {
userInfo = wechatService.saveWechatUserInfo(userInfo);
} catch (Exception e) {
LOGGER.warn("微信用户首次登陆,保存userInfo异常,执行操作:Nick置为*并重新保存.", e);
log.warn("微信用户首次登陆,保存userInfo异常,执行操作:Nick置为*并重新保存.", e);
userInfo.setNickName(EmojiUtil.BYTE_4_REPLACE_TEMPLATE);
userInfo = wechatService.saveWechatUserInfo(userInfo);
}
......@@ -271,14 +268,14 @@ public class WeChatController implements IBaseController {
// create session, 登进去,该怎么玩怎么玩。
String redirectUrl = createUserSession(user, merchant, redirect, domain, registerFrom);
response.setHeader("Location", redirectUrl);
response.setStatus(301);
response.setStatus(HttpStatus.SC_MOVED_PERMANENTLY);
}
@RequestMapping("/redirectForTest")
public void redirectForTest(String redirect, HttpServletRequest request, HttpServletResponse response) throws MalformedURLException {
URL url = new URL(redirect);
String host = url.getHost();
if (!host.endsWith("liangkebang.com") && !host.endsWith("liangkebang.net")) {
if (!host.contains(Constants.DOCKER_DOMAIN)) {
log.error("redirect 非法请求, host:{}", host);
return;
}
......@@ -300,7 +297,7 @@ public class WeChatController implements IBaseController {
out.write(html.toString());
out.close();
} catch (IOException e) {
e.printStackTrace();
log.error("测试:重定向失败", e);
}
}
......@@ -314,32 +311,32 @@ public class WeChatController implements IBaseController {
public void receiveCodeNoRedirect(String code, @PathVariable(value = "key") String systemKey, HttpServletRequest request, HttpServletResponse response) {
Long registerFrom = null;
String redirect = null;
String schema = "http:";
if (Objects.equals("https:", request.getScheme())) {
schema = "https:";
String schema = Constants.PROTOCOL_HEAD_HTTP;
if (Objects.equals(Constants.PROTOCOL_HEAD_HTTPS, request.getScheme())) {
schema = Constants.PROTOCOL_HEAD_HTTPS;
}
receiveCodeWithDefault(code, systemKey, schema, registerFrom, redirect, response);
}
private String createUserSession(User user, Merchant merchant, String redirect, String domain, Long registerFrom) {
LOGGER.info("[WeChatController][createUserSession]微信授权及跳转:user:{},merchant:{},redirect:{},domain:{},registerFrom:{}", user, merchant, redirect, domain, registerFrom);
log.info("[WeChatController][createUserSession]微信授权及跳转:user:{},merchant:{},redirect:{},domain:{},registerFrom:{}", user, merchant, redirect, domain, registerFrom);
LoginProperties loginProperties = new LoginProperties("", 4, Constants.Channel.WECHAT, registerFrom, String.valueOf(Constants.Channel.WECHAT), merchant.getId(), merchant.getName());
if (StringUtils.isEmpty(redirect) || "redirect".equals(redirect)) {
LOGGER.info("微信登录:redirect为null,走正常流程.");
if ("baitiao".equals(merchant.getName())) {
if (StringUtils.isEmpty(redirect) || Constants.REDIRECT.equals(redirect)) {
log.info("微信登录:redirect为null,走正常流程.");
if (Constants.MERCHANT_BAITIAO.equals(merchant.getName())) {
return loginInWechatWithSessionCreated(user, merchant, "cashTarget5", Constants.Channel.BAITIAO, domain, Constants.Channel.WECHAT);
} else if ("wechat-pay".equals(merchant.getName())) {
} else if (Constants.MERCHANT_WECHAT_PAY.equals(merchant.getName())) {
AuthBean authBean = sessionService.createSession(user, loginProperties);
return domain + "/landing?token=" + authBean.getToken() + "&registerFrom=" + registerFrom + "&channelId=" + Constants.Channel.WECHAT + "&key=" + merchant.getName() + "&target=cashTarget5";
} else {
return loginInWechatWithSessionCreated(user, merchant, "cashTarget4", 1L, domain, registerFrom);
}
} else if ("local".equals(redirect)) {
LOGGER.info("微信登录:redirect不为null,创建session跳到指定前端页面.");
} else if (Constants.LOCAL.equals(redirect)) {
log.info("微信登录:redirect不为null,创建session跳到指定前端页面.");
AuthBean authBean = sessionService.createSession(user, loginProperties);
LOGGER.info("微信登录:跳转地址{}", domain + "/weixin/callback?phoneNo=" + user.getPhoneNo() + "&token=" + authBean.getToken());
Long channelId = "baitiao".equals(merchant.getName()) ? 222L : 1L;
String target = "baitiao".equals(merchant.getName()) ? "cashTarget5" : "cashTarget4";
log.info("微信登录:跳转地址{}", domain + "/weixin/callback?phoneNo=" + user.getPhoneNo() + "&token=" + authBean.getToken());
Long channelId = Constants.MERCHANT_BAITIAO.equals(merchant.getName()) ? Constants.Channel.BAITIAO : 1L;
String target = Constants.MERCHANT_BAITIAO.equals(merchant.getName()) ? "cashTarget5" : "cashTarget4";
return domain + "/landing?token=" + authBean.getToken() + "&registerFrom=" + registerFrom +
"&channelId=" + channelId + "&key=" + merchant.getName() + "&target=" + target + "&isWechat=true";
}
......@@ -349,32 +346,32 @@ public class WeChatController implements IBaseController {
private String loginInWechatWithSessionCreated(User user, Merchant merchant, String target, Long channelId, String domain, Long registerFrom) {
LoginProperties loginProperties = new LoginProperties("", 4, channelId, registerFrom, String.valueOf(Constants.Channel.WECHAT), merchant.getId(), merchant.getName());
AuthBean authBean = sessionService.createSession(user, loginProperties);
LOGGER.info("[WeChatController][loginInWechatWithSessionCreated]微信授权及跳转:user:{},merchant:{},target:{},channelId:{},domain:{},registerFrom:{}", user, merchant, target, channelId, domain, registerFrom);
log.info("[WeChatController][loginInWechatWithSessionCreated]微信授权及跳转:user:{},merchant:{},target:{},channelId:{},domain:{},registerFrom:{}", user, merchant, target, channelId, domain, registerFrom);
return domain + "/landing?token=" + authBean.getToken() + "&registerFrom=" + registerFrom + "&channelId=" + channelId + "&key=" + merchant.getName() + "&target=" + target;
}
private void redirectWechatLoginUrlWithoutLogin(HttpServletResponse response, Merchant merchant, WechatUserInfo userInfo, Long registerFrom, String domain) {
String redirectUrl = assembleWechatRedirectUrl(merchant, userInfo, registerFrom, domain);
LOGGER.info("[WeChatController][redirectWechatLoginUrlWithoutLogin]微信授权及跳转:redirectUrl:[{}]", redirectUrl);
log.info("[WeChatController][redirectWechatLoginUrlWithoutLogin]微信授权及跳转:redirectUrl:[{}]", redirectUrl);
response.setHeader("Location", redirectUrl);
response.setStatus(301);
response.setStatus(HttpStatus.SC_MOVED_PERMANENTLY);
}
private void redirectNormalUrl(HttpServletResponse response, Merchant merchant, Long registerFrom, String domain) {
String redirectUrl = assembleNormalRedirectUrl(merchant, registerFrom, domain);
LOGGER.info("[WeChatController][redirectNormalUrl]微信授权及跳转: redirectUrl:[{}]", redirectUrl);
log.info("[WeChatController][redirectNormalUrl]微信授权及跳转: redirectUrl:[{}]", redirectUrl);
response.setHeader("Location", redirectUrl);
response.setStatus(301);
response.setStatus(HttpStatus.SC_MOVED_PERMANENTLY);
}
private String assembleNormalRedirectUrl(Merchant merchant, Long registerFrom, String domain) {
if ("baitiao".equals(merchant.getName())) {
if (registerFrom == 58L || registerFrom == 198L) {
if (Constants.MERCHANT_BAITIAO.equals(merchant.getName())) {
if (registerFrom == Constants.Channel.HENGCHANG || registerFrom == Constants.Channel.WECHAT) {
return domain + "/landing?key=baitiao&target=cashTarget5&channelId=222&registerFrom=" + registerFrom;
} else {
return domain + "/landing?key=baitiao&target=cashTarget5&channelId=222&registerFrom=198";
}
} else if ("wechat-pay".equals(merchant.getName())) {
} else if (Constants.MERCHANT_WECHAT_PAY.equals(merchant.getName())) {
return domain + "/landing?key=wechat-pay&target=cashTarget5&channelId=1&page=landing/4&registerFrom=" + registerFrom;
} else {
return domain + "/landing?key=xyqb&target=cashTarget4&channelId=1&registerFrom=" + registerFrom;
......@@ -382,13 +379,13 @@ public class WeChatController implements IBaseController {
}
private String assembleWechatRedirectUrl(Merchant merchant, WechatUserInfo userInfo, Long registerFrom, String domain) {
if ("baitiao".equals(merchant.getName())) {
if (registerFrom == 58L || registerFrom == 198L) {
if (Constants.MERCHANT_BAITIAO.equals(merchant.getName())) {
if (registerFrom == Constants.Channel.HENGCHANG || registerFrom == Constants.Channel.WECHAT) {
return domain + "/landing?key=baitiao&target=cashTarget5&registerFrom=" + registerFrom + "&channelId=222&isWechat=true&openId=" + userInfo.getOpenId();
} else {
return domain + "/landing?key=baitiao&target=cashTarget5&registerFrom=198&channelId=222&isWechat=true&openId=" + userInfo.getOpenId();
}
} else if ("wechat-pay".equals(merchant.getName())) {
} else if (Constants.MERCHANT_WECHAT_PAY.equals(merchant.getName())) {
return domain + "/landing?key=wechat-pay&target=cashTarget5&page=landing/4&registerFrom= " + registerFrom + "&channelId=1&isWechat=true&openId=" + userInfo.getOpenId();
} else {
return domain + "/landing?key=xyqb&target=cashTarget4&registerFrom= " + registerFrom + "&channelId=1&isWechat=true&openId=" + userInfo.getOpenId();
......@@ -406,6 +403,6 @@ public class WeChatController implements IBaseController {
}
redirectUrl = redirectUrl.concat(Joiner.on("&").join(builder.build()));
response.setHeader("Location", redirectUrl);
response.setStatus(301);
response.setStatus(HttpStatus.SC_MOVED_PERMANENTLY);
}
}
......@@ -6,6 +6,7 @@ import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.thirdparty.jcaptcha.AbstractManageableImageCaptchaService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
......@@ -28,9 +29,10 @@ import java.util.UUID;
* @author 李宁
* @version 1.0.0 创建时间:15/11/17 11:49 修改人: 修改时间:15/11/17 11:49 修改备注:
*/
@Api(value = "/api", description = "叫Api, 实际上是图形验证码. 你说神奇不神奇...")
@Slf4j
@RestController
@RequestMapping("/api")
@Api(value = "/api", description = "叫Api, 实际上是图形验证码. 你说神奇不神奇...")
public class ImageCaptchaController {
private static final String IMAGE_FORMAT_PNG = "png";
......@@ -51,14 +53,12 @@ public class ImageCaptchaController {
BufferedImage challenge = imageCaptchaService.getImageChallengeForID(Constants.IMAGE_CAPTCHA_KEY + imageId, request.getLocale());
ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
try {
boolean write = ImageIO.write(challenge, IMAGE_FORMAT_PNG, jpegOutputStream);
ImageIO.write(challenge, IMAGE_FORMAT_PNG, jpegOutputStream);
} catch (IOException e) {
e.printStackTrace();
return JsonResult.buildErrorStateResult("", "fail");
log.error("图形验证码图片流返回失败", e);
return JsonResult.buildErrorStateResult("", Constants.CHECK_FAIL);
}
String imageBase64 = Base64.encodeBase64String(jpegOutputStream.toByteArray());
Map<String, String> data = new HashMap<>();
data.put("imageId", imageId);
data.put("image", String.format(IMG_BASE64_PATTREN, imageBase64));
......
......@@ -5,7 +5,7 @@ import cn.quantgroup.xyqb.model.ClientType;
import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.service.captcha.IGeetestCaptchaService;
import cn.quantgroup.xyqb.service.captcha.IQuantgroupCaptchaService;
import cn.quantgroup.xyqb.util.IPUtil;
import cn.quantgroup.xyqb.util.IpUtil;
import cn.quantgroup.xyqb.util.PasswordUtil;
import cn.quantgroup.xyqb.util.ValidationUtil;
import io.swagger.annotations.ApiOperation;
......@@ -41,7 +41,7 @@ public class NewCaptchaController {
@RequestMapping(value = "/captcha/new")
@ApiOperation(value = "获取新图形验证码", notes = "获取新图形验证码", httpMethod = "POST")
public JsonResult getCaptcha(String phoneNo, String clientType, HttpServletRequest request) {
String remoteIp = IPUtil.getRemoteIP(request);
String remoteIp = IpUtil.getRemoteIP(request);
log.info("获取验证码, phoneNo:{}, clientType:{}, ip:{}, verifyType-qg:{}", phoneNo, clientType, remoteIp, geetestClose);
if (StringUtils.isNotBlank(phoneNo) && !ValidationUtil.validatePhoneNo(phoneNo)) {
return JsonResult.buildErrorStateResult("手机号格式错误", null);
......
......@@ -5,6 +5,7 @@ import cn.quantgroup.xyqb.controller.IBaseController;
import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.util.ValidationUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -26,10 +27,10 @@ import java.util.concurrent.TimeUnit;
* @version 1.0.0
* @since 2017-11-25
*/
@Slf4j
@RestController
@RequestMapping("/lock")
public class LockIpv4Controller implements IBaseController {
private static final Logger LOGGER = LoggerFactory.getLogger(LockIpv4Controller.class);
private static final String WORD = "Are you a robot monkey?(^_^)";
@Autowired
@Qualifier("stringRedisTemplate")
......@@ -74,7 +75,7 @@ public class LockIpv4Controller implements IBaseController {
@RequestParam(required = false) String act,
HttpServletRequest request) {
if (!ValidationUtil.validateIpv4(ip) || StringUtils.isBlank(act) || StringUtils.isBlank(key)) {
LOGGER.info("Lock_ipv4: fail to clear_or_lock ip:{}", ip);
log.info("Lock_ipv4: fail to clear_or_lock ip:{}", ip);
return JsonResult.buildErrorStateResult(WORD, null);
}
if (Objects.equals(Boolean.TRUE.toString(), act) || Objects.equals(Boolean.FALSE.toString(), act)) {
......@@ -86,7 +87,7 @@ public class LockIpv4Controller implements IBaseController {
return JsonResult.buildSuccessResult("Success", null);
}
}
LOGGER.info("Lock_ipv4: fail to clear_or_lock ip:{}", ip);
log.info("Lock_ipv4: fail to clear_or_lock ip:{}", ip);
return JsonResult.buildErrorStateResult(WORD, null);
}
......@@ -113,10 +114,10 @@ public class LockIpv4Controller implements IBaseController {
minutes = Integer.valueOf(redisMinutes);
}
redisTemplate.opsForValue().set(lockIpv4Key, Boolean.TRUE.toString(), minutes, TimeUnit.MINUTES);
LOGGER.info("Lock_ipv4: locked ip Success. ip:{}, error overstep {} times in {} minutes, do lock {} minutes", ip, counts, Constants.IPV4_FAILED_COUNT_MINUTES, minutes);
log.info("Lock_ipv4: locked ip Success. ip:{}, error overstep {} times in {} minutes, do lock {} minutes", ip, counts, Constants.IPV4_FAILED_COUNT_MINUTES, minutes);
} else {
redisTemplate.delete(lockIpv4Key);
LOGGER.info("Lock_ipv4: unlocked ip Success. ip:{}", ip);
log.info("Lock_ipv4: unlocked ip Success. ip:{}", ip);
}
}
......@@ -137,7 +138,7 @@ public class LockIpv4Controller implements IBaseController {
@RequestParam(required = false) String type,
HttpServletRequest request) {
if (!ValidationUtil.validateIpv4(ip) || StringUtils.isBlank(key) || StringUtils.isBlank(act) || StringUtils.isBlank(type)) {
LOGGER.info("Lock_ipv4: fail to config hit list for ip:{}", ip);
log.info("Lock_ipv4: fail to config hit list for ip:{}", ip);
return JsonResult.buildErrorStateResult(WORD, null);
}
boolean actOk = Objects.equals(Boolean.TRUE.toString(), act) || Objects.equals(Boolean.FALSE.toString(), act);
......@@ -150,7 +151,7 @@ public class LockIpv4Controller implements IBaseController {
configHitList(ip, operate, lock);
return JsonResult.buildSuccessResult("Success", null);
}
LOGGER.info("Lock_ipv4: fail to config hit list for ip:{}", ip);
log.info("Lock_ipv4: fail to config hit list for ip:{}", ip);
return JsonResult.buildErrorStateResult(WORD, null);
}
......@@ -168,21 +169,21 @@ public class LockIpv4Controller implements IBaseController {
if (operate) {
if (lock) {
redisTemplate.opsForSet().add(Constants.IPV4_LOCK_BLACK, ip);
LOGGER.info("Lock_ipv4: add black-list item Success, ip:{}", ip);
log.info("Lock_ipv4: add black-list item Success, ip:{}", ip);
} else {
redisTemplate.opsForSet().add(Constants.IPV4_LOCK_WHITE, ip);
LOGGER.info("Lock_ipv4: add white-list item Success, ip:{}", ip);
log.info("Lock_ipv4: add white-list item Success, ip:{}", ip);
}
} else {
if (lock) {
redisTemplate.opsForSet().remove(Constants.IPV4_LOCK_BLACK, ip);
LOGGER.info("Lock_ipv4: remove black-list item Success, ip:{}", ip);
log.info("Lock_ipv4: remove black-list item Success, ip:{}", ip);
} else {
redisTemplate.opsForSet().remove(Constants.IPV4_LOCK_WHITE, ip);
LOGGER.info("Lock_ipv4: remove white-list item Success, ip:{}", ip);
log.info("Lock_ipv4: remove white-list item Success, ip:{}", ip);
}
}
LOGGER.info("Lock_ipv4: white-list:{},black-list:{}", JSONObject.toJSON(redisTemplate.opsForSet().members(Constants.IPV4_LOCK_WHITE)), JSONObject.toJSON(redisTemplate.opsForSet().members(Constants.IPV4_LOCK_BLACK)));
log.info("Lock_ipv4: white-list:{},black-list:{}", JSONObject.toJSON(redisTemplate.opsForSet().members(Constants.IPV4_LOCK_WHITE)), JSONObject.toJSON(redisTemplate.opsForSet().members(Constants.IPV4_LOCK_BLACK)));
}
/**
......@@ -202,7 +203,7 @@ public class LockIpv4Controller implements IBaseController {
@RequestParam(required = false) String minutes,
HttpServletRequest request) {
if (StringUtils.isBlank(key) || StringUtils.isBlank(act) || !StringUtils.isNumeric(counts) || !StringUtils.isNumeric(minutes)) {
LOGGER.info("Lock_ipv4: fail to config noun");
log.info("Lock_ipv4: fail to config noun");
return JsonResult.buildErrorStateResult(WORD, null);
}
boolean actOk = Objects.equals(Boolean.TRUE.toString(), act) || Objects.equals(Boolean.FALSE.toString(), act);
......@@ -219,7 +220,7 @@ public class LockIpv4Controller implements IBaseController {
return JsonResult.buildSuccessResult("Success", null);
}
}
LOGGER.info("Lock_ipv4: fail to config noun");
log.info("Lock_ipv4: fail to config noun");
return JsonResult.buildErrorStateResult(WORD, null);
}
......@@ -234,16 +235,16 @@ public class LockIpv4Controller implements IBaseController {
if (operate) {
if (counts > 0) {
redisTemplate.opsForValue().set(Constants.IPV4_LOCK_ON_COUNTS_REDIS, String.valueOf(counts));
LOGGER.info("Lock_ipv4: config redis-param counts Success, counts:{}", counts);
log.info("Lock_ipv4: config redis-param counts Success, counts:{}", counts);
}
if (minutes > 0) {
redisTemplate.opsForValue().set(Constants.IPV4_LOCK_MINUTES_REDIS, String.valueOf(minutes));
LOGGER.info("Lock_ipv4: config redis-param minutes Success, minutes:{}", minutes);
log.info("Lock_ipv4: config redis-param minutes Success, minutes:{}", minutes);
}
} else {
redisTemplate.delete(Constants.IPV4_LOCK_ON_COUNTS_REDIS);
redisTemplate.delete(Constants.IPV4_LOCK_MINUTES_REDIS);
LOGGER.info("Lock_ipv4: remove redis-param counts、minutes Success, counts:{},minutes:{}, current default:[counts:{},minutes:{}]", Constants.IPV4_LOCK_ON_FAILED_COUNTS, Constants.IPV4_FAILED_LOCK_MINUTES);
log.info("Lock_ipv4: remove redis-param counts、minutes Success, counts:{},minutes:{}, current default:[counts:{},minutes:{}]", Constants.IPV4_LOCK_ON_FAILED_COUNTS, Constants.IPV4_FAILED_LOCK_MINUTES);
}
}
......
package cn.quantgroup.xyqb.controller.external.platform;
import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.controller.IBaseController;
import cn.quantgroup.xyqb.entity.Merchant;
import cn.quantgroup.xyqb.entity.MerchantConfig;
......@@ -21,7 +22,7 @@ import org.springframework.web.bind.annotation.RestController;
*/
@RestController
@RequestMapping("/platform/api")
public class PlatformAPIController implements IBaseController {
public class PlatformApiController implements IBaseController {
@Autowired
private IPageService pageService;
......@@ -52,7 +53,7 @@ public class PlatformAPIController implements IBaseController {
Tuple<String, Boolean> nextPageTuple = pageService.nextPage(user, target, currentPage);
Boolean isFinal = nextPageTuple.getValue();
String nextPage = nextPageTuple.getKey();
if ("xyqb".equals(key)) {
if (Constants.PAGE_NEXT_KEY_XYQB.equals(key)) {
MerchantConfig merchantConfig = merchantService.findConfigByMerchantIdAndConfigName(4L, "returnUrl");
return JsonResult.buildSuccessResult("", ImmutableMap.of("type", "external", "transition", merchantConfig.getConfigValue()));
}
......
......@@ -9,8 +9,9 @@ import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.model.sms.SmsMerchant;
import cn.quantgroup.xyqb.service.sms.ISmsService;
import cn.quantgroup.xyqb.util.DateUtils;
import cn.quantgroup.xyqb.util.IPUtil;
import cn.quantgroup.xyqb.util.IpUtil;
import cn.quantgroup.xyqb.util.ValidationUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
......@@ -23,20 +24,17 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* Created by FrankChow on 15/7/6.
*/
@Slf4j
@RestController
@RequestMapping("/api/sms")
public class SmsController implements IBaseController {
private static final Logger LOGGER = LoggerFactory.getLogger(SmsController.class);
private final static String RANDOM_CHARS = "0123456789";
private static final long EXPIRE_MINUTES = 10;
@Autowired
......@@ -49,11 +47,20 @@ public class SmsController implements IBaseController {
private static final String IMAGE_IP_COUNT = "image:ip";
private static final String IMAGE_PHONE_COUNT = "image:phone";
private static final String IMAGE_DEVICEID_COUNT = "image:deviceId:";
private static final Long IP_MAX_PER_DAY = 5000L;//ip上限
private static final Long PHONE_MAX_PER_DAY = 20L;//手机号短信上限
private static final Long PHONE_VOICE_MAX_PER_DAY = 5L;//手机号语音上限
private static final Long DEVICE_MAX_PER_DAY = 20L;//设备每天上限
/** ip上限 */
private static final Long IP_MAX_PER_DAY = 5000L;
/** 手机号短信上限 */
private static final Long PHONE_MAX_PER_DAY = 20L;
/** 手机号语音上限 */
private static final Long PHONE_VOICE_MAX_PER_DAY = 5L;
/** 设备每天上限 */
private static final Long DEVICE_MAX_PER_DAY = 20L;
/** 手机号语音上限-KEY-4 */
private static final String PHONE_VOICE_MAX_PER_DAY_KEY_4 = "4";
/** 手机号语音上限-KEY-5 */
private static final String PHONE_VOICE_MAX_PER_DAY_KEY_5 = "5";
/** 手机号语音上限-KEY-6 */
private static final String PHONE_VOICE_MAX_PER_DAY_KEY_6 = "6";
/**
* 短信验证码: for H5
......@@ -70,8 +77,8 @@ public class SmsController implements IBaseController {
@RequestParam(required = false) String registerFrom,
@RequestParam(required = false, defaultValue = "") String appName,
@RequestParam(required = false) String smsMerchant) {
LOGGER.info("注册-发送验证码, phoneNo:{}, registerFrom:{}", phoneNo, registerFrom);
String randomCode = getRandomCode(4);
log.info("注册-发送验证码, phoneNo:{}, registerFrom:{}", phoneNo, registerFrom);
String randomCode = getRandomCode(Constants.SMS_CODE_LEN_4);
return sendVerificationCode2(phoneNo, randomCode, appName, smsMerchant);
}
......@@ -90,8 +97,8 @@ public class SmsController implements IBaseController {
@RequestParam(required = false) String registerFrom,
@RequestParam(required = false, defaultValue = "") String appName,
@RequestParam(required = false) String smsMerchant) {
LOGGER.info("重置密码-发送验证码, phoneNo:{}, registerFrom:{}", phoneNo, registerFrom);
String randomCode = getRandomCode(4);
log.info("重置密码-发送验证码, phoneNo:{}, registerFrom:{}", phoneNo, registerFrom);
String randomCode = getRandomCode(Constants.SMS_CODE_LEN_4);
return sendVerificationCode2(phoneNo, randomCode, appName, smsMerchant);
}
......@@ -103,12 +110,12 @@ public class SmsController implements IBaseController {
@RequestMapping("/send_sms_verification_code_voice")
public JsonResult verifyPhoneNoH5New(@RequestParam String phoneNo, @RequestParam(required = false) String registerFrom,
String usage) {
if (StringUtils.isEmpty(usage) || !"4".equals(usage)) {
LOGGER.error("参数校验失败,用户注册语音验证码usage参数为{}", usage);
if (!Objects.equals(PHONE_VOICE_MAX_PER_DAY_KEY_4, usage)) {
log.error("参数校验失败,用户注册语音验证码usage参数为{}", usage);
return JsonResult.buildErrorStateResult("参数校验失败.", null);
}
LOGGER.info("注册-发送验证码, phoneNo:{}, registerFrom:{}", phoneNo, registerFrom);
String randomCode = getRandomCode(4);
log.info("注册-发送验证码, phoneNo:{}, registerFrom:{}", phoneNo, registerFrom);
String randomCode = getRandomCode(Constants.SMS_CODE_LEN_4);
return sendVerificationCode2Voice(phoneNo, randomCode, usage);
}
......@@ -116,12 +123,12 @@ public class SmsController implements IBaseController {
@RequestMapping("/send_reset_code_voice")
public JsonResult resetPasswordH5New(@RequestParam String phoneNo, @RequestParam(required = false) String registerFrom,
String usage) {
if (StringUtils.isEmpty(usage) || !"5".equals(usage)) {
LOGGER.error("参数校验失败,重置密码语音验证码usage参数为{}", usage);
if (!Objects.equals(PHONE_VOICE_MAX_PER_DAY_KEY_5, usage)) {
log.error("参数校验失败,重置密码语音验证码usage参数为{}", usage);
return JsonResult.buildErrorStateResult("参数校验失败.", null);
}
LOGGER.info("重置密码-发送验证码, phoneNo:{}, registerFrom:{}", phoneNo, registerFrom);
String randomCode = getRandomCode(4);
log.info("重置密码-发送验证码, phoneNo:{}, registerFrom:{}", phoneNo, registerFrom);
String randomCode = getRandomCode(Constants.SMS_CODE_LEN_4);
return sendVerificationCode2Voice(phoneNo, randomCode, usage);
}
......@@ -132,12 +139,12 @@ public class SmsController implements IBaseController {
@RequestMapping("/send_login_code_voice")
public JsonResult sendLoginCodeNew(@RequestParam String phoneNo, @RequestParam(required = false) String registerFrom,
String usage) {
if (StringUtils.isEmpty(usage) || !"6".equals(usage)) {
LOGGER.error("参数校验失败,用户登录语音验证码usage参数为{}", usage);
if (!Objects.equals(PHONE_VOICE_MAX_PER_DAY_KEY_6, usage)) {
log.error("参数校验失败,用户登录语音验证码usage参数为{}", usage);
return JsonResult.buildErrorStateResult("参数校验失败.", null);
}
LOGGER.info("快速登陆-发送验证码, phoneNo:{}, registerFrom:{}", phoneNo, registerFrom);
String randomCode = getRandomCode(4);
log.info("快速登陆-发送验证码, phoneNo:{}, registerFrom:{}", phoneNo, registerFrom);
String randomCode = getRandomCode(Constants.SMS_CODE_LEN_4);
return sendVerificationCode2Voice(phoneNo, randomCode, usage);
}
......@@ -154,8 +161,8 @@ public class SmsController implements IBaseController {
@RequestParam(required = false) String registerFrom,
@RequestParam(required = false, defaultValue = "") String appName,
@RequestParam(required = false) String smsMerchant) {
LOGGER.info("快速登陆-发送验证码, phoneNo:{}, registerFrom:{}", phoneNo, registerFrom);
String randomCode = getRandomCode(4);
log.info("快速登陆-发送验证码, phoneNo:{}, registerFrom:{}", phoneNo, registerFrom);
String randomCode = getRandomCode(Constants.SMS_CODE_LEN_4);
return sendVerificationCode2(phoneNo, randomCode, appName, smsMerchant);
}
......@@ -172,8 +179,8 @@ public class SmsController implements IBaseController {
@RequestParam(required = false) String registerFrom,
@RequestParam(required = false, defaultValue = "") String appName,
@RequestParam(required = false) String smsMerchant) {
LOGGER.info("快速注册-发送验证码, phoneNo:{}, registerFrom:{}", phoneNo, registerFrom);
String randomCode = getRandomCode(4);
log.info("快速注册-发送验证码, phoneNo:{}, registerFrom:{}", phoneNo, registerFrom);
String randomCode = getRandomCode(Constants.SMS_CODE_LEN_4);
return sendVerificationCode2(phoneNo, randomCode, appName, smsMerchant);
}
......@@ -217,7 +224,7 @@ public class SmsController implements IBaseController {
deleteRetSendCode(phoneNo);//删除用户重置密码,多次错误逻辑
return JsonResult.buildSuccessResult("发送成功", uniqueId);
} catch (Exception e) {
LOGGER.error("发送短信验证码失败");
log.error("发送短信验证码失败");
return JsonResult.buildErrorStateResult("发送失败", null);
}
}
......@@ -226,7 +233,7 @@ public class SmsController implements IBaseController {
String verificationCountKey = Constants.REDIS_VOICE_CODE_COUNT + phoneNo;
Long getVerificationCount = redisTemplate.opsForHash().increment(verificationCountKey, usage, 1);
redisTemplate.expire(verificationCountKey, DateUtils.getSeconds(), TimeUnit.SECONDS);
if (getVerificationCount > 5) {
if (getVerificationCount > PHONE_VOICE_MAX_PER_DAY) {
return JsonResult.buildErrorStateResult("今天已获取5次语音验证码,请使用短信验证码或明天再试", null);
}
......@@ -246,7 +253,7 @@ public class SmsController implements IBaseController {
deleteRetSendCode(phoneNo);//删除用户重置密码,多次错误逻辑
return JsonResult.buildSuccessResult("发送成功", uniqueId);
} catch (Exception e) {
LOGGER.error("发送语音短信验证码失败");
log.error("发送语音短信验证码失败");
return JsonResult.buildErrorStateResult("发送失败", null);
}
}
......@@ -258,12 +265,12 @@ public class SmsController implements IBaseController {
@RequestMapping("/send_login_code_voice_new")
public JsonResult sendLoginCodeVoiceNew(@RequestParam String phoneNo, @RequestParam(required = false) String registerFrom,
String usage, @RequestParam(required = false) String deviceId) {
if (StringUtils.isEmpty(usage) || !"6".equals(usage)) {
LOGGER.error("参数校验失败,用户登录语音验证码usage参数为{}", usage);
if (!Objects.equals(PHONE_VOICE_MAX_PER_DAY_KEY_6, usage)) {
log.error("参数校验失败,用户登录语音验证码usage参数为{}", usage);
return JsonResult.buildErrorStateResult("参数校验失败.", null);
}
LOGGER.info("快速登陆-发送验证码, phoneNo:{}, registerFrom:{}", phoneNo, registerFrom);
String randomCode = getRandomCode(4);
log.info("快速登陆-发送验证码, phoneNo:{}, registerFrom:{}", phoneNo, registerFrom);
String randomCode = getRandomCode(Constants.SMS_CODE_LEN_4);
return sendVerificationCode2VoiceNew(phoneNo, randomCode, usage, deviceId);
}
......@@ -283,8 +290,8 @@ public class SmsController implements IBaseController {
@RequestParam(required = false) String deviceId,
@RequestParam(required = false, defaultValue = "") String appName,
@RequestParam(required = false) String smsMerchant) {
LOGGER.info("快速登陆-发送验证码, phoneNo:{}, registerFrom:{}", phoneNo, registerFrom);
String randomCode = getRandomCode(4);
log.info("快速登陆-发送验证码, phoneNo:{}, registerFrom:{}", phoneNo, registerFrom);
String randomCode = getRandomCode(Constants.SMS_CODE_LEN_4);
return sendVerificationCode2New(phoneNo, randomCode, deviceId, true, appName, smsMerchant);
}
......@@ -304,8 +311,8 @@ public class SmsController implements IBaseController {
@RequestParam(required = false) String deviceId,
@RequestParam(required = false, defaultValue = "") String appName,
@RequestParam(required = false) String smsMerchant) {
LOGGER.info("快速登陆-发送验证码, phoneNo:{}, registerFrom:{}", phoneNo, registerFrom);
String randomCode = getRandomCode(4);
log.info("快速登陆-发送验证码, phoneNo:{}, registerFrom:{}", phoneNo, registerFrom);
String randomCode = getRandomCode(Constants.SMS_CODE_LEN_4);
return sendVerificationCode2New(phoneNo, randomCode, deviceId, false, appName, smsMerchant);
}
......@@ -325,8 +332,8 @@ public class SmsController implements IBaseController {
@RequestParam(required = false) String deviceId,
@RequestParam(required = false, defaultValue = "") String appName,
@RequestParam(required = false) String smsMerchant) {
LOGGER.info("VCC-发送验证码, phoneNo:{}, registerFrom:{}", phoneNo, registerFrom);
String randomCode = getRandomCode(6);
log.info("VCC-发送验证码, phoneNo:{}, registerFrom:{}", phoneNo, registerFrom);
String randomCode = getRandomCode(Constants.SMS_CODE_LEN_6);
return sendVerificationCode2New(phoneNo, randomCode, deviceId, true, appName, smsMerchant);
}
......@@ -338,7 +345,7 @@ public class SmsController implements IBaseController {
case 6:
return "000000";
default:
return "0000";
return Constants.SUCCESS_CODE;
}
}
......@@ -357,7 +364,7 @@ public class SmsController implements IBaseController {
return JsonResult.buildErrorStateResult("手机号格式有误", null);
}
String clientIp = getIp();
LOGGER.info("请求短信新版本接口:phoneNo:{},deviceId:{},IP:{}", phoneNo, deviceId, clientIp);
log.info("请求短信新版本接口:phoneNo:{},deviceId:{},IP:{}", phoneNo, deviceId, clientIp);
// 手机号计数器
Long getPhoneVerificationCount = redisTemplate.opsForHash().increment(Constants.REDIS_SMS_CODE_COUNT, phoneNo, 1);
redisTemplate.expire(Constants.REDIS_SMS_CODE_COUNT, DateUtils.getSeconds(), TimeUnit.SECONDS);
......@@ -375,24 +382,24 @@ public class SmsController implements IBaseController {
}
// 手机号上限检查
if (getPhoneVerificationCount > PHONE_MAX_PER_DAY) {
LOGGER.info("您手机号已经达到获取今天短信验证码上限:phoneNo:{},count:{}", phoneNo, getPhoneVerificationCount);
log.info("您手机号已经达到获取今天短信验证码上限:phoneNo:{},count:{}", phoneNo, getPhoneVerificationCount);
return JsonResult.buildErrorStateResult("今天已获取20次短信验证码,请使用语音验证码或明天再试", null);
}
// 设备号上限检查
if (getDeviceVerificationCount > DEVICE_MAX_PER_DAY) {
LOGGER.info("您设备已经达到获取今天验证码上限:deviceId:{},count:{}", deviceId, getDeviceVerificationCount);
log.info("您设备已经达到获取今天验证码上限:deviceId:{},count:{}", deviceId, getDeviceVerificationCount);
return JsonResult.buildErrorStateResult("您设备已经达到获取今天验证码上限", null);
}
// IP上限检查
if (!IPUtil.whiteOf(clientIp) && getIPVerificationCount > IP_MAX_PER_DAY) {
LOGGER.info("您当前ip已经达到获取今天短信验证码上限:ip:{},count:{}", clientIp, getIPVerificationCount);
if (!IpUtil.whiteOf(clientIp) && getIPVerificationCount > IP_MAX_PER_DAY) {
log.info("您当前ip已经达到获取今天短信验证码上限:ip:{},count:{}", clientIp, getIPVerificationCount);
return JsonResult.buildErrorStateResult("您当前ip已经达到获取今天短信验证码上限", null);
}
String key = Constants.REDIS_PREFIX_VERIFICATION_CODE + phoneNo;
long expire = redisTemplate.getExpire(key, TimeUnit.MINUTES);
if (expire >= EXPIRE_MINUTES - 1) {
LOGGER.info("sendVerificationCode2New1分钟内不能重复获取验证码:phoneNo:{},deviceId:{},ip:{}", phoneNo, deviceId, clientIp);
log.info("sendVerificationCode2New1分钟内不能重复获取验证码:phoneNo:{},deviceId:{},ip:{}", phoneNo, deviceId, clientIp);
return JsonResult.buildErrorStateResult("1分钟内不能重复获取验证码", null);
}
String uniqueId = phoneNo + UUID.randomUUID().toString().replaceAll("-", "");
......@@ -416,10 +423,10 @@ public class SmsController implements IBaseController {
if (isApp && needImageVlidate(clientIp, deviceId, phoneNo)) {
return JsonResult.buildSuccessResult("发送成功", uniqueId, 3L);
}
LOGGER.info("sendVerificationCode2New获取短信成功:phone:{},deviceId:{},ip:{}", phoneNo, deviceId, clientIp);
log.info("sendVerificationCode2New获取短信成功:phone:{},deviceId:{},ip:{}", phoneNo, deviceId, clientIp);
return JsonResult.buildSuccessResult("发送成功", uniqueId);
} catch (Exception e) {
LOGGER.error("发送短信验证码失败:phone:{},deviceId:{},ip:{}", phoneNo, deviceId, clientIp);
log.error("发送短信验证码失败:phone:{},deviceId:{},ip:{}", phoneNo, deviceId, clientIp);
return JsonResult.buildErrorStateResult("发送失败", null);
}
}
......@@ -435,7 +442,7 @@ public class SmsController implements IBaseController {
return JsonResult.buildErrorStateResult("usage参数无效", null);
}
String clientIp = getIp();
LOGGER.info("请求短信新版本接口:phoneNo:{},deviceId:{},usage:{},IP:{}", phoneNo, deviceId, usage, clientIp);
log.info("请求短信新版本接口:phoneNo:{},deviceId:{},usage:{},IP:{}", phoneNo, deviceId, usage, clientIp);
// 手机号计数器
String verificationCountKey = Constants.REDIS_VOICE_CODE_COUNT + usage;
Long getPhoneVerificationCount = redisTemplate.opsForHash().increment(verificationCountKey, phoneNo, 1);
......@@ -456,17 +463,17 @@ public class SmsController implements IBaseController {
}
// 手机号上限检查
if (getPhoneVerificationCount > PHONE_VOICE_MAX_PER_DAY) {
LOGGER.info("您手机号已经达到获取今天语音验证码上限,请使用短信验证码或明天再试:phoneNo:{},count:{}", phoneNo, getPhoneVerificationCount);
log.info("您手机号已经达到获取今天语音验证码上限,请使用短信验证码或明天再试:phoneNo:{},count:{}", phoneNo, getPhoneVerificationCount);
return JsonResult.buildErrorStateResult("今天已获取5次语音验证码,请使用短信验证码或明天再试", null);
}
// 设备号上限检查
if (getDeviceVerificationCount > DEVICE_MAX_PER_DAY) {
LOGGER.info("您设备已经达到获取今天语音验证码上限:deviceId:{},count:{}", deviceId, getDeviceVerificationCount);
log.info("您设备已经达到获取今天语音验证码上限:deviceId:{},count:{}", deviceId, getDeviceVerificationCount);
return JsonResult.buildErrorStateResult("您设备已经达到获取今天语音验证码上限", null);
}
// IP上限检查
if (!IPUtil.whiteOf(clientIp) && getIPVerificationCount > IP_MAX_PER_DAY) {
LOGGER.info("您当前ip已经达到获取今天短信验证码上限:ip:{},count:{}", clientIp, getIPVerificationCount);
if (!IpUtil.whiteOf(clientIp) && getIPVerificationCount > IP_MAX_PER_DAY) {
log.info("您当前ip已经达到获取今天短信验证码上限:ip:{},count:{}", clientIp, getIPVerificationCount);
return JsonResult.buildErrorStateResult("您当前ip已经达到获取今天语音验证码上限", null);
}
......@@ -488,7 +495,7 @@ public class SmsController implements IBaseController {
}
return JsonResult.buildSuccessResult("发送成功", uniqueId);
} catch (Exception e) {
LOGGER.error("发送语音短信验证码失败");
log.error("发送语音短信验证码失败");
return JsonResult.buildErrorStateResult("发送失败", null);
}
}
......
......@@ -8,11 +8,15 @@ import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.quantgroup.xyqb.exception.UserQueryLogException;
import cn.quantgroup.xyqb.util.encrypt.Rsa;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
......@@ -20,8 +24,6 @@ import org.springframework.web.bind.annotation.RestController;
import com.google.gson.*;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.entity.Address;
......@@ -36,18 +38,16 @@ import cn.quantgroup.xyqb.service.user.IUserDetailService;
import cn.quantgroup.xyqb.service.user.IUserQueryLogService;
import cn.quantgroup.xyqb.util.IdcardValidator;
import cn.quantgroup.xyqb.util.ValidationUtil;
import cn.quantgroup.xyqb.util.encrypt.MD5Util;
import cn.quantgroup.xyqb.util.encrypt.RSA;
import cn.quantgroup.xyqb.util.encrypt.Md5Util;
/**
* Created by zenglibin on 17/06/13.
*/
@Slf4j
@RestController
@RequestMapping("/query")
public class UserQueryLogController {
private static final Logger LOGGER = LoggerFactory.getLogger(UserQueryLogController.class);
@Autowired
private IUserQueryLogService userQueryLogService;
@Autowired
......@@ -73,16 +73,9 @@ public class UserQueryLogController {
@RequestMapping("/queryLog")
@ApiOperation(value = "给运营系统提供的查询查询记录的", notes = "给运营系统提供的查询查询记录的", httpMethod = "POST")
public JsonResult queryLog(HttpServletRequest request, @RequestParam(required = false) String beginDate, @RequestParam(required = false) String endDate, Integer pageId, Integer pageSize) {
LOGGER.info("查询日期:beginDate{},endDate{}", beginDate, endDate);
log.info("查询日期:beginDate{},endDate{}", beginDate, endDate);
String token = request.getHeader(Constants.X_AUTH_TOKEN);
if (StringUtils.isEmpty(token)) {
LOGGER.info("token为空,非法查询");
return JsonResult.buildErrorStateResult("缺少授权信息", null);
}
if (StringUtils.isEmpty(checkUserToken(token))) {
LOGGER.info("token授权异常");
return JsonResult.buildErrorStateResult("未授权查询", null);
}
checkUserToken(token);
try {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
......@@ -105,9 +98,9 @@ public class UserQueryLogController {
PageModel<UserQueryLog> uqp = new PageModel<>();
uqp.setTotal(total);
if (pageSize == 0 || pageSize < 0) {
pageSize = 30;
} else if (pageSize > 200) {
pageSize = 200;
pageSize = Constants.PAGE_SIZE_DEFAULT;
} else if (pageSize > Constants.PAGE_SIZE_MAX) {
pageSize = Constants.PAGE_SIZE_MAX;
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
......@@ -115,14 +108,14 @@ public class UserQueryLogController {
ll.setCreateDate(sdf.format(ll.getCreatedAt()));
}
} catch (Exception e) {
LOGGER.info("日期时间转换异常");
log.info("日期时间转换异常");
return JsonResult.buildErrorStateResult("日期时间转换异常", null);
}
uqp.setPageSize(pageSize);
uqp.setPageId(pageId);
uqp.setPageList(userQueryLogs);
int yu = total.intValue() % pageSize;
Double d = Math.ceil(total / pageSize);
Double d = Math.ceil((double)total / (double)pageSize);
uqp.setPages(yu > 0 ? d.intValue() + 1 : d.intValue());
return JsonResult.buildSuccessResult("查询成功", uqp);
} catch (Exception e) {
......@@ -133,46 +126,29 @@ public class UserQueryLogController {
@RequestMapping("/queryUserInfo")
@ApiOperation(value = "给运营系统提供的查询用户信息的接口", notes = "给运营系统提供的查询用户信息的接口", httpMethod = "POST")
public JsonResult queryForResult(HttpServletRequest request, String key, String keyValues, String columns, Integer pageId, Integer pageSize) {
LOGGER.info("查询条件:key{},columns{}", key, columns);
String token = request.getHeader(Constants.X_AUTH_TOKEN);
if (StringUtils.isEmpty(token)) {
LOGGER.info("token为空,非法查询");
return JsonResult.buildErrorStateResult("缺少授权信息", null);
}
//columns=> userId,phoneNo,idNo,bankCard,address
//key=>phoneNo、idNo、userId
//checkKeysType;
//后台参数校验
//校验用户权限
String userName = checkUserToken(token);
if (StringUtils.isEmpty(userName)) {
LOGGER.info("token授权异常");
return JsonResult.buildErrorStateResult("未授权查询", null);
}
//输入enter换行\n
if (org.apache.commons.lang3.StringUtils.isEmpty(keyValues)) {
if (StringUtils.isEmpty(keyValues)) {
return JsonResult.buildErrorStateResult("请输入查询条件", null);
}
String[] values = keyValues.split("\\n");
String[] values = keyValues.split(";");
List<String> queryV = Arrays.asList(values);
if (queryV != null && queryV.size() > 3000) {
return JsonResult.buildErrorStateResult("查询记录数是" + queryV.size() + ",超过3000条限制", null);
log.info("[UserQueryLogController][exportExcel]运营系统导出用户信息开始 size:{}, key:{}, keyValues:{}, columns:{}", queryV.size(), key, keyValues, columns);
if (queryV != null && queryV.size() > Constants.USER_QUERY_INFO_BATCH_SIZE) {
return JsonResult.buildErrorStateResult("查询记录数是" + queryV.size() + ",超过"+Constants.USER_QUERY_INFO_BATCH_SIZE +"条限制", null);
}
List<UserQueryInfo> userQueryInfos = new ArrayList<>();
List<UserDetail> userDetails = new ArrayList<>();
Page<UserDetail> userDetailPage = null;
List<Address> addresslist = new ArrayList<>();
HashMap<String, String> phonesCards = new HashMap<>();
if (pageSize == 0 || pageSize < 0) {
pageSize = 30;
} else if (pageSize > 200) {
pageSize = 200;
pageSize = Constants.PAGE_SIZE_DEFAULT;
} else if (pageSize > Constants.PAGE_SIZE_MAX) {
pageSize = Constants.PAGE_SIZE_MAX;
}
//如果维度里面没有保护查询条件则加入条件
if (!columns.contains(key)) {
columns = columns + "," + key;
}
if (Objects.equals(key, "userId")) {
if (Objects.equals(key, Constants.USER_ID)) {
List<Long> userIds = new ArrayList<>();
try {
for (String s : queryV) {
......@@ -193,7 +169,7 @@ public class UserQueryLogController {
}
}
userDetailPage = userDetailService.getUserDetailsPage(null, queryV, null, pageId, pageSize, "auto");
} else if (Objects.equals(key, "idNo")) {
} else if (Objects.equals(key, Constants.ID_NO)) {
for (String idno : queryV) {
if (!IdcardValidator.is18Idcard(idno) && !IdcardValidator.is15Idcard(idno)) {
return JsonResult.buildErrorStateResult("查询的身份证号" + idno + "格式有误", null);
......@@ -204,63 +180,15 @@ public class UserQueryLogController {
if (userDetailPage != null) {
userDetails = userDetailPage.getContent();
}
if (columns.contains("bankCard")) {
//需加银行卡信息
if (Objects.equals(key, Constants.PHONE_NO)) {
phonesCards = getBankCardsByPhoneNos(queryV);
if (phonesCards != null && phonesCards.get("errorMsg") != null && !StringUtils.isEmpty(phonesCards.get("errorMsg"))) {
return JsonResult.buildErrorStateResult(phonesCards.get("errorMsg"), null);
}
} else {
List<String> phones = new ArrayList<>();
for (UserDetail uda : userDetails) {
phones.add(uda.getPhoneNo());
}
phonesCards = getBankCardsByPhoneNos(phones);
if (phonesCards != null && phonesCards.get("errorMsg") != null && !StringUtils.isEmpty(phonesCards.get("errorMsg"))) {
return JsonResult.buildErrorStateResult(phonesCards.get("errorMsg"), null);
}
}
}
if (columns.contains("address")) {
List<Long> uidss = new ArrayList<>();
//加地址信息
for (UserDetail ud : userDetails) {
uidss.add(ud.getUserId());
}
if (uidss != null && uidss.size() > 0) {
addresslist = addressService.findByUserIds(uidss);
}
}
for (UserDetail ud : userDetails) {
UserQueryInfo uqi = new UserQueryInfo();
if (columns.contains("idNo")) {
uqi.setIdNo(ud.getIdNo());
}
if (columns.contains(Constants.PHONE_NO)) {
uqi.setPhoneNo(ud.getPhoneNo());
}
if (columns.contains("name")) {
uqi.setName(ud.getName());
}
if (columns.contains("userId")) {
uqi.setUserId(ud.getUserId());
}
if (columns.contains("address")) {
Optional<Address> oad = addresslist.stream().filter(addr -> Objects.equals(addr.getUserId(), ud.getUserId())).findFirst();
oad.ifPresent(address -> uqi.setAddress(address.toString()));
}
if (columns.contains("bankCard") && phonesCards != null) {
uqi.setBankCards(phonesCards.get(ud.getPhoneNo()));
}
userQueryInfos.add(uqi);
}
List<UserQueryInfo> userQueryInfos = toUserQueryInfo(key, columns, queryV, userDetails);
//保存记录
UserQueryLog log = new UserQueryLog();
log.setQueryItems(columns.replace("userId", "用户ID").replace(Constants.PHONE_NO, "手机号").replace("name", "姓名").replace("idNo", "身份证号").replace("bankCard", "银行卡号").replace("address", "地址"));
log.setQueryItems(columns.replace(Constants.USER_ID, "用户ID").replace(Constants.PHONE_NO, "手机号").replace(Constants.USER_NAME, "姓名").replace(Constants.ID_NO, "身份证号").replace(Constants.BANK_CARD, "银行卡号").replace(Constants.ADDRESS, "地址"));
if(userDetailPage != null){
log.setResultAmount(userDetailPage.getTotalElements());
}
//转换存储
log.setQueryCondition(key.replace("userId", "用户ID").replace(Constants.PHONE_NO, "手机号").replace("name", "姓名").replace("idNo", "身份证号"));
log.setQueryCondition(key.replace(Constants.USER_ID, "用户ID").replace(Constants.PHONE_NO, "手机号").replace(Constants.USER_NAME, "姓名").replace(Constants.ID_NO, "身份证号"));
log.setQueryDetail(keyValues.replace("\n", ";"));
log.setLoginUserName(userName);
userQueryLogService.save(log);
......@@ -268,8 +196,10 @@ public class UserQueryLogController {
uqi.setPageId(pageId);
uqi.setPageList(userQueryInfos);
uqi.setPageSize(pageSize);
if(userDetailPage != null){
uqi.setPages(userDetailPage.getTotalPages());
uqi.setTotal(userDetailPage.getTotalElements());
}
return JsonResult.buildSuccessResult("查询成功", uqi);
}
......@@ -283,29 +213,26 @@ public class UserQueryLogController {
String sign = "";
HashMap<String, String> phonesMap = new HashMap<>();
try {
data = RSA.encrypt(phoneNoStr, PUBLIC_KEY);
sign = MD5Util.build(data);
data = Rsa.encrypt(phoneNoStr, PUBLIC_KEY);
sign = Md5Util.build(data);
} catch (Exception e) {
LOGGER.info("参数加密异常");
phonesMap.put("errorMsg", "参数加密异常");
return null;
log.info("参数加密异常", e);
throw new UserQueryLogException("参数加密异常", e);
}
HashMap<String, String> parameters = new HashMap<>();
parameters.put("data", data);
parameters.put(Constants.RESULT_DATA, data);
parameters.put("sign", sign);
//访问用户中心查询用户银行卡接口
String resultStr = httpService.post(payCenterUrl + "/ex/search/card_list", parameters);
try {
JsonObject obj = new JsonParser().parse(resultStr).getAsJsonObject();
if (obj.get("data") != null) {
JsonObject data1 = obj.get("data").getAsJsonObject();
String dataStr = data1.get("data").getAsString();
if (obj.get(Constants.RESULT_DATA) != null) {
JsonObject data1 = obj.get(Constants.RESULT_DATA).getAsJsonObject();
String dataStr = data1.get(Constants.RESULT_DATA).getAsString();
String signStr = data1.get("sign").getAsString();
//校验签名
if (MD5Util.build(dataStr).equals(signStr)) {
String jsonDataStr = RSA.decrypt(dataStr, PRIVATE_KEY);
if (Md5Util.build(dataStr).equals(signStr)) {
String jsonDataStr = Rsa.decrypt(dataStr, PRIVATE_KEY);
JsonArray listObj = new JsonParser().parse(jsonDataStr).getAsJsonArray();
for (JsonElement jsonElement : listObj) {
JsonObject jo = jsonElement.getAsJsonObject();
......@@ -322,13 +249,13 @@ public class UserQueryLogController {
}
} else {
phonesMap.put("errorMsg", "签名校验失败!");
LOGGER.info("签名校验失败!");
log.error("签名校验失败!");
throw new UserQueryLogException("签名校验失败");
}
}
} catch (Exception e) {
phonesMap.put("errorMsg", "查询银行卡信息接口返回解析异常");
LOGGER.info("查询银行卡信息接口返回解析异常");
log.error("查询银行卡信息接口返回解析异常", e);
throw new UserQueryLogException("查询银行卡信息接口返回解析异常", e);
}
return phonesMap;
}
......@@ -337,38 +264,22 @@ public class UserQueryLogController {
@ApiOperation(value = "给运营系统提供的导出用户信息的接口", notes = "给运营系统提供的导出用户信息的接口", httpMethod = "POST")
public JsonResult exportExcel(final HttpServletResponse response, HttpServletRequest request, String key, String keyValues, String columns) {
String token = request.getHeader(Constants.X_AUTH_TOKEN);
if (StringUtils.isEmpty(token)) {
LOGGER.info("token为空,非法查询");
return JsonResult.buildErrorStateResult("缺少授权信息", null);
}
String userName = checkUserToken(token);
if (StringUtils.isEmpty(userName)) {
return JsonResult.buildErrorStateResult("未授权查询", null);
}
//输入enter换行\n
if (org.apache.commons.lang3.StringUtils.isEmpty(keyValues)) {
checkUserToken(token);
if (StringUtils.isEmpty(keyValues)) {
return JsonResult.buildErrorStateResult("请输入查询条件", null);
}
List<UserQueryInfo> uqls = new ArrayList<>();
String[] values = keyValues.split(";");
List<String> queryV = Arrays.asList(values);
LOGGER.info("[UserQueryLogController][exportExcel]运营系统导出用户信息开始 size:{}, key:{}, keyValues:{}, columns:{}", queryV.size(), key, keyValues, columns);
if (queryV != null && queryV.size() > 3000) {
return JsonResult.buildErrorStateResult("查询记录数是" + queryV.size() + ",超过3000条限制", null);
log.info("[UserQueryLogController][exportExcel]运营系统导出用户信息开始 size:{}, key:{}, keyValues:{}, columns:{}", queryV.size(), key, keyValues, columns);
if (queryV != null && queryV.size() > Constants.USER_QUERY_INFO_BATCH_SIZE) {
return JsonResult.buildErrorStateResult("查询记录数是" + queryV.size() + ",超过"+Constants.USER_QUERY_INFO_BATCH_SIZE +"条限制", null);
}
//如果维度里面没有保护查询条件则加入条件
if (!columns.contains(key)) {
columns = columns + "," + key;
}
List<UserQueryInfo> userQueryInfos = new ArrayList<>();
List<UserDetail> userDetails = new ArrayList<>();
List<Address> addresslist = new ArrayList<>();
HashMap<String, String> phonesCards = new HashMap<>();
if (Objects.equals(key, "userId")) {
if (Objects.equals(key, Constants.USER_ID)) {
List<Long> userIds = new ArrayList<>();
try {
for (String s : queryV) {
......@@ -378,11 +289,9 @@ public class UserQueryLogController {
long uid = Long.valueOf(s);
userIds.add(uid);
}
} catch (Exception e) {
return JsonResult.buildErrorStateResult("查询的userId有误", null);
}
userDetails = userDetailService.findByUserIdIn(userIds);
} else if (Objects.equals(key, Constants.PHONE_NO)) {
for (String pn : queryV) {
......@@ -390,9 +299,8 @@ public class UserQueryLogController {
return JsonResult.buildErrorStateResult("查询的手机号码" + pn + "格式有误", pn);
}
}
userDetails = userDetailService.findByPhoneNos(queryV);
} else if (Objects.equals(key, "idNo")) {
} else if (Objects.equals(key, Constants.ID_NO)) {
for (String idno : queryV) {
if (!IdcardValidator.is18Idcard(idno) && !IdcardValidator.is15Idcard(idno)) {
return JsonResult.buildErrorStateResult("查询的身份证号" + idno + "格式有误", idno);
......@@ -400,10 +308,40 @@ public class UserQueryLogController {
}
userDetails = userDetailService.findByIdnos(queryV);
}
List<UserQueryInfo> userQueryInfos = toUserQueryInfo(key, columns, queryV, userDetails);
/*
* 将文件存到指定位置
* 采用时间戳命名方式,避免同主机出现并发同名文件冲突引起的文件流被动关闭现象
*/
try(OutputStream output = response.getOutputStream()){
String filename = "users-".concat(LocalDateTime.now().toString()).concat(".xlsx");
response.reset();
response.setHeader("Content-disposition", "attachment; filename=".concat(filename));
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setCharacterEncoding("utf-8");
HSSFWorkbook wb = getHssfWorkbook(userQueryInfos);
wb.write(output);
log.info("[UserQueryLogController][exportExcel]运营系统导出用户信息完成 filename:{}, size:{}, key:{}, keyValues:{}, columns:{}", filename, queryV.size(), key, keyValues, columns);
} catch (Exception e) {
log.error("解析运营系统用户token返回结果resultStr异常", e);
}
return JsonResult.buildSuccessResult("导出成功", null);
}
if (columns.contains("bankCard")) {
/**
* 数据类型转换
*
* @param key
* @param columns
* @param queryV
* @param userDetails
* @return
*/
private List<UserQueryInfo> toUserQueryInfo(String key, String columns, List<String> queryV, List<UserDetail> userDetails) {
HashMap<String, String> phonesCards = new HashMap<>();
if (columns.contains(Constants.BANK_CARD)) {
//需加银行卡信息
if (key.equals(Constants.PHONE_NO)) {
if (Objects.equals(key, Constants.PHONE_NO)) {
phonesCards = getBankCardsByPhoneNos(queryV);
} else {
List<String> phones = new ArrayList<>();
......@@ -413,8 +351,8 @@ public class UserQueryLogController {
phonesCards = getBankCardsByPhoneNos(phones);
}
}
if (columns.contains("address")) {
List<Address> addresslist = new ArrayList<>();
if (columns.contains(Constants.ADDRESS)) {
List<Long> uidss = new ArrayList<>();
//加地址信息
for (UserDetail ud : userDetails) {
......@@ -423,35 +361,44 @@ public class UserQueryLogController {
if (uidss != null && uidss.size() > 0) {
addresslist = addressService.findByUserIds(uidss);
}
}
List<UserQueryInfo> userQueryInfos = new ArrayList<>();
for (UserDetail ud : userDetails) {
UserQueryInfo uqi = new UserQueryInfo();
if (columns.contains("idNo")) {
if (columns.contains(Constants.ID_NO)) {
uqi.setIdNo(ud.getIdNo());
}
if (columns.contains(Constants.PHONE_NO)) {
uqi.setPhoneNo(ud.getPhoneNo());
}
if (columns.contains("name")) {
if (columns.contains(Constants.USER_NAME)) {
uqi.setName(ud.getName());
}
if (columns.contains("userId")) {
if (columns.contains(Constants.USER_ID)) {
uqi.setUserId(ud.getUserId());
}
if (columns.contains("address")) {
if (columns.contains(Constants.ADDRESS)) {
Optional<Address> oad = addresslist.stream().filter(addr -> Objects.equals(addr.getUserId(), ud.getUserId())).findFirst();
oad.ifPresent(address -> uqi.setAddress(address.toString()));
}
if (columns.contains("bankCard") && phonesCards != null) {
if (columns.contains(Constants.BANK_CARD) && phonesCards != null) {
uqi.setBankCards(phonesCards.get(ud.getPhoneNo()));
}
uqls.add(uqi);
userQueryInfos.add(uqi);
}
return userQueryInfos;
}
/**
* 生成Excel
* @param uqls
* @return
*/
private HSSFWorkbook getHssfWorkbook(List<UserQueryInfo> uqls) {
HSSFWorkbook wb = new HSSFWorkbook();
if(CollectionUtils.isEmpty(uqls)){
return wb;
}
// 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
HSSFSheet sheet = wb.createSheet("用户信息列表");
// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
......@@ -462,7 +409,7 @@ public class UserQueryLogController {
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
HSSFCell cell = row.createCell(0);
cell.setCellValue("userId");
cell.setCellValue(Constants.USER_ID);
cell.setCellStyle(style);
cell = row.createCell(1);
cell.setCellValue("手机号");
......@@ -481,7 +428,6 @@ public class UserQueryLogController {
cell.setCellStyle(style);
// 第五步,写入实体数据 实际应用中这些数据从数据库得到,
for (int i = 0; i < uqls.size(); i++) {
row = sheet.createRow(i + 1);
UserQueryInfo user = uqls.get(i);
......@@ -491,66 +437,53 @@ public class UserQueryLogController {
if (cell0 != null) {
cell0.setCellValue(user.getUserId() == null ? " " : String.valueOf(user.getUserId()));
}
HSSFCell cell1 = row.createCell(1);
if (cell1 != null) {
cell1.setCellValue(user.getPhoneNo() == null ? " " : user.getPhoneNo());
}
HSSFCell cell2 = row.createCell(2);
if (cell2 != null) {
cell2.setCellValue(user.getName() == null ? " " : user.getName());
}
HSSFCell cell3 = row.createCell(3);
if (cell3 != null) {
cell3.setCellValue(user.getIdNo() == null ? " " : user.getIdNo());
}
HSSFCell cell4 = row.createCell(4);
if (cell4 != null) {
cell4.setCellValue(user.getBankCards() == null ? " " : user.getBankCards());
}
HSSFCell cell5 = row.createCell(5);
if (cell5 != null) {
cell5.setCellValue(user.getAddress() == null ? " " : user.getAddress());
}
}
}
/*
* 第六步,将文件存到指定位置
* 采用时间戳命名方式,避免同主机出现并发同名文件冲突引起的文件流被动关闭现象
*/
try(OutputStream output = response.getOutputStream()){
String filename = "users-".concat(LocalDateTime.now().toString()).concat(".xlsx");
response.reset();
response.setHeader("Content-disposition", "attachment; filename=".concat(filename));
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setCharacterEncoding("utf-8");
wb.write(output);
LOGGER.info("[UserQueryLogController][exportExcel]运营系统导出用户信息完成 filename:{}, size:{}, key:{}, keyValues:{}, columns:{}", filename, queryV.size(), key, keyValues, columns);
} catch (Exception e) {
LOGGER.error("解析运营系统用户token返回结果resultStr异常", e);
}
return JsonResult.buildSuccessResult("导出成功", null);
return wb;
}
private String checkUserToken(String token) {
if (StringUtils.isEmpty(token)) {
log.info("token为空,非法查询");
throw new UserQueryLogException("缺少授权信息");
}
HashMap<String, String> parameters = new HashMap<>();
parameters.put("token", token);
//访问用户中心查询用户银行卡接口
String resultStr = httpService.post(yunyingUrl + "/user/info", parameters);
String userName = null;
try {
JsonObject resultUser = new JsonParser().parse(resultStr).getAsJsonObject();
if (Objects.equals("0000", resultUser.get("code").getAsString()) && resultUser.get("data").getAsJsonObject() != null) {
String userName = resultUser.get("data").getAsJsonObject().get("user").getAsString();
return userName;
if (Objects.equals(Constants.SUCCESS_CODE, resultUser.get(Constants.RESULT_CODE).getAsString()) && resultUser.get(Constants.RESULT_DATA).getAsJsonObject() != null) {
userName = resultUser.get(Constants.RESULT_DATA).getAsJsonObject().get("user").getAsString();
}
} catch (Exception e) {
LOGGER.info("解析运营系统用户token返回结果resultStr异常");
log.error("解析运营系统用户token返回结果resultStr异常", e);
throw new UserQueryLogException("未授权查询", e);
}
return "";
if (StringUtils.isEmpty(userName)) {
throw new UserQueryLogException("未授权查询");
}
return userName;
}
}
......@@ -13,9 +13,10 @@ import cn.quantgroup.xyqb.service.merchant.IMerchantService;
import cn.quantgroup.xyqb.service.register.IUserRegisterService;
import cn.quantgroup.xyqb.service.session.ISessionService;
import cn.quantgroup.xyqb.service.user.IUserService;
import cn.quantgroup.xyqb.util.IPUtil;
import cn.quantgroup.xyqb.util.IpUtil;
import cn.quantgroup.xyqb.util.ValidationUtil;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -34,11 +35,11 @@ import static cn.quantgroup.xyqb.constant.UserConstant.USER_ERROR_OR_PASSWORD_ER
* @author mengfan.feng
* @time 2015-10-27 11:41
*/
@Slf4j
@RestController
@RequestMapping("/app")
public class AppController implements IBaseController {
private static final Logger LOGGER = LoggerFactory.getLogger(AppController.class);
@Autowired
private ISessionService sessionService;
@Autowired
......@@ -77,7 +78,7 @@ public class AppController implements IBaseController {
if (!ValidationUtil.validatePhoneNo(phoneNo)) {
return JsonResult.buildErrorStateResult(USER_ERROR_OR_PASSWORD_ERROR, null);
}
LOGGER.info("第三方用户登录 [AppController] login --> loginFrom:{},channelId:{},btRegisterChannelId:{} requestIp:{},idNo:{},name:{}", registerFrom, channelId, btRegisterChannelId, IPUtil.getRemoteIP(request), idNo, name);
log.info("第三方用户登录 [AppController] login --> loginFrom:{},channelId:{},btRegisterChannelId:{} requestIp:{},idNo:{},name:{}", registerFrom, channelId, btRegisterChannelId, IpUtil.getRemoteIP(request), idNo, name);
User user = userService.findByPhoneInDb(phoneNo);
if (user == null) {
user = userRegisterService.register(registerFrom, phoneNo, idNo, name, channelId, btRegisterChannelId);
......@@ -94,7 +95,7 @@ public class AppController implements IBaseController {
}
LoginProperties loginProperties = new LoginProperties("", 4, channelId, registerFrom, appChannel, merchant.getId(), merchant.getName());
AuthBean bean = sessionService.createSession(user, loginProperties);
LOGGER.info("第三方用户登录成功 [AppController] login --> loginFrom:{}, phoneNo:{},appChannel:{}", registerFrom, phoneNo, appChannel);
log.info("第三方用户登录成功 [AppController] login --> loginFrom:{}, phoneNo:{},appChannel:{}", registerFrom, phoneNo, appChannel);
return JsonResult.buildSuccessResult("登录成功", bean);
}
......@@ -128,7 +129,7 @@ public class AppController implements IBaseController {
if (!ValidationUtil.validatePhoneNo(phoneNo)) {
return JsonResult.buildErrorStateResult(USER_ERROR_OR_PASSWORD_ERROR, null);
}
LOGGER.info("第三方用户登录 [AppController] loginSuper --> loginFrom:{},phoneNo:{},appChannel:{},channelId:{},btRegisterChannelId:{} requestIp:{},idNo:{},name:{}", registerFrom, phoneNo, appChannel, channelId, btRegisterChannelId, IPUtil.getRemoteIP(request), idNo, name);
log.info("第三方用户登录 [AppController] loginSuper --> loginFrom:{},phoneNo:{},appChannel:{},channelId:{},btRegisterChannelId:{} requestIp:{},idNo:{},name:{}", registerFrom, phoneNo, appChannel, channelId, btRegisterChannelId, IpUtil.getRemoteIP(request), idNo, name);
User user = userService.findByPhoneInDb(phoneNo);
if (user == null) {
try {
......@@ -158,7 +159,7 @@ public class AppController implements IBaseController {
context.setCreatedFrom(registerFrom);
context.setAppChannel(appChannel);
loginInfo.setLoginContext(context);
LOGGER.info("第三方用户获取信息登录成功 [AppController] loginSuper --> loginFrom:{}, phoneNo:{},appChannel:{},channelId:{}", registerFrom, phoneNo, appChannel, channelId);
log.info("第三方用户获取信息登录成功 [AppController] loginSuper --> loginFrom:{}, phoneNo:{},appChannel:{},channelId:{}", registerFrom, phoneNo, appChannel, channelId);
return JsonResult.buildSuccessResult("登陆成功", loginInfo);
}
......@@ -187,7 +188,7 @@ public class AppController implements IBaseController {
if (!ValidationUtil.validatePhoneNo(phoneNo)) {
return JsonResult.buildErrorStateResult(USER_ERROR_OR_PASSWORD_ERROR, null);
}
LOGGER.info("第三方用户登录 [AppController] login2 --> loginFrom:{},channelId:{}, requestIp:{}", registerFrom, channelId, IPUtil.getRemoteIP(request));
log.info("第三方用户登录 [AppController] login2 --> loginFrom:{},channelId:{}, requestIp:{}", registerFrom, channelId, IpUtil.getRemoteIP(request));
User user = userService.findByPhoneInDb(phoneNo);
if (user == null) {
return JsonResult.buildErrorStateResult(USER_ERROR_OR_PASSWORD_ERROR, null);
......@@ -197,7 +198,7 @@ public class AppController implements IBaseController {
}
LoginProperties loginProperties = new LoginProperties("", 4, channelId, registerFrom, appChannel, null, "");
AuthBean bean = sessionService.createSession(user, loginProperties);
LOGGER.info("第三方用户登录成功 [AppController] login2 --> loginFrom:{}, phoneNo:{},appChannel:{}", registerFrom, phoneNo, appChannel);
log.info("第三方用户登录成功 [AppController] login2 --> loginFrom:{}, phoneNo:{},appChannel:{}", registerFrom, phoneNo, appChannel);
return JsonResult.buildSuccessResult("登录成功", bean);
}
......
......@@ -2,14 +2,15 @@ package cn.quantgroup.xyqb.controller.internal.user;
import cn.quantgroup.tech.db.DSType;
import cn.quantgroup.tech.db.TargetDataSource;
import cn.quantgroup.user.enums.Relation;
import cn.quantgroup.user.enums.*;
import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.aspect.accessable.IpValidator;
import cn.quantgroup.xyqb.controller.IBaseController;
import cn.quantgroup.xyqb.entity.*;
import cn.quantgroup.xyqb.entity.enumerate.*;
import cn.quantgroup.xyqb.exception.UserNotExistException;
import cn.quantgroup.xyqb.model.*;
import cn.quantgroup.xyqb.model.Gender;
import cn.quantgroup.xyqb.model.IdType;
import cn.quantgroup.xyqb.service.api.IUserApiService;
import cn.quantgroup.xyqb.service.auth.IIdCardService;
import cn.quantgroup.xyqb.service.merchant.IMerchantService;
......@@ -20,7 +21,7 @@ import cn.quantgroup.xyqb.service.user.*;
import cn.quantgroup.xyqb.service.user.vo.UserDetailVO;
import cn.quantgroup.xyqb.service.wechat.IWechatService;
import cn.quantgroup.xyqb.util.*;
import cn.quantgroup.xyqb.util.encrypt.MD5Util;
import cn.quantgroup.xyqb.util.encrypt.Md5Util;
import cn.quantgroup.xyqb.validator.ChineseName;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
......@@ -36,12 +37,10 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.http.HttpStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.validation.constraints.Min;
import java.io.UnsupportedEncodingException;
......@@ -88,14 +87,9 @@ public class InnerController implements IBaseController {
private ISmsService smsService;
@Autowired
private IUserRegisterService userRegisterService;
@Resource
private ApplicationEventPublisher applicationEventPublisher;
private static final char[] PWD_BASE = {
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
};
private static final String RESET_PWD_TOKEN = "ecf75c1f-2ccb-4661-8e4b-2874c0f45a2b";
private static final String MODIFY_CONTACT_TOKEN = "@qwsdedad131323213w!";
/**
......@@ -147,7 +141,7 @@ public class InnerController implements IBaseController {
if (md5Value == null) {
return JsonResult.buildErrorStateResult("参数错误", null);
}
if (md5Value.length() != 32) {
if (md5Value.length() != Constants.MD5_LENGTH) {
return JsonResult.buildErrorStateResult("参数长度有误", null);
}
......@@ -208,7 +202,7 @@ public class InnerController implements IBaseController {
}
List<Long> userIds = JSONObject.parseObject(userIdsString, new TypeReference<List<Long>>() {
});
if (!CollectionUtils.isEmpty(userIds) && userIds.size() <= 500) {
if (!CollectionUtils.isEmpty(userIds) && userIds.size() <= Constants.USER_ID_BATCH_SIZE) {
Map<Long, String> userIdAndPhoneMap = userService.findPhoneByIdsInDb(userIds);
return JsonResult.buildSuccessResult("", userIdAndPhoneMap);
} else {
......@@ -369,7 +363,7 @@ public class InnerController implements IBaseController {
}
Optional<UserFullInfo> userFullInfoOptional = userApiService.getUserFullInfoByPhone(phoneNo);
if (!userFullInfoOptional.isPresent()) {
log.warn("[findUserFullInfoByPhone]没有用户信息,phoneNo={}", MD5Util.build(phoneNo));
log.warn("[findUserFullInfoByPhone]没有用户信息,phoneNo={}", Md5Util.build(phoneNo));
return JsonResult.buildErrorStateResult(null, null);
}
return JsonResult.buildSuccessResult(null, userFullInfoOptional.get());
......@@ -411,7 +405,7 @@ public class InnerController implements IBaseController {
return JsonResult.buildErrorStateResult("userId为空", null);
}
if (StringUtils.isNotBlank(qq)) {
userDetailService.updateUserQQ(userId, qq);
userDetailService.updateUserQq(userId, qq);
}
if (StringUtils.isNotBlank(email)) {
userDetailService.updateUserEmail(userId, email);
......@@ -425,7 +419,7 @@ public class InnerController implements IBaseController {
if (StringUtils.isEmpty(qq) || userId == null || userId == 0L) {
return JsonResult.buildErrorStateResult("参数校验失败,qq或用户id为空", null);
}
userDetailService.updateUserQQ(userId, qq);
userDetailService.updateUserQq(userId, qq);
return JsonResult.buildSuccessResult(null, null);
}
......@@ -472,10 +466,9 @@ public class InnerController implements IBaseController {
@RequestParam(required = false) String phoneNo,
@RequestParam(required = false) Relation relation, String key,
@RequestParam String reason, HttpServletRequest request) {
if (!"@qwsdedad131323213w!".equals(key) || contactId == null) {
if (!MODIFY_CONTACT_TOKEN.equals(key) || contactId == null) {
return JsonResult.buildErrorStateResult("参数不合法", null);
}
if (StringUtils.isEmpty(name) && StringUtils.isEmpty(phoneNo)) {
return JsonResult.buildErrorStateResult("修改联系人修改条件不能都为空", null);
}
......@@ -495,7 +488,7 @@ public class InnerController implements IBaseController {
return JsonResult.buildErrorStateResult("修改联系人不存在", null);
}
contact = contactService.saveContact(name, phoneNo, relation, contact);
log.info("修改后联系人信息:{},修改原因:{},操作ip:{}", contact, reason, IPUtil.getRemoteIP(request));
log.info("修改后联系人信息:{},修改原因:{},操作ip:{}", contact, reason, IpUtil.getRemoteIP(request));
return JsonResult.buildSuccessResult("修改联系人成功", contact);
}
......@@ -708,7 +701,7 @@ public class InnerController implements IBaseController {
user = userService.findByUuidWithCache(uuid);
}
UserDetail userDetail = null;
if (!Objects.isNull(user) && !Objects.isNull(user.getId()) && user.getId() > 0) {
if (Objects.nonNull(user) && Objects.nonNull(user.getId()) && user.getId() > 0) {
userDetail = userDetailService.findByUserId(user.getId());
}
if (Objects.isNull(user)) {
......@@ -755,7 +748,7 @@ public class InnerController implements IBaseController {
UserExtInfo extInfo = userExtInfoService.findByUserId(user.getId());
if (Objects.nonNull(extInfo)) {
// 婚姻状态
bean.setMarryStatus(Optional.ofNullable(extInfo.getMarryStatus()).orElse(cn.quantgroup.user.enums.MaritalStatus.UNKNOWN).getDescription());
bean.setMarryStatus(Optional.ofNullable(extInfo.getMarryStatus()).orElse(cn.quantgroup.user.enums.MaritalStatus.UNKNOWN).getDesc());
// 受教育程度
bean.setEducationEnum(Optional.ofNullable(extInfo.getEducationEnum()).orElse(cn.quantgroup.user.enums.EducationEnum.UNKNOWN).getName());
// 职业
......@@ -785,9 +778,9 @@ public class InnerController implements IBaseController {
}
@ApiResponses({
@ApiResponse(code = 200, message = "Nice!", responseContainer = "UserAssociationModel = {Long id, String uuid, String phoneNo, String idNo, String name, String gender, String marryStatus, String educationEnum, String occupationEnum, String qq, Long registerFrom, Long merchantId, List<AddressModel> addressList, List<ContactModel> contactList}"),
@ApiResponse(code = 400, message = "Invalid params supplied", response = cn.quantgroup.xyqb.model.ApiResponse.class),
@ApiResponse(code = 404, message = "User not found", response = cn.quantgroup.xyqb.model.ApiResponse.class)
@ApiResponse(code = HttpStatus.SC_OK, message = "Nice!", responseContainer = "UserAssociationModel = {Long id, String uuid, String phoneNo, String idNo, String name, String gender, String marryStatus, String educationEnum, String occupationEnum, String qq, Long registerFrom, Long merchantId, List<AddressModel> addressList, List<ContactModel> contactList}"),
@ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Invalid params supplied", response = cn.quantgroup.xyqb.model.ApiResponse.class),
@ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "User not found", response = cn.quantgroup.xyqb.model.ApiResponse.class)
})
@ApiOperation(notes = "用户全量信息查询接口", value = "用户全量信息查询接口", nickname = "findUserAssociationModel")
@RequestMapping(path = "/user-association/search/userId", method = {RequestMethod.GET, RequestMethod.POST})
......@@ -856,37 +849,37 @@ public class InnerController implements IBaseController {
bean.setOccupationEnum(extInfo.getOccupationEnum().getName());
}
if (null == extInfo.getMarryStatus()) {
bean.setMarryStatus(cn.quantgroup.user.enums.MaritalStatus.UNKNOWN.getDescription());
bean.setMarryStatus(cn.quantgroup.user.enums.MaritalStatus.UNKNOWN.getDesc());
} else {
bean.setMarryStatus(extInfo.getMarryStatus().getDescription());
bean.setMarryStatus(extInfo.getMarryStatus().getDesc());
}
}
if (org.apache.commons.collections.CollectionUtils.isNotEmpty(contacts)) {
List<XContactInfo> userContacts = contacts2ContactRets(contacts);
List<ContactInfo> userContacts = contacts2ContactRets(contacts);
bean.setContractResults(userContacts);
}
}
return bean;
}
public static XContactInfo contact2ContactRet(Contact c) {
public static ContactInfo contact2ContactRet(Contact c) {
if (c == null) {
return null;
}
XContactInfo ret = new XContactInfo();
ContactInfo ret = new ContactInfo();
ret.setId(c.getId());
ret.setUserId(c.getUserId());
ret.setName(c.getName());
ret.setPhoneNo(c.getPhoneNo());
ret.setRelation(c.getRelation().getDescription());
ret.setRelation(c.getRelation().getDesc());
return ret;
}
public static List<XContactInfo> contacts2ContactRets(List<Contact> cs) {
public static List<ContactInfo> contacts2ContactRets(List<Contact> cs) {
if (org.apache.commons.collections.CollectionUtils.isEmpty(cs)) {
return Collections.emptyList();
}
List<XContactInfo> contactRets = new ArrayList<>();
List<ContactInfo> contactRets = new ArrayList<>();
for (Contact c : cs) {
contactRets.add(contact2ContactRet(c));
}
......@@ -985,8 +978,8 @@ public class InnerController implements IBaseController {
}
List<String> phones = JSONObject.parseObject(userPhones, new TypeReference<List<String>>() {
});
if (org.apache.commons.collections.CollectionUtils.isNotEmpty(phones)) {
if (!(phones.size() > MAX_SIZE)) {
if (!CollectionUtils.isEmpty(phones)) {
if (phones.size() <= MAX_SIZE) {
List<User> users = userService.findByPhones(phones);
if (org.apache.commons.collections.CollectionUtils.isNotEmpty(users)) {
return JsonResult.buildSuccessResult(null, users.stream().collect(Collectors.toMap(User::getPhoneNo, User::getId)));
......@@ -1012,16 +1005,14 @@ public class InnerController implements IBaseController {
@ApiOperation(value = "根据手机号批量查询UUID", httpMethod = "POST")
@TargetDataSource(type = DSType.SLAVE)
public JsonResult getUuidsByPhones(@RequestParam("userPhones") String userPhones) {
if (StringUtils.isBlank(userPhones)) {
return JsonResult.buildErrorStateResult("传入用户手机号不可为空", null);
}
List<String> phones = JSONObject.parseObject(userPhones, new TypeReference<List<String>>() {
});
if (org.apache.commons.collections.CollectionUtils.isNotEmpty(phones)) {
if (!(phones.size() > MAX_SIZE)) {
if (phones.size() <= MAX_SIZE) {
List<UserInfo> userInfos = userService.findUserInfosByPhones(phones);
if (org.apache.commons.collections.CollectionUtils.isNotEmpty(userInfos)) {
Map<String, UserInfo> userInfoMap = Maps.newHashMapWithExpectedSize(userInfos.size());
......@@ -1046,20 +1037,7 @@ public class InnerController implements IBaseController {
*/
@RequestMapping("/user/save_multi")
@ApiOperation(value = "保存多种用户信息", httpMethod = "POST")
public JsonResult saveMulti(
String registeredFrom,
String channelId,
String phoneNo,
String name,
String idNo,
String provinceCode,
String province,
String cityCode,
String city,
String districtCode,
String district,
String address,
String contacts, @RequestParam(defaultValue = "0", required = false) Long btRegisterChannelId) {
public JsonResult saveMulti(String registeredFrom, String channelId, String phoneNo, String name, String idNo, String provinceCode, String province, String cityCode, String city, String districtCode, String district, String address, String contacts, @RequestParam(defaultValue = "0", required = false) Long btRegisterChannelId) {
if (!NumberUtils.isDigits(registeredFrom)) {
return JsonResult.buildErrorStateResult("注册渠道异常.", null);
}
......@@ -1078,7 +1056,6 @@ public class InnerController implements IBaseController {
if (!isIdCard) {
return JsonResult.buildErrorStateResult("用户身份证号异常.", null);
}
Address addressObj = null;
//地址信息,同时存在provinceCode和address时才校验地址信息
if (StringUtils.isNotEmpty(provinceCode) && StringUtils.isNotEmpty(address)) {
......@@ -1103,7 +1080,6 @@ public class InnerController implements IBaseController {
if (StringUtils.isBlank(address)) {
return JsonResult.buildErrorStateResult("详细地址异常.", null);
}
addressObj = new Address();
addressObj.setProvinceCode(Long.valueOf(provinceCode));
addressObj.setProvince(province);
......@@ -1113,19 +1089,16 @@ public class InnerController implements IBaseController {
addressObj.setDistrict(district);
addressObj.setAddress(address);
}
channelId = MoreObjects.firstNonNull(channelId, "-1");
// 验证用户是否已存在
User user = userService.findByPhoneInDb(phoneNo);
if (null != user) {
return JsonResult.buildErrorStateResult("用户已存在,手机号被占用", null);
}
List<Contact> contactList = null;
// 目前对空白字符串和null值容错,因是api调用,不考虑对非法格式容错(会阻断注册)
if (StringUtils.isNotBlank(contacts)) {
contactList = JSONObject.parseObject(contacts, new TypeReference<List<Contact>>() {
});
contactList = JSONObject.parseObject(contacts, new TypeReference<List<Contact>>() {});
for (Contact contact : contactList) {
contact.setRelation(contact.getRelation() == null ? Relation.OTHER : contact.getRelation());
Tuple<String, Boolean> stringBooleanTuple = contact.validAndResult();
......@@ -1134,9 +1107,7 @@ public class InnerController implements IBaseController {
}
}
}
user = userRegisterService.register(Long.valueOf(registeredFrom), Long.valueOf(channelId), phoneNo, name, idNo, addressObj, contacts, contactList, btRegisterChannelId);
UserRet userRet = new UserRet(user);
return JsonResult.buildSuccessResult(null, userRet);
}
......@@ -1371,7 +1342,7 @@ public class InnerController implements IBaseController {
if (null != content) {
content = content.replaceAll(" ", "+");
}
String str = AESUtil.decryptAfterBase64Decode(content, Constants.AES_KEY);
String str = AesUtil.decryptAfterBase64Decode(content, Constants.AES_KEY);
if (null == str || !str.equals(phoneNo)) {
return JsonResult.buildErrorStateResult("解密有误", null);
}
......@@ -1405,7 +1376,7 @@ public class InnerController implements IBaseController {
@RequestMapping("/user/password/reset/{key}/{phone}")
public JsonResult resetPasswordByKey(@PathVariable("key") String key, @PathVariable("phone") String phone) {
log.info("密码重置请求,phone:[{}]", phone);
if (!"ecf75c1f-2ccb-4661-8e4b-2874c0f45a2b".equalsIgnoreCase(key)) {
if (!RESET_PWD_TOKEN.equalsIgnoreCase(key)) {
log.error("密码重置失败,key错误!@!,phone:[{}]", phone);
return JsonResult.buildErrorStateResult("用户密码重置失败.", HttpStatus.SC_UNAUTHORIZED);
}
......@@ -1432,9 +1403,9 @@ public class InnerController implements IBaseController {
if (null != content) {
content = content.replaceAll(" ", "+");
}
String str = AESUtil.decryptAfterBase64Decode(content, Constants.AES_KEY);
String str = AesUtil.decryptAfterBase64Decode(content, Constants.AES_KEY);
if (null == str || !str.equals(phoneNo)) {
log.info("[forbiddenUserOrNot][禁用或激活用户]:解密有误, phoneNo:{},aes:{}", phoneNo, AESUtil.encryptAndBase64Encode(phoneNo, Constants.AES_KEY));
log.info("[forbiddenUserOrNot][禁用或激活用户]:解密有误, phoneNo:{},aes:{}", phoneNo, AesUtil.encryptAndBase64Encode(phoneNo, Constants.AES_KEY));
return JsonResult.buildErrorStateResult("解密有误", null);
}
if (!ValidationUtil.validatePhoneNo(phoneNo)) {
......@@ -1472,7 +1443,7 @@ public class InnerController implements IBaseController {
if (null != content) {
content = content.replaceAll(" ", "+");
}
String str = AESUtil.decryptAfterBase64Decode(content, Constants.AES_KEY);
String str = AesUtil.decryptAfterBase64Decode(content, Constants.AES_KEY);
if (null == str || !str.equals(userId.toString())) {
return JsonResult.buildErrorStateResult("解密有误", null);
}
......
......@@ -41,15 +41,15 @@ public class UserApiController {
private ISmsService smsService;
@RequestMapping("/user/is_passwd_set")
public JsonResult isPasswordSet(String key, String phoneNo) {
if (!"abc1234".equals(key) || StringUtils.isEmpty(phoneNo)) {
public JsonResult isPasswordSet(String phoneNo) {
if (StringUtils.isEmpty(phoneNo)) {
return JsonResult.buildErrorStateResult(null, null);
}
User user = userService.findByPhoneWithCache(phoneNo);
if (null == user) {
return JsonResult.buildErrorStateResult(null, null);
}
if (StringUtils.length(user.getPassword()) == 32) {
if (StringUtils.length(user.getPassword()) == Constants.MD5_LENGTH) {
return JsonResult.buildSuccessResult(null, null);
}
return JsonResult.buildErrorStateResult(null, null, 2L);
......
......@@ -12,6 +12,7 @@ import cn.quantgroup.xyqb.service.user.*;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
......@@ -24,11 +25,11 @@ import java.sql.Timestamp;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* Created by 11 on 2017/3/22.
*/
@Slf4j
@RestController
@RequestMapping("/user/center")
public class UserCenterController {
......@@ -46,8 +47,6 @@ public class UserCenterController {
@Autowired
private IUserService userService;
private static final Logger LOGGER = LoggerFactory.getLogger(UserCenterController.class);
/**
* 根据用户手机号查询昵称.
*
......@@ -58,7 +57,7 @@ public class UserCenterController {
@ApiOperation(value = "查询昵称", notes = "查询用户昵称", httpMethod = "POST")
public JsonResult queryUserNick(String phoneNo) {
if (StringUtils.isEmpty(phoneNo)) {
LOGGER.error("手机号为空,phoneNo:{}", phoneNo);
log.error("手机号为空,phoneNo:{}", phoneNo);
return JsonResult.buildErrorStateResult("参数不合法", null);
}
Long userId = queryUserId(phoneNo);
......@@ -67,7 +66,7 @@ public class UserCenterController {
}
UserAttached userAttached = userCenterService.searchUserAttachedByUserId(userId);
if (null != userAttached) {
LOGGER.info("获取用户昵称:{}", userAttached.getNick());
log.info("获取用户昵称:{}", userAttached.getNick());
return JsonResult.buildSuccessResult(null, userAttached.getNick());
}
return JsonResult.buildSuccessResult(null, null);
......@@ -84,7 +83,7 @@ public class UserCenterController {
@ApiOperation(value = "保存昵称", notes = "保存用户昵称", httpMethod = "POST")
public JsonResult saveUserNick(String phoneNo, String nick) {
if (StringUtils.isEmpty(phoneNo)) {
LOGGER.error("手机号为空,phoneNo:{}", phoneNo);
log.error("手机号为空,phoneNo:{}", phoneNo);
return JsonResult.buildErrorStateResult("参数不合法", null);
}
Long userId = queryUserId(phoneNo);
......@@ -106,7 +105,7 @@ public class UserCenterController {
@ApiOperation(value = "保存头像", notes = "保存用户头像", httpMethod = "POST")
public JsonResult SaveUserAvatarAddr(String phoneNo, String avatarUrl) {
if (StringUtils.isBlank(avatarUrl) || StringUtils.isBlank(phoneNo)) {
LOGGER.error("参数不合法:avatarUrl:{}, phoneNo:{}", avatarUrl, phoneNo);
log.error("参数不合法:avatarUrl:{}, phoneNo:{}", avatarUrl, phoneNo);
return JsonResult.buildErrorStateResult("参数不合法", null);
}
Long userId = queryUserId(phoneNo);
......@@ -118,7 +117,7 @@ public class UserCenterController {
}
UserAttached userAttached = userCenterService.saveUserAvatar(userId, avatarUrl);
if (null == userAttached) {
LOGGER.error("保存用户头像昵称失败.");
log.error("保存用户头像昵称失败.");
return JsonResult.buildErrorStateResult("信息保存失败,请稍后再试.", null);
}
return JsonResult.buildSuccessResult("保存成功", userAttached);
......@@ -134,7 +133,7 @@ public class UserCenterController {
@ApiOperation(value = "查询用户是否实名认证", notes = "查询用户是否实名认证", httpMethod = "POST")
public JsonResult queryVerified(String phoneNo) {
if (StringUtils.isEmpty(phoneNo)) {
LOGGER.error("手机号为空,phoneNo:{}", phoneNo);
log.error("手机号为空,phoneNo:{}", phoneNo);
return JsonResult.buildErrorStateResult("参数不合法", null);
}
Long userId = queryUserId(phoneNo);
......@@ -160,7 +159,7 @@ public class UserCenterController {
@ApiOperation(value = "查询个人资料信息", notes = "查询个人资料信息", httpMethod = "POST")
public JsonResult personalData(String phoneNo) {
if (StringUtils.isBlank(phoneNo)) {
LOGGER.error("手机号为空,phoneNo:{}", phoneNo);
log.error("手机号为空,phoneNo:{}", phoneNo);
return JsonResult.buildErrorStateResult("参数不合法", null);
}
Long userId = queryUserId(phoneNo);
......@@ -202,27 +201,27 @@ public class UserCenterController {
@ApiOperation(value = "保存用户联系人", notes = "保存用户联系人", httpMethod = "POST")
public JsonResult saveUserContact(String phoneNo, String contactJson) {
if (StringUtils.isEmpty(phoneNo)) {
LOGGER.error("保存联系人,参数错误. phoneNo:{}", phoneNo);
log.error("保存联系人,参数错误. phoneNo:{}", phoneNo);
return JsonResult.buildErrorStateResult("参数有误.", null);
}
Long userId = queryUserId(phoneNo);
if (null == userId || userId == 0L) {
LOGGER.error("保存联系人,未获取到用户id. userId:{}", userId);
log.error("保存联系人,未获取到用户id. userId:{}", userId);
return JsonResult.buildErrorStateResult("该用户不存在", null);
}
if (StringUtils.isEmpty(contactJson)) {
LOGGER.error("保存联系人,联系人参数为空.contactJson:{}", contactJson);
log.error("保存联系人,联系人参数为空.contactJson:{}", contactJson);
return JsonResult.buildErrorStateResult(null, null);
}
List<Contact> contacts = JSONObject.parseObject(contactJson, new TypeReference<List<Contact>>() {
});
if (CollectionUtils.isEmpty(contacts)) {
LOGGER.info("联系人不能空");
log.info("联系人不能空");
return JsonResult.buildErrorStateResult(null, null);
}
for (Contact contact : contacts) {
if (!contact.valid()) {
LOGGER.info("用户手机号或姓名错误, phoneNo:{},name:{}", contact.getPhoneNo(), contact.getName());
log.info("用户手机号或姓名错误, phoneNo:{},name:{}", contact.getPhoneNo(), contact.getName());
return JsonResult.buildErrorStateResult(null, null);
}
}
......@@ -244,13 +243,13 @@ public class UserCenterController {
@ApiOperation(value = "保存用户地址", notes = "保存用户地址", httpMethod = "POST")
public JsonResult saveUserAddress(String phoneNo, String province, Long provinceCode, String city, Long cityCode, String address,
Long districtCode, String district) {
LOGGER.info("保存用户地址信息, phoneNo:{}, province:{}, provinceCode:{}, city:{}, cityCode:{},district:{}, address:{}", phoneNo, province, provinceCode, city, cityCode, district, address);
log.info("保存用户地址信息, phoneNo:{}, province:{}, provinceCode:{}, city:{}, cityCode:{},district:{}, address:{}", phoneNo, province, provinceCode, city, cityCode, district, address);
if (StringUtils.isEmpty(phoneNo) || provinceCode == null || cityCode == null || StringUtils.isBlank(address)) {
return JsonResult.buildErrorStateResult("参数错误", null);
}
Long userId = queryUserId(phoneNo);
if (null == userId || userId == 0L) {
LOGGER.error("保存联系人,未获取到用户id. userId:{}", userId);
log.error("保存联系人,未获取到用户id. userId:{}", userId);
return JsonResult.buildErrorStateResult("该用户不存在", null);
}
//查询用户是否有保存地址信息
......@@ -287,7 +286,7 @@ public class UserCenterController {
}
Long userId = queryUserId(phoneNo);
if (null == userId || userId == 0L) {
LOGGER.error("保存联系人,未获取到用户id. userId:{}", userId);
log.error("保存联系人,未获取到用户id. userId:{}", userId);
return JsonResult.buildErrorStateResult("该用户不存在", null);
}
Address address = addressService.findByUserId(userId);
......@@ -308,7 +307,7 @@ public class UserCenterController {
}
Long userId = queryUserId(phoneNo);
if (null == userId || userId == 0L) {
LOGGER.error("保存联系人,未获取到用户id. userId:{}", userId);
log.error("保存联系人,未获取到用户id. userId:{}", userId);
return JsonResult.buildErrorStateResult("该用户不存在", null);
}
List<Contact> contacts = contactService.findByUserId(userId, true);
......@@ -332,7 +331,7 @@ public class UserCenterController {
}
Long userId = queryUserId(phoneNo);
if (null == userId || userId == 0L) {
LOGGER.error("保存用户经济信息,未获取到用户id. userId:{}", userId);
log.error("保存用户经济信息,未获取到用户id. userId:{}", userId);
return JsonResult.buildErrorStateResult("该用户不存在", null);
}
//查询用户是否保存过.
......
......@@ -8,8 +8,6 @@ import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;
//import cn.quantgroup.xyqb.entity.enumerate.*;
/**
* Created by 11 on 2016/12/30.
*/
......
package cn.quantgroup.xyqb.entity.enumerate;
/**
* Created by 11 on 2016/12/30.
*/
public enum EducationEnum {
UNKNOWN("暂无"),
MASTER("硕士及以上"),
UNDER_GRADUATE("本科"),
JUNIOR_COLLEGE("大专"),
TECHNICAL_SECONDARY_SCHOOL("中专"),
TECHNICAL_SCHOOL("技校"),
HIGH_SCHOOL("高中"),
MIDDLE_SCHOOL("初中"),
PRIMARY_SCHOOL("小学"),
OTHER("其他");
private String name;
EducationEnum(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name;
}
}
package cn.quantgroup.xyqb.entity.enumerate;
/**
* Created by 11 on 2016/12/30.
*/
public enum IncomeEnum {
UNKNOWN("未知"),
CASH("现金计算"),
PAY_CARD("工资卡"),
CASH_AND_PAY_CARD("混合");
private String desc;
IncomeEnum(String desc) {
this.desc = desc;
}
}
\ No newline at end of file
package cn.quantgroup.xyqb.entity.enumerate;
/**
* Created by 11 on 2016/12/30.
*/
public enum IncomeRangeEnum {
UNKNOWN("暂无"),
BELOW_1000("小于1000元"),
BELOW_3000("1000至3000元"),
BELOW_5000("3000至5000元"),
BELOW_8000("5000至8000元"),
BELOW_10000("8000至10000元"),
BELOW_15000("10000至15000元"),
BELOW_20000("15000至20000元"),
ABOVE_20000("大于20000元");
private String desc;
IncomeRangeEnum(String desc) {
this.desc = desc;
}
}
package cn.quantgroup.xyqb.entity.enumerate;
/**
* Created by sunnan on 2016-11-24.
*/
public enum MaritalStatus {
UNKNOWN("未知"),
SINGLE("未婚"), // 1
MARRIED("已婚"), // 2
DIVORCED("离异"), // 3
WINDOWED("丧偶"), // 4
OTHER("其他");
String description;
MaritalStatus(String desc) {
description = desc;
}
public String getDescription() {
return description;
}
@Override
public String toString() {
String sb = "MaritalStatus{" + "description='" + description + '\'' +
'}';
return sb;
}
}
package cn.quantgroup.xyqb.entity.enumerate;
/**
* Created by 11 on 2016/12/30.
*/
public enum OccupationEnum {
UNKNOWN("暂未填写"),
WORKER("工人"),
TEACHER("教师"),
WHITE_COLLAR("白领"),
STUDENT("学生"),
CAREER_BUILDER("创业者"),
SELF_EMPLOYER("个体户"),
EMPLOYEE("公司职员"),
BISUNESS_ENTITY("企业法人"),
ONLINE_STORE_OWNER("网店店主"),
UNEMPLOYED("暂无职业"),
OTHER("其他");
private String name;
OccupationEnum(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name;
}
}
package cn.quantgroup.xyqb.entity.enumerate;
/**
* Created by Miraculous on 2017/1/3.
*/
public enum Relation {
PARENT("父母"),
CHILDREN("子女"),
BROTHER("兄弟姐妹"),
COLLEAGUE("同事"),
CLASSMATE("同学"),
FRIEND("朋友"),
SPOUSE("夫妻"),
SELF("本人"),
OTHER("其他");
String description;
Relation(String desc) {
description = desc;
}
public String getDescription() {
return description;
}
@Override
public String toString() {
String sb = "Relation{" + "description='" + description + '\'' +
'}';
return sb;
}
}
......@@ -13,7 +13,7 @@ import org.springframework.stereotype.Component;
* @author ag
*/
@Component
public class MQRegisteredEventListener implements ApplicationListener<RegisterEvent> {
public class MqRegisteredEventListener implements ApplicationListener<RegisterEvent> {
@Override
public void onApplicationEvent(RegisterEvent event) {
......
......@@ -3,7 +3,7 @@ package cn.quantgroup.xyqb.event;
import cn.quantgroup.xyqb.entity.UserHashMapping;
import cn.quantgroup.xyqb.model.UserRegisterParam;
import cn.quantgroup.xyqb.repository.IUserHashMappingRepository;
import cn.quantgroup.xyqb.util.encrypt.MD5Util;
import cn.quantgroup.xyqb.util.encrypt.Md5Util;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -35,14 +35,14 @@ public class PhoneHashEventListener implements ApplicationListener<RegisterEvent
userHashMapping = new UserHashMapping(userId);
}
//无论如何都更新手机号
String phoneNoMd5 = MD5Util.build(phoneNo);
String phoneNoMd5 = Md5Util.build(phoneNo);
userHashMapping.setPhoneNoMd5(phoneNoMd5);
String idNo = userRegisterParam.getIdNo();
//如果有身份证号. 更新一下
if (StringUtils.isNotEmpty(idNo)) {
idNo = idNo.toUpperCase();
userHashMapping.setIdNoMd5(MD5Util.build(idNo));
userHashMapping.setIdNoMd5(Md5Util.build(idNo));
}
try {
......
......@@ -3,7 +3,7 @@ package cn.quantgroup.xyqb.event;
import cn.quantgroup.xyqb.entity.UserDetail;
import cn.quantgroup.xyqb.entity.UserHashMapping;
import cn.quantgroup.xyqb.repository.IUserHashMappingRepository;
import cn.quantgroup.xyqb.util.encrypt.MD5Util;
import cn.quantgroup.xyqb.util.encrypt.Md5Util;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -34,14 +34,14 @@ public class UserDetailHashEventListener implements ApplicationListener<UserDeta
if (userHashMapping == null) {
userHashMapping = new UserHashMapping(userDetail.getUserId());
String phoneNo = userDetail.getPhoneNo();
userHashMapping.setPhoneNoMd5(MD5Util.build(phoneNo));
userHashMapping.setPhoneNoMd5(Md5Util.build(phoneNo));
}
String idNoMd5 = userHashMapping.getIdNoMd5();
String idNo = userDetail.getIdNo().toUpperCase();
String idNoMd5New = MD5Util.build(idNo);
String idNoMd5New = Md5Util.build(idNo);
//新旧相同, 直接跳过
if (StringUtils.equals(idNoMd5, idNoMd5New)) {
......
package cn.quantgroup.xyqb.exception;
/**
* @author renwc
* @time 2019-10-30
*/
public class UserQueryLogException extends RuntimeException {
private static final long serialVersionUID = -1L;
public UserQueryLogException(String msg, Throwable t) {
super(msg, t);
}
public UserQueryLogException(String msg) {
super(msg);
}
}
......@@ -6,6 +6,7 @@ import cn.quantgroup.xyqb.model.session.SessionStruct;
import cn.quantgroup.xyqb.service.session.ISessionService;
import cn.quantgroup.xyqb.session.XyqbSessionContextHolder;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
......@@ -49,7 +50,7 @@ public class RequestFilter implements Filter {
SessionStruct sessionStruct = XyqbSessionContextHolder.getXSessionFromRedis();
if (Objects.isNull(sessionStruct)) {
/* 如果没有获取到session信息则返回错误信息 */
response.setStatus(401);
response.setStatus(HttpStatus.SC_UNAUTHORIZED);
response.setHeader("Content-Type", "application/json;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.print(UNAUTH_RESULT);
......
......@@ -26,9 +26,9 @@ public class ApiResponse {
public static final int OK = 4;
public static final int TOO_BUSY = 5;
int code;
String type;
String message;
private int code;
private String type;
private String message;
public ApiResponse(){}
......
......@@ -8,7 +8,7 @@ import java.io.Serializable;
* Created by xuran on 2017/8/1.
*/
@Data
public class XContactInfo implements Serializable {
public class ContactInfo implements Serializable {
private static final long serialVersionUID = -1L;
private Long id;
private Long userId;
......
......@@ -32,7 +32,7 @@ public class ContactModel implements Serializable {
ContactModel model = new ContactModel();
model.setName(entity.getName());
model.setPhoneNo(entity.getPhoneNo());
model.setRelationName(Optional.ofNullable(entity.getRelation()).orElse(Relation.OTHER).getDescription());
model.setRelationName(Optional.ofNullable(entity.getRelation()).orElse(Relation.OTHER).getDesc());
model.setRelation(entity.getRelation().name());
return model;
}
......
......@@ -9,6 +9,7 @@ import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
/**
* Created by Miraculous on 2017/2/14.
......@@ -36,8 +37,12 @@ public class ContactRet implements Serializable {
ret.setName(c.getName());
ret.setPhoneNo(c.getPhoneNo());
ret.setRelation(c.getRelation());
if(Objects.nonNull(c.getCreatedAt())){
ret.setCreatedAt(c.getCreatedAt().getTime());
}
if(Objects.nonNull(c.getUpdateAt())) {
ret.setUpdateAt(c.getUpdateAt().getTime());
}
return ret;
}
......
......@@ -25,10 +25,10 @@ public class JsonResult<T> implements Serializable {
private String msg = "";
// 0成功,1失败
private String code = "0000";
private String code = Constants.SUCCESS_CODE;
// 业务错误码
private String businessCode = "0000";
private String businessCode = Constants.SUCCESS_CODE;
private T data = null;
......
......@@ -24,5 +24,5 @@ public class UserAssociation implements Serializable {
private String district;
private String address;
private String qq;
private List<XContactInfo> contractResults;
private List<ContactInfo> contractResults;
}
package cn.quantgroup.xyqb.model;
import cn.quantgroup.user.enums.EducationEnum;
import cn.quantgroup.user.enums.IncomeEnum;
import cn.quantgroup.user.enums.IncomeRangeEnum;
import cn.quantgroup.user.enums.OccupationEnum;
import cn.quantgroup.xyqb.entity.Address;
import cn.quantgroup.xyqb.entity.Contact;
import lombok.Data;
import javax.persistence.Column;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
......
......@@ -3,6 +3,7 @@ package cn.quantgroup.xyqb.model;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.UserDetail;
import lombok.Data;
import org.springframework.util.Assert;
import java.io.Serializable;
......@@ -25,7 +26,7 @@ public class UserInfo implements Serializable {
private String IdNo;
public UserInfo(User user, UserDetail userDetail) {
assert user != null;
Assert.notNull(user, "User信息无效");
this.id = user.getId();
this.phoneNo = user.getPhoneNo();
this.registerFrom = user.getRegisteredFrom();
......
......@@ -3,6 +3,7 @@ package cn.quantgroup.xyqb.model;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.UserDetail;
import lombok.Data;
import org.springframework.util.Assert;
import java.io.Serializable;
import java.util.Optional;
......@@ -35,7 +36,7 @@ public class UserModel implements Serializable {
}
public UserModel(User user, UserDetail userDetail) {
assert user != null;
Assert.notNull(user, "User信息无效");
this.id = user.getId();
this.phoneNo = user.getPhoneNo();
this.registerFrom = user.getRegisteredFrom();
......
......@@ -20,17 +20,17 @@ public interface IUserDetailRepository extends JpaRepository<UserDetail, Long>,
UserDetail findByPhoneNo(String phone);
@Transactional
@Transactional(rollbackFor = Exception.class)
@Modifying
@Query(value = "update user_detail set qq = ?1 where user_id = ?2", nativeQuery = true)
void updateUserQQ(String qq, Long userId);
void updateUserQq(String qq, Long userId);
@Transactional
@Transactional(rollbackFor = Exception.class)
@Modifying
@Query(value = "update user_detail set email = ?1 where user_id = ?2", nativeQuery = true)
void updateUserEmail(String email, Long userId);
@Transactional
@Transactional(rollbackFor = Exception.class)
@Modifying
@Query(value = "update user_detail set gender = ?1 where user_id = ?2", nativeQuery = true)
void updateGender(int gender, Long userId);
......@@ -42,11 +42,10 @@ public interface IUserDetailRepository extends JpaRepository<UserDetail, Long>,
*
* @return
*/
@Modifying
@Query(value = "select * from user_detail where gender!=1 and gender!=2 and id_no is not null", nativeQuery = true)
List<UserDetail> selectUserDetailsBy();
@Transactional
@Transactional(rollbackFor = Exception.class)
@Modifying
@Query(value = "update user_detail set name=?1,id_no=?2,gender=?3 where phone_no=?4", nativeQuery = true)
int updateNameAndIdNoByPhoneNo(String name, String idNo, int gender, String phoneNo);
......
......@@ -14,7 +14,7 @@ import java.util.List;
*/
public interface IUserQueryLogRepository extends JpaRepository<UserQueryLog, Long> {
@Transactional
@Transactional(rollbackFor = Exception.class)
@Modifying
@Query(nativeQuery = true, value = "select * from user_query_log ul where created_At between ?1 and ?2 limit ?3 ,?4 ")
List<UserQueryLog> findQueryLogCreatedAt(Date beginDate, Date endDate, Integer pageId, Integer pageSize);
......
......@@ -42,7 +42,7 @@ public interface IUserRepository extends JpaRepository<User, Long>, JpaSpecifica
@Query(value = "select * from user where created_at>=?1 and created_at<?2 ", nativeQuery = true)
List<User> findRegisterUserByTime(String beginTime, String endTime);
@Transactional
@Transactional(rollbackFor = Exception.class)
@Modifying
@Query(value = "update user set enable=?1 where phone_no=?2", nativeQuery = true)
int forbiddenUser(Boolean enable, String phoneNo);
......
......@@ -28,7 +28,7 @@ public interface IWeChatUserRepository extends JpaRepository<WechatUserInfo, Lon
* @param userId
* @return
*/
@Transactional
@Transactional(rollbackFor = Exception.class)
@Modifying
@Query(value = "update wechat_userinfo set user_id=null,phone_no='*' where user_id=?1", nativeQuery = true)
int dissociateByUserId(Long userId);
......@@ -41,7 +41,7 @@ public interface IWeChatUserRepository extends JpaRepository<WechatUserInfo, Lon
* @param openId - 微信标识
* @return 记录更新行数
*/
@Transactional
@Transactional(rollbackFor = Exception.class)
@Modifying
@Query(value = "update wechat_userinfo set user_id=?1,phone_no=?2 where open_id=?3 and user_id is null", nativeQuery = true)
int relateUser(Long userId, String phoneNo, String openId);
......@@ -54,7 +54,7 @@ public interface IWeChatUserRepository extends JpaRepository<WechatUserInfo, Lon
* @param userId - 用户标识
* @return 记录更新行数
*/
@Transactional(propagation = MANDATORY)
@Transactional(propagation = MANDATORY, rollbackFor = Exception.class)
@Modifying
@Query(value = "update wechat_userinfo set user_id=null,phone_no='*' where open_id=?1 or user_id=?2", nativeQuery = true)
int dissociateUser(String openId, Long userId);
......
package cn.quantgroup.xyqb.service.auth.impl;
import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.exception.IdCardException;
import cn.quantgroup.xyqb.model.Gender;
import cn.quantgroup.xyqb.model.IdCardInfo;
......@@ -80,10 +81,10 @@ public class IdCardServiceImpl implements IIdCardService {
return false;
}
String actualId;
if (idCardStr.length() == 18) {
actualId = idCardStr.substring(0, 17);
} else if (idCardStr.length() == 15) {
actualId = idCardStr.substring(0, 6) + "19" + idCardStr.substring(6, 15);
if (idCardStr.length() == Constants.ID_NO_STANDARD_LENGTH) {
actualId = idCardStr.substring(0, Constants.ID_NO_CHECK_LENGTH);
} else if (idCardStr.length() == Constants.ID_NO_OLD_LENGTH) {
actualId = idCardStr.substring(0, 6) + "19" + idCardStr.substring(6, Constants.ID_NO_OLD_LENGTH);
} else {
return false;
}
......@@ -104,26 +105,26 @@ public class IdCardServiceImpl implements IIdCardService {
}
GregorianCalendar gc = new GregorianCalendar();
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(dateStr);
if (gc.get(Calendar.YEAR) - year > 150 || gc.getTime().getTime() - date.getTime() < 0) {
if (gc.get(Calendar.YEAR) - year > Constants.AGE_MAX || gc.getTime().getTime() - date.getTime() < 0) {
return false;
}
if (month < 1 || month > 12) {
if (month < Constants.MONTH_NO_MIN || month > Constants.MONTH_NO_MAX) {
return false;
}
if (day < 1 || day > 31) {
if (day < Constants.DAY_NO_MIN || day > Constants.DAY_NO_MAX) {
return false;
}
String areaCode = actualId.substring(0, 2);
String areaCode = actualId.substring(0, Constants.ID_NO_AREA_CODE_LENGTH);
if (!areaCodes.containsKey(areaCode)) {
return false;
}
// 校验码
int acurateCode = 0;
for (int i = 0; i < 17; ++i) {
for (int i = 0; i < Constants.ID_NO_CHECK_LENGTH; ++i) {
acurateCode += ((actualId.charAt(i) - '0') * wi[i]);
}
actualId += validCodes[acurateCode % 11];
return idCardStr.length() != 18 || actualId.equalsIgnoreCase(idCardStr);
actualId += validCodes[acurateCode % Constants.ID_NO_CHECK_MASK];
return idCardStr.length() != Constants.ID_NO_STANDARD_LENGTH || actualId.equalsIgnoreCase(idCardStr);
}
@Override
......@@ -135,11 +136,11 @@ public class IdCardServiceImpl implements IIdCardService {
}
String actualId;
String lastChar;
if (idCardStr.length() == 18) {
actualId = idCardStr.substring(0, 17);
lastChar = idCardStr.substring(16, 17).toLowerCase();
} else if (idCardStr.length() == 15) {
actualId = idCardStr.substring(0, 6) + "19" + idCardStr.substring(6, 15);
if (idCardStr.length() == Constants.ID_NO_STANDARD_LENGTH) {
actualId = idCardStr.substring(0, Constants.ID_NO_CHECK_LENGTH);
lastChar = idCardStr.substring(16, Constants.ID_NO_CHECK_LENGTH).toLowerCase();
} else if (idCardStr.length() == Constants.ID_NO_OLD_LENGTH) {
actualId = idCardStr.substring(0, 6) + "19" + idCardStr.substring(6, Constants.ID_NO_OLD_LENGTH);
lastChar = idCardStr.substring(13, 14).toLowerCase();
} else {
return cardInfo;
......@@ -168,28 +169,28 @@ public class IdCardServiceImpl implements IIdCardService {
return null;
}
if (gc.get(Calendar.YEAR) - year > 150 || gc.getTime().getTime() - date.getTime() < 0) {
if (gc.get(Calendar.YEAR) - year > Constants.AGE_MAX || gc.getTime().getTime() - date.getTime() < 0) {
return cardInfo;
}
if (month < 1 || month > 12) {
if (month < Constants.MONTH_NO_MIN || month > Constants.MONTH_NO_MAX) {
return cardInfo;
}
if (day < 1 || day > 31) {
if (day < Constants.DAY_NO_MIN || day > Constants.DAY_NO_MAX) {
return cardInfo;
}
String areaCode = actualId.substring(0, 2);
String areaCode = actualId.substring(0, Constants.ID_NO_AREA_CODE_LENGTH);
if (!areaCodes.containsKey(areaCode)) {
return cardInfo;
}
// 校验码
int checkCode = 0;
for (int i = 0; i < 17; ++i) {
for (int i = 0; i < Constants.ID_NO_CHECK_LENGTH; ++i) {
checkCode += ((actualId.charAt(i) - '0') * wi[i]);
}
actualId += validCodes[checkCode % 11];
actualId += validCodes[checkCode % Constants.ID_NO_CHECK_MASK];
if (idCardStr.length() == 18) {
if (idCardStr.length() == Constants.ID_NO_STANDARD_LENGTH) {
if (!actualId.equalsIgnoreCase(idCardStr)) {
return cardInfo;
}
......@@ -197,7 +198,7 @@ public class IdCardServiceImpl implements IIdCardService {
cardInfo.setIsValid(true);
// 判断男女
if (Integer.parseInt(lastChar) % 2 == 0) {
if (Integer.parseInt(lastChar) % Constants.GENDER_MASK == 0) {
cardInfo.setGender(Gender.FEMALE);
} else {
cardInfo.setGender(Gender.MALE);
......@@ -215,11 +216,11 @@ public class IdCardServiceImpl implements IIdCardService {
}
String actualId;
String lastValue;
if (idCardStr.length() == 18) {
actualId = idCardStr.substring(0, 17);
lastValue = idCardStr.substring(16, 17).toLowerCase();
} else if (idCardStr.length() == 15) {
actualId = idCardStr.substring(0, 6) + "19" + idCardStr.substring(6, 15);
if (idCardStr.length() == Constants.ID_NO_STANDARD_LENGTH) {
actualId = idCardStr.substring(0, Constants.ID_NO_CHECK_LENGTH);
lastValue = idCardStr.substring(16, Constants.ID_NO_CHECK_LENGTH).toLowerCase();
} else if (idCardStr.length() == Constants.ID_NO_OLD_LENGTH) {
actualId = idCardStr.substring(0, 6) + "19" + idCardStr.substring(6, Constants.ID_NO_OLD_LENGTH);
lastValue = idCardStr.substring(13, 14).toLowerCase();
} else {
throw new IdCardException("身份证号码必须为18位或15位");
......@@ -228,7 +229,7 @@ public class IdCardServiceImpl implements IIdCardService {
throw new IdCardException("身份证格式不正确");
}
String yearStr = actualId.substring(6, 10);
String monthStr = actualId.substring(10, 12);
String monthStr = actualId.substring(10, Constants.MONTH_NO_MAX);
String dayStr = actualId.substring(12, 14);
int year = Integer.parseInt(yearStr);
int month = Integer.parseInt(monthStr);
......@@ -240,28 +241,28 @@ public class IdCardServiceImpl implements IIdCardService {
}
GregorianCalendar gc = new GregorianCalendar();
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(dateStr);
if (gc.get(Calendar.YEAR) - year > 150 || gc.getTime().getTime() - date.getTime() < 0) {
if (gc.get(Calendar.YEAR) - year > Constants.AGE_MAX || gc.getTime().getTime() - date.getTime() < 0) {
throw new IdCardException("身份证出生年份不正确");
}
if (month < 1 || month > 12) {
if (month < Constants.MONTH_NO_MIN || month > Constants.MONTH_NO_MAX) {
throw new IdCardException("身份证出生月份不正确");
}
if (day < 1 || day > 31) {
if (day < Constants.DAY_NO_MIN || day > Constants.DAY_NO_MAX) {
throw new IdCardException("身份证出生日期不正确");
}
String areaCode = actualId.substring(0, 2);
String areaCode = actualId.substring(0, Constants.ID_NO_AREA_CODE_LENGTH);
if (!areaCodes.containsKey(areaCode)) {
throw new IdCardException("身份证省份不正确");
}
// 校验码
int checkCode = 0;
for (int i = 0; i < 17; ++i) {
for (int i = 0; i < Constants.ID_NO_CHECK_LENGTH; ++i) {
checkCode += ((actualId.charAt(i) - '0') * wi[i]);
}
actualId += validCodes[checkCode % 11];
actualId += validCodes[checkCode % Constants.ID_NO_CHECK_MASK];
if (idCardStr.length() == 18) {
if (idCardStr.length() == Constants.ID_NO_STANDARD_LENGTH) {
if (!actualId.equalsIgnoreCase(idCardStr)) {
throw new IdCardException("身份证校验不正确");
}
......@@ -270,7 +271,7 @@ public class IdCardServiceImpl implements IIdCardService {
IdCardInfo cardInfo = new IdCardInfo();
cardInfo.setIsValid(true);
// 判断男女
if (Integer.parseInt(lastValue) % 2 == 0) {
if (Integer.parseInt(lastValue) % Constants.GENDER_MASK == 0) {
cardInfo.setGender(Gender.FEMALE);
} else {
cardInfo.setGender(Gender.MALE);
......
......@@ -7,6 +7,7 @@ import cn.quantgroup.xyqb.repository.IUserAuthorizedRepository;
import cn.quantgroup.xyqb.repository.IUserRepository;
import cn.quantgroup.xyqb.service.auth.IIdCardService;
import cn.quantgroup.xyqb.service.auth.IUserAuthorizedService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -21,9 +22,9 @@ import java.util.Objects;
/**
* @author xufei on 2018/1/5.
*/
@Slf4j
@Service
public class UserAuthorizedServiceImpl implements IUserAuthorizedService {
private static final Logger LOGGER = LoggerFactory.getLogger(UserAuthorizedServiceImpl.class);
@Resource
private IIdCardService iIdCardService;
......@@ -41,12 +42,12 @@ public class UserAuthorizedServiceImpl implements IUserAuthorizedService {
return Boolean.FALSE;
}
} catch (ParseException e) {
LOGGER.error("[hasUserAuthorized]参数异常e:{}", e);
log.error("[hasUserAuthorized]参数异常e:{}", e);
return Boolean.FALSE;
}
UserAuthorized userAuthorized = userAuthorizedRepository.findByIdNo(idNo);
LOGGER.info("[hasUserAuthorized]查询实名账户userAuthorized:{}", userAuthorized);
log.info("[hasUserAuthorized]查询实名账户userAuthorized:{}", userAuthorized);
return null != userAuthorized;
}
......@@ -86,10 +87,10 @@ public class UserAuthorizedServiceImpl implements IUserAuthorizedService {
try {
userAuthorized = userAuthorizedRepository.save(userAuthorized);
LOGGER.info("[createUserAuthorized]创建实名账户成功,userAuthorized:{}", userAuthorized);
log.info("[createUserAuthorized]创建实名账户成功,userAuthorized:{}", userAuthorized);
return userAuthorized;
} catch (Exception e) {
LOGGER.error("[createUserAuthorized]创建实名账户异常e:{}", e);
log.error("[createUserAuthorized]创建实名账户异常e:{}", e);
return null;
}
}
......@@ -102,7 +103,7 @@ public class UserAuthorizedServiceImpl implements IUserAuthorizedService {
}
UserAuthorized userAuthorized = userAuthorizedRepository.findByUserUuid(userUuid);
LOGGER.info("[getUserAuthorizedId]获取实名账户的id,userUuid:{},userAuthorized:{}", userUuid, userAuthorized);
log.info("[getUserAuthorizedId]获取实名账户的id,userUuid:{},userAuthorized:{}", userUuid, userAuthorized);
if (null == userAuthorized) {
return null;
}
......
package cn.quantgroup.xyqb.service.captcha;
import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.util.encrypt.Md5Util;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpStatus;
import org.json.JSONException;
import org.json.JSONObject;
......@@ -9,8 +12,6 @@ import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
......@@ -22,7 +23,6 @@ import java.util.Objects;
*/
@Slf4j
public class GeetestLib {
protected final String verName = "4.0";
private String apiUrl;
......@@ -147,7 +147,7 @@ public class GeetestLib {
gtlog("GET_URL:" + getUrl + param);
String result_str = readContentFromGet(getUrl + param);
if (Objects.equals(result_str, "fail")) {
if (Objects.equals(result_str, Constants.CHECK_FAIL)) {
gtlog("gtServer register challenge failed");
return 0;
......@@ -160,9 +160,9 @@ public class GeetestLib {
gtlog("return_challenge:" + return_challenge);
if (return_challenge.length() == 32) {
if (return_challenge.length() == Constants.MD5_LENGTH) {
this.responseStr = this.getSuccessPreProcessRes(this.md5Encode(return_challenge + this.privateKey));
this.responseStr = this.getSuccessPreProcessRes(Md5Util.build(return_challenge + this.privateKey));
return 1;
......@@ -278,14 +278,14 @@ public class GeetestLib {
response = readContentFromPost(postUrl, param);
gtlog("response: " + response);
} catch (Exception e) {
e.printStackTrace();
log.error("向gt-server进行二次验证", e);
}
String return_seccode = "";
try {
JSONObject return_map = new JSONObject(response);
return_seccode = return_map.getString("seccode");
gtlog("md5: " + md5Encode(return_seccode));
if (return_seccode.equals(md5Encode(seccode))) {
gtlog("md5: " + Md5Util.build(return_seccode));
if (return_seccode.equals(Md5Util.build(seccode))) {
return 1;
} else {
return 0;
......@@ -328,7 +328,7 @@ public class GeetestLib {
}
protected boolean checkResultByPrivate(String challenge, String validate) {
String encodeStr = md5Encode(privateKey + "geetest" + challenge);
String encodeStr = Md5Util.build(privateKey + "geetest" + challenge);
return validate.equals(encodeStr);
}
......@@ -344,14 +344,15 @@ public class GeetestLib {
URL getUrl = new URL(URL);
HttpURLConnection connection = (HttpURLConnection) getUrl
.openConnection();
connection.setConnectTimeout(2000);// 设置连接主机超时(单位:毫秒)
connection.setReadTimeout(2000);// 设置从主机读取数据超时(单位:毫秒)
// 设置连接主机超时(单位:毫秒)
connection.setConnectTimeout(2000);
// 设置从主机读取数据超时(单位:毫秒)
connection.setReadTimeout(2000);
// 建立与服务器的连接,并未发送数据
connection.connect();
if (connection.getResponseCode() == 200) {
if (connection.getResponseCode() == HttpStatus.SC_OK) {
// 发送数据到服务器并使用Reader读取返回的数据
StringBuilder sBuffer = new StringBuilder();
......@@ -362,12 +363,12 @@ public class GeetestLib {
sBuffer.append(new String(buf, 0, n, "UTF-8"));
}
inStream.close();
connection.disconnect();// 断开连接
// 断开连接
connection.disconnect();
return sBuffer.toString();
} else {
return "fail";
return Constants.CHECK_FAIL;
}
}
......@@ -385,9 +386,10 @@ public class GeetestLib {
URL postUrl = new URL(URL);
HttpURLConnection connection = (HttpURLConnection) postUrl
.openConnection();
connection.setConnectTimeout(2000);// 设置连接主机超时(单位:毫秒)
connection.setReadTimeout(2000);// 设置从主机读取数据超时(单位:毫秒)
// 设置连接主机超时(单位:毫秒)
connection.setConnectTimeout(2000);
// 设置从主机读取数据超时(单位:毫秒)
connection.setReadTimeout(2000);
connection.setRequestMethod("POST");
connection.setDoInput(true);
connection.setDoOutput(true);
......@@ -401,7 +403,7 @@ public class GeetestLib {
outputStreamWriter.flush();
outputStreamWriter.close();
if (connection.getResponseCode() == 200) {
if (connection.getResponseCode() == HttpStatus.SC_OK) {
// 发送数据到服务器并使用Reader读取返回的数据
StringBuilder sBuffer = new StringBuilder();
......@@ -412,47 +414,14 @@ public class GeetestLib {
sBuffer.append(new String(buf, 0, n, "UTF-8"));
}
inStream.close();
connection.disconnect();// 断开连接
// 断开连接
connection.disconnect();
return sBuffer.toString();
} else {
return "fail";
}
}
/**
* md5 加密
*
* @param plainText
* @return
* @time 2014年7月10日 下午3:30:01
*/
private String md5Encode(String plainText) {
String re_md5 = "";
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(plainText.getBytes());
byte b[] = md.digest();
int i;
StringBuilder buf = new StringBuilder();
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0) {
i += 256;
}
if (i < 16) {
buf.append("0");
}
buf.append(Integer.toHexString(i));
}
re_md5 = buf.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return Constants.CHECK_FAIL;
}
return re_md5;
}
}
......@@ -2,8 +2,9 @@ package cn.quantgroup.xyqb.service.http.impl;
import cn.quantgroup.tech.brave.service.ITechHttpClient;
import cn.quantgroup.xyqb.service.http.IHttpService;
import cn.quantgroup.xyqb.util.Utils;
import cn.quantgroup.xyqb.util.PasswordUtil;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.Charsets;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
......@@ -52,11 +53,10 @@ import java.util.*;
* @author mengfan.feng
* @time 2015-08-13 10:19
*/
@Slf4j
@Service
public class HttpServiceImpl implements IHttpService {
private static final Logger LOGGER = LoggerFactory.getLogger(HttpServiceImpl.class);
private static final int TIME_OUT = 60 * 1000; // 超时时间
//注入brave-spring-boot-starter提供的techHttpClient
@Resource
......@@ -103,12 +103,12 @@ public class HttpServiceImpl implements IHttpService {
*/
private String doHttp(RequestBuilder requestBuilder, String uri, Map<String, String> headers, Map<String, String> parameters) {
if (StringUtils.isEmpty(uri)) {
LOGGER.info("uri cannot be empty, uri:{}", uri);
log.info("uri cannot be empty, uri:{}", uri);
return null;
}
String method = requestBuilder.getMethod();
LOGGER.info("{}, uri:{}, headers:{}, parameters:{}", method, uri, headers, StringUtils.substring(Utils.safeMap2Str(parameters), 0, 200));
log.info("{}, uri:{}, headers:{}, parameters:{}", method, uri, headers, StringUtils.substring(PasswordUtil.filterPasswordToString(parameters), 0, 200));
HttpEntity httpEntity = null;
CloseableHttpResponse httpResponse = null;
try {
......@@ -129,11 +129,11 @@ public class HttpServiceImpl implements IHttpService {
httpEntity = httpResponse.getEntity();
String response = EntityUtils.toString(httpEntity, Charsets.UTF_8);
LOGGER.info("{}, uri:{}, response:{}", method, uri, StringUtils.substring(response, 0, 200));
log.info("{}, uri:{}, response:{}", method, uri, StringUtils.substring(response, 0, 200));
return response;
} catch (Exception e) {
LOGGER.info("{}, uri:{}, headers:{}, parameters:{}", method, uri, headers, StringUtils.substring(Utils.safeMap2Str(parameters), 0, 200), e);
log.info("{}, uri:{}, headers:{}, parameters:{}", method, uri, headers, StringUtils.substring(PasswordUtil.filterPasswordToString(parameters), 0, 200), e);
return null;
} finally {
EntityUtils.consumeQuietly(httpEntity);
......@@ -142,7 +142,7 @@ public class HttpServiceImpl implements IHttpService {
httpResponse.close();
}
} catch (Exception e) {
LOGGER.error("{}, httpResponse.close error", method, e);
log.error("{}, httpResponse.close error", method, e);
}
}
}
......
......@@ -2,6 +2,7 @@ package cn.quantgroup.xyqb.service.mq.impl;
import cn.quantgroup.xyqb.service.mq.IRegisterMqService;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Queue;
......@@ -16,20 +17,20 @@ import java.io.Serializable;
/**
* Created by xuran on 2017/9/7.
*/
@Slf4j
@Service("registerMqService")
public class IRegisterMqServiceImpl implements IRegisterMqService {
private static final Logger LOGGER = LoggerFactory.getLogger(IRegisterMqServiceImpl.class);
@Autowired
@Qualifier("registerRabbitTemplate")
RabbitTemplate registerRabTemplate;
private RabbitTemplate registerRabTemplate;
@Autowired
@Qualifier("registerRabbitTemplate4Gdt")
RabbitTemplate registerRabbitTemplate4Gdt;
private RabbitTemplate registerRabbitTemplate4Gdt;
@Autowired
@Qualifier(value = "registerMqQueue")
Queue registerMqQueue;
private Queue registerMqQueue;
/**
* 发送用登陆统计信息
......@@ -40,12 +41,12 @@ public class IRegisterMqServiceImpl implements IRegisterMqService {
@Async
public void send(Serializable message) {
if (null == message) {
LOGGER.error("广播用户注册消息不能为空");
log.error("广播用户注册消息不能为空");
}
LOGGER.info("广播用户注册消息,message={}", message);
log.info("广播用户注册消息,message={}", message);
String msg = JSONObject.toJSONString(message);
registerRabTemplate.convertAndSend(msg);
LOGGER.info("广播用户注册消息,message={}", msg);
log.info("广播用户注册消息,message={}", msg);
}
/**
......@@ -57,12 +58,12 @@ public class IRegisterMqServiceImpl implements IRegisterMqService {
@Async
public void send4Gdt(Serializable message) {
if (null == message) {
LOGGER.error("广点通用户注册消息不能为空");
log.error("广点通用户注册消息不能为空");
}
LOGGER.info("广点通用户注册消息,message={}", message);
log.info("广点通用户注册消息,message={}", message);
String msg = JSONObject.toJSONString(message);
registerRabbitTemplate4Gdt.convertAndSend(msg);
LOGGER.info("广点通用户注册消息,message={}", msg);
log.info("广点通用户注册消息,message={}", msg);
}
}
......@@ -3,9 +3,7 @@ package cn.quantgroup.xyqb.service.mq.impl;
import cn.quantgroup.xyqb.model.UserStatistics;
import cn.quantgroup.xyqb.service.mq.IVestService;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Queue;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.Async;
......@@ -17,18 +15,14 @@ import javax.annotation.Resource;
* Created by xuran on 2017/6/21.
* 用户统计信息
*/
@Service("loanVestMQService")
public class LoanVestMQServiceImpl implements IVestService {
private static final Logger LOGGER = LoggerFactory.getLogger(LoanVestMQServiceImpl.class);
@Slf4j
@Service("loanVestMqService")
public class LoanVestMqServiceImpl implements IVestService {
@Resource
@Qualifier("rabbitTemplate")
private RabbitTemplate rabbitTemplate;
@Resource
@Qualifier(value = "loanVestQueue")
Queue loanVestQueue;
/**
* 发送用登陆统计信息
*
......@@ -38,12 +32,13 @@ public class LoanVestMQServiceImpl implements IVestService {
@Async
public void send(UserStatistics message) {
if (null == message) {
LOGGER.error("用户登陆统计消息不能为空");
log.error("用户登陆统计消息不能为空");
return;
}
LOGGER.info("用户登陆统计发送,message={}", message);
log.info("用户登陆统计发送,message={}", message);
String msg = JSONObject.toJSONString(message);
rabbitTemplate.convertAndSend("statistics-user", msg);
LOGGER.info("用户登陆统计成功,message={}", msg);
log.info("用户登陆统计成功,message={}", msg);
}
}
......@@ -5,11 +5,11 @@ import cn.quantgroup.xyqb.entity.User;
/**
* Created by Miraculous on 2017/1/3.
*/
public abstract class PageType {
public abstract class BasePageType {
protected String name;
protected Boolean needShow;
public PageType(String name, Boolean needShow) {
public BasePageType(String name, Boolean needShow) {
this.name = name;
this.needShow = needShow;
}
......
......@@ -3,7 +3,7 @@ package cn.quantgroup.xyqb.service.page.impl;
import cn.quantgroup.xyqb.entity.*;
import cn.quantgroup.xyqb.model.Tuple;
import cn.quantgroup.xyqb.service.page.IPageService;
import cn.quantgroup.xyqb.service.page.bean.PageType;
import cn.quantgroup.xyqb.service.page.bean.BasePageType;
import cn.quantgroup.xyqb.service.user.IAddressService;
import cn.quantgroup.xyqb.service.user.IContactService;
import cn.quantgroup.xyqb.service.user.IUserDetailService;
......@@ -22,10 +22,10 @@ import java.util.Map;
@Service
public class PageServiceImpl implements IPageService {
private Map<String, PageType[]> routerDefinetion;
private Map<String, BasePageType[]> routerDefinetion;
@Autowired
private IUserDetailService userDetailService;
private PageType pageIdNo = new PageType("name", false) {
private BasePageType pageIdNo = new BasePageType("name", false) {
@Override
public boolean canPass(User user) {
UserDetail userDetail = userDetailService.findByUserId(user.getId());
......@@ -34,7 +34,7 @@ public class PageServiceImpl implements IPageService {
};
@Autowired
private IUserExtInfoService userExtInfoService;
private PageType pageUserFinance = new PageType("info", false) {
private BasePageType pageUserFinance = new BasePageType("info", false) {
@Override
public boolean canPass(User user) {
UserExtInfo extInfo = userExtInfoService.findByUserId(user.getId());
......@@ -43,7 +43,7 @@ public class PageServiceImpl implements IPageService {
};
@Autowired
private IAddressService addressService;
private PageType pageAddress = new PageType("address", false) {
private BasePageType pageAddress = new BasePageType("address", false) {
@Override
public boolean canPass(User user) {
Address address = addressService.findByUserId(user.getId());
......@@ -52,7 +52,7 @@ public class PageServiceImpl implements IPageService {
};
@Autowired
private IContactService contactService;
private PageType pageContacts = new PageType("contacts", false) {
private BasePageType pageContacts = new BasePageType("contacts", false) {
@Override
public boolean canPass(User user) {
List<Contact> contacts = contactService.findByUserId(user.getId(), true);
......@@ -64,19 +64,19 @@ public class PageServiceImpl implements IPageService {
private void init() {
routerDefinetion = new HashMap<>();
routerDefinetion.put("cashTarget1", new PageType[]{
routerDefinetion.put("cashTarget1", new BasePageType[]{
pageIdNo, pageUserFinance
});
routerDefinetion.put("cashTarget2", new PageType[]{
routerDefinetion.put("cashTarget2", new BasePageType[]{
pageIdNo, pageAddress
});
routerDefinetion.put("cashTarget3", new PageType[]{
routerDefinetion.put("cashTarget3", new BasePageType[]{
pageIdNo, pageContacts
});
routerDefinetion.put("cashTarget4", new PageType[]{
routerDefinetion.put("cashTarget4", new BasePageType[]{
pageIdNo
});
routerDefinetion.put("cashTarget5", new PageType[]{
routerDefinetion.put("cashTarget5", new BasePageType[]{
});
}
......@@ -85,7 +85,7 @@ public class PageServiceImpl implements IPageService {
if (user == null) {
return new Tuple<>("", false);
}
PageType[] processLists = routerDefinetion.getOrDefault(target, null);
BasePageType[] processLists = routerDefinetion.getOrDefault(target, null);
if (processLists == null) {
return new Tuple<>("", false);
}
......@@ -93,7 +93,7 @@ public class PageServiceImpl implements IPageService {
return new Tuple<>("", true);
}
boolean isBeforeCurrentPage = true;
for (PageType page : processLists) {
for (BasePageType page : processLists) {
if (!page.canPass(user)) {
return new Tuple<>(page.getName(), false);
}
......
......@@ -69,7 +69,7 @@ public class UserRegisterServiceImpl implements IUserRegisterService {
registerFrom = 1L;
}
Long channelId = userRegisterParam.getChannelId();
if (Objects.equals(channelId, 222L)) {
if (Objects.equals(channelId, Constants.Channel.BAITIAO)) {
user.setRegisteredFrom(channelId);
} else {
user.setRegisteredFrom(registerFrom);
......
......@@ -3,12 +3,11 @@ package cn.quantgroup.xyqb.service.session.aspect;
import cn.quantgroup.xyqb.entity.UserBtRegister;
import cn.quantgroup.xyqb.model.session.SessionValue;
import cn.quantgroup.xyqb.service.user.IUserBtRegisterService;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
......@@ -17,16 +16,17 @@ import org.springframework.stereotype.Component;
/**
* Created by Administrator on 2017/5/16.
*/
@Slf4j
@Aspect
@Component
@Order(value = Ordered.HIGHEST_PRECEDENCE + 200)
@Order(value = Ordered.HIGHEST_PRECEDENCE)
public class UserBtRegisterFillAspect {
private static final Logger LOGGER = LoggerFactory.getLogger(UserBtRegisterFillAspect.class);
@Autowired
private IUserBtRegisterService userBtRegisterService;
@Pointcut("@annotation(cn.quantgroup.xyqb.service.session.aspect.UserBtRegisterFill)") //生成还款计划的时候,去生成趸交服务费
/** 生成还款计划的时候,去生成趸交服务费 */
@Pointcut("@annotation(cn.quantgroup.xyqb.service.session.aspect.UserBtRegisterFill)")
public void userBtRegisterFillCut() {
}
......@@ -36,7 +36,7 @@ public class UserBtRegisterFillAspect {
try {
args = fillUserBtRegister(args);
} catch (Exception e) {
LOGGER.error("补充用户白条登录渠道信息失败", e);
log.error("补充用户白条登录渠道信息失败", e);
}
return pjp.proceed(args);
}
......
......@@ -53,10 +53,10 @@ public class SessionServiceImpl implements ISessionService {
//找到用户
String sessionId = findSessionIdByUserIdLoginProperties(user.getId(), properties);
SessionStruct sessionStruct = null;
if (org.apache.commons.lang.StringUtils.isNotEmpty(sessionId)) {
if (StringUtils.isNotEmpty(sessionId)) {
sessionStruct = findSessionBySessionId(sessionId);
}
if (Objects.nonNull(sessionStruct)) {
if (Objects.nonNull(sessionStruct) && Objects.nonNull(properties)) {
sessionStruct.setAttribute("channelId", String.valueOf(properties.getChannelId()));
sessionStruct.setAttribute("createdFrom", String.valueOf(properties.getCreatedFrom()));
sessionStruct.setAttribute("appChannel", String.valueOf(properties.getAppChannel()));
......@@ -80,7 +80,7 @@ public class SessionServiceImpl implements ISessionService {
SessionStruct sessionStruct;
//获取sessionid
String sessionId = findSessionIdByUserIdLoginProperties(user.getId(), properties);
if (StringUtils.length(sessionId) == 36) {
if (StringUtils.length(sessionId) == Constants.TOKEN_LENGTH) {
sessionStruct = findSessionBySessionId(sessionId);
if (sessionStruct == null) {
sessionStruct = newSession(user, properties);
......
......@@ -8,8 +8,6 @@ import cn.quantgroup.xyqb.service.sms.ISmsService;
import lombok.Synchronized;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
......@@ -23,14 +21,9 @@ import java.util.Collections;
* @author mengfan.feng
* @time 2015-07-25 18:47
*/
@Service
@Slf4j
@Service
public class SmsServiceImpl implements ISmsService {
private static final Logger LOGGER = LoggerFactory.getLogger(SmsServiceImpl.class);
private static final int SMS_VERIFICATION_MAXLEN = 4;
private static final String SMS_VERIFY_PREFIX = "sms:verify:";
private static SmsSender smsSender = null;
@Value("${sms.is.debug}")
......@@ -64,7 +57,7 @@ public class SmsServiceImpl implements ISmsService {
//smsSender.sendAndForget(new SendAndForgetMsg(Collections.emptyList(), "24", "1", phoneNo));
log.info("注册完成,发送短信, phoneNo:{}", phoneNo);
} catch (Exception e) {
e.printStackTrace();
log.error("注册完成短信发送异常", e);
}
}
......@@ -98,7 +91,7 @@ public class SmsServiceImpl implements ISmsService {
return false;
}
String[] arr = randomCode.split(":");
if (arr.length != 2) {
if (arr.length != Constants.VERIFICATION_LEN) {
return false;
}
String uniqueId = arr[0];
......@@ -115,7 +108,7 @@ public class SmsServiceImpl implements ISmsService {
//smsSender.confirmSmsResult("1", unqiueId);
log.info("confirmMsg send success, uniqueId={}", unqiueId);
} catch (Exception e) {
log.info("短信验证向短信中心确认失效");
log.info("短信验证向短信中心确认失效", e);
}
return StringUtils.equals(code, smsVerificationCode);
}
......
......@@ -17,7 +17,7 @@ public interface IUserDetailService {
UserDetail findByPhoneNo(String phoneNo);
void updateUserQQ(Long userId, String qq);
void updateUserQq(Long userId, String qq);
void updateUserEmail(Long userId, String email);
......
......@@ -4,6 +4,7 @@ import cn.quantgroup.user.enums.Relation;
import cn.quantgroup.xyqb.entity.Contact;
import cn.quantgroup.xyqb.repository.IContactRepository;
import cn.quantgroup.xyqb.service.user.IContactService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -15,13 +16,14 @@ import org.springframework.util.CollectionUtils;
import java.sql.Timestamp;
import java.util.List;
import java.util.Objects;
/**
* Created by Miraculous on 2017/1/3.
*/
@Slf4j
@Service
public class ContactServiceImpl implements IContactService {
private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(ContactServiceImpl.class);
@Autowired
private IContactRepository contactRepository;
......@@ -84,7 +86,7 @@ public class ContactServiceImpl implements IContactService {
if (null != relation) {
contact.setRelation(relation);
}
LOGGER.info("修改前联系人信息:{}", contact);
log.info("修改前联系人信息:{}", contact);
Timestamp now = new Timestamp(System.currentTimeMillis());
contact.setUpdateAt(now);
contact = save(contact);
......@@ -100,18 +102,26 @@ public class ContactServiceImpl implements IContactService {
private void mergeContacts(Long userId, List<Contact> contacts) {
// 当前联系人列表
List<Contact> userContact = contactRepository.findByUserId(userId);
int userContactCount = (userContact == null) ? 0 : userContact.size();
Timestamp now = new Timestamp(System.currentTimeMillis());
for (int i = 0; i < contacts.size(); i++) {
Contact c = contacts.get(i);
c.setId(null);
c.setUserId(userId);
c.setRelation(c.getRelation() == null ? Relation.OTHER : c.getRelation());
if(Objects.isNull(c.getRelation())){
c.setRelation(Relation.OTHER);
}
c.setCreatedAt(now);
c.setUpdateAt(now);
if (userContactCount > i) {
c.setId(userContact.get(i).getId());
c.setCreatedAt(userContact.get(i).getCreatedAt() == null ? now : userContact.get(i).getCreatedAt());
if (CollectionUtils.isEmpty(userContact) || userContact.size() <= i) {
continue;
}
Contact old = userContact.get(i);
if(Objects.isNull(old)){
continue;
}
c.setId(old.getId());
if(Objects.nonNull(old.getCreatedAt())){
c.setCreatedAt(old.getCreatedAt());
}
}
}
......
......@@ -8,8 +8,6 @@ import cn.quantgroup.xyqb.util.PasswordUtil;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
......@@ -26,9 +24,8 @@ import java.util.Optional;
@Slf4j
public class LkbUserviceImpl implements ILkbUserService {
private static final Logger LOGGER = LoggerFactory.getLogger(LkbUserviceImpl.class);
private static final String TOKEN_PATTERN = "timeunit=%sappkey=lkb010203#$%%";
private static final String LKB_CODE = "0002";
@Autowired
private IHttpService httpService;
......@@ -41,7 +38,7 @@ public class LkbUserviceImpl implements ILkbUserService {
String timeunit = System.currentTimeMillis() + "";
String token = PasswordUtil.MD5(String.format(TOKEN_PATTERN, timeunit));
Map<String, String> parameters = Maps.newHashMap();
parameters.put("appId", Constants.Channel.LKB_CODE);
parameters.put("appId", LKB_CODE);
parameters.put("timeunit", timeunit);
parameters.put("token", token);
parameters.put("userId", uuid);
......@@ -54,8 +51,8 @@ public class LkbUserviceImpl implements ILkbUserService {
}
String response = httpService.post(clientUrl + "/user/push.json", parameters);
Optional<Map> resultOptional = JsonUtil.fromJson(response, Map.class);
if (!resultOptional.isPresent() || !"0000".equals(resultOptional.get().get("code"))) {
LOGGER.error("[lkb_user_push]向LKB同步用户失败,phoneNo:{},response={}", phoneNo, response);
if (!resultOptional.isPresent() || !Constants.SUCCESS_CODE.equals(resultOptional.get().get(Constants.RESULT_CODE))) {
log.error("[lkb_user_push]向LKB同步用户失败,phoneNo:{},response={}", phoneNo, response);
return false;
}
return true;
......
......@@ -5,8 +5,9 @@ import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.exception.PasswordErrorLimitException;
import cn.quantgroup.xyqb.service.user.ILockIpv4Service;
import cn.quantgroup.xyqb.util.DateUtils;
import cn.quantgroup.xyqb.util.IPUtil;
import cn.quantgroup.xyqb.util.IpUtil;
import cn.quantgroup.xyqb.util.ValidationUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -23,9 +24,9 @@ import java.util.concurrent.TimeUnit;
*
* @author renwc
*/
@Slf4j
@Service
public class LockIpv4ServiceImpl implements ILockIpv4Service {
private static final Logger LOGGER = LoggerFactory.getLogger(ILockIpv4Service.class);
@Autowired
@Qualifier("stringRedisTemplate")
......@@ -36,16 +37,16 @@ public class LockIpv4ServiceImpl implements ILockIpv4Service {
// 密码错误时,给该账号添加计数器
String key = Constants.REDIS_PASSWORD_ERROR_COUNT + phoneNo;
if (!stringRedisTemplate.hasKey(key)) {
LOGGER.info("添加错误计数器,key={}", key);
log.info("添加错误计数器,key={}", key);
stringRedisTemplate.opsForValue().set(key, String.valueOf(0), DateUtils.getSeconds(), TimeUnit.SECONDS);
}
// 密码错误计数
Long errorCount = stringRedisTemplate.opsForValue().increment(key, 1L);
if (errorCount > Constants.Image_Need_Count) {
LOGGER.info("用户名或密码不正确,phoneNo={}", phoneNo);
log.info("用户名或密码不正确,phoneNo={}", phoneNo);
throw new PasswordErrorLimitException("用户名或密码不正确");
} else if (Objects.equals(errorCount, Constants.Image_Need_Count)) {
LOGGER.info("请输入图形验证码,phoneNo={}", phoneNo);
log.info("请输入图形验证码,phoneNo={}", phoneNo);
throw new PasswordErrorLimitException("请输入图形验证码");
}
}
......@@ -57,14 +58,14 @@ public class LockIpv4ServiceImpl implements ILockIpv4Service {
*/
@Override
public void countErrorByIpv4(String ipv4) {
if (ValidationUtil.validateIpv4(ipv4) && !IPUtil.whiteOf(ipv4)) {
if (ValidationUtil.validateIpv4(ipv4) && !IpUtil.whiteOf(ipv4)) {
String ipv4Key = getErrorIpKey(ipv4);
if (!stringRedisTemplate.hasKey(ipv4Key)) {
// 计数周期1分钟
stringRedisTemplate.opsForValue().set(ipv4Key, String.valueOf(0), Constants.IPV4_FAILED_COUNT_MINUTES, TimeUnit.MINUTES);
}
Long count = stringRedisTemplate.opsForValue().increment(ipv4Key, 1L);
LOGGER.info("Lock_ipv4: count deny ip access: ip={}, count={}", ipv4, count);
log.info("Lock_ipv4: count deny ip access: ip={}, count={}", ipv4, count);
lockErrorIpv4(ipv4, count);
}
}
......@@ -88,7 +89,7 @@ public class LockIpv4ServiceImpl implements ILockIpv4Service {
}
String lockIpv4Key = getLockIpv4Key(ip);
stringRedisTemplate.opsForValue().set(lockIpv4Key, Boolean.TRUE.toString(), minutes, TimeUnit.MINUTES);
LOGGER.info("Lock_ipv4: locked error ip access:{}, error overstep {} times in {} minutes, do lock {} minutes", ip, counts, Constants.IPV4_FAILED_COUNT_MINUTES, minutes);
log.info("Lock_ipv4: locked error ip access:{}, error overstep {} times in {} minutes, do lock {} minutes", ip, counts, Constants.IPV4_FAILED_COUNT_MINUTES, minutes);
}
/**
......@@ -98,14 +99,14 @@ public class LockIpv4ServiceImpl implements ILockIpv4Service {
*/
@Override
public void countSuccessByIpv4(String ipv4) {
if (ValidationUtil.validateIpv4(ipv4) && !IPUtil.whiteOf(ipv4)) {
if (ValidationUtil.validateIpv4(ipv4) && !IpUtil.whiteOf(ipv4)) {
String ipv4Key = getSuccessIpKey(ipv4);
if (!stringRedisTemplate.hasKey(ipv4Key)) {
// 计数周期1分钟
stringRedisTemplate.opsForValue().set(ipv4Key, String.valueOf(0), Constants.IPV4_SUCCESS_COUNT_MINUTES, TimeUnit.MINUTES);
}
Long count = stringRedisTemplate.opsForValue().increment(ipv4Key, 1L);
LOGGER.info("Lock_ipv4: count success ip access: ip={}, count={}", ipv4, count);
log.info("Lock_ipv4: count success ip access: ip={}, count={}", ipv4, count);
// 恢复规则,观察 // Todo -- 误伤业务方,暂时下线[比如网贷之家:121.40.207.133] -- lockSuccessIpv4(ipv4, count);
lockSuccessIpv4(ipv4, count);
}
......@@ -120,7 +121,7 @@ public class LockIpv4ServiceImpl implements ILockIpv4Service {
// 锁定时长
String lockIpv4Key = getLockIpv4Key(ip);
stringRedisTemplate.opsForValue().set(lockIpv4Key, Boolean.TRUE.toString(), Constants.IPV4_SUCCESS_LOCK_MINUTES, TimeUnit.MINUTES);
LOGGER.info("Lock_ipv4: locked success ip access:{}, success overstep {} times in {} minutes, do lock {} minutes", ip, Constants.IPV4_LOCK_ON_SUCCESS_COUNTS, Constants.IPV4_SUCCESS_COUNT_MINUTES, Constants.IPV4_SUCCESS_LOCK_MINUTES);
log.info("Lock_ipv4: locked success ip access:{}, success overstep {} times in {} minutes, do lock {} minutes", ip, Constants.IPV4_LOCK_ON_SUCCESS_COUNTS, Constants.IPV4_SUCCESS_COUNT_MINUTES, Constants.IPV4_SUCCESS_LOCK_MINUTES);
}
private static String getErrorIpKey(String ipv4) {
......
......@@ -68,8 +68,8 @@ public class UserDetailServiceImpl implements IUserDetailService {
}
@Override
public void updateUserQQ(Long userId, String qq) {
userDetailRepository.updateUserQQ(qq, userId);
public void updateUserQq(Long userId, String qq) {
userDetailRepository.updateUserQq(qq, userId);
}
@Override
......@@ -180,7 +180,7 @@ public class UserDetailServiceImpl implements IUserDetailService {
private PageRequest buildPageRequest(int pageNumber, int pagzSize, String sortType) {
Sort sort = null;
if ("auto".equals(sortType)) {
if (Constants.AUTO_SORT_TYPE.equals(sortType)) {
sort = new Sort(Sort.Direction.ASC, "userId");
}
......
......@@ -25,7 +25,7 @@ public class UserExtInfoServiceImpl implements IUserExtInfoService {
}
@Override
@Transactional
@Transactional(rollbackFor = Exception.class)
@CacheEvict(value = "userextinfocache", key = "'extinfo' + #info.userId", cacheManager = "cacheManager")
public UserExtInfo save(UserExtInfo info) {
return userExtInfoRepository.save(info);
......
......@@ -37,7 +37,7 @@ import java.util.concurrent.TimeUnit;
public class UserServiceImpl implements IUserService {
@Autowired
RedisTemplate<String, String> stringRedisTemplate;
private RedisTemplate<String, String> stringRedisTemplate;
@Autowired
private IUserRepository userRepository;
......
package cn.quantgroup.xyqb.service.wechat.impl;
import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.entity.WechatUserInfo;
import cn.quantgroup.xyqb.exception.WechatRelateUserException;
import cn.quantgroup.xyqb.model.webchat.AccessTokenResponse;
......@@ -32,7 +33,6 @@ import java.util.concurrent.TimeUnit;
@Service
public class WechatServiceImpl implements IWechatService {
private static final String WECHAT_TOKEN_KEY_PREFIX = "wechat:token:";
private static final String WECHAT_USERINFO_KEY_PREFIX = "wechat:userinfo:";
@Value("${wechat.appid}")
private String appId;
@Value("${wechat.secret}")
......@@ -42,8 +42,6 @@ public class WechatServiceImpl implements IWechatService {
@Resource
private IHttpService httpService;
@Resource
private ISessionService sessionService;
@Resource
private IWeChatUserRepository weChatUserRepository;
@Autowired
@Qualifier("stringRedisTemplate")
......@@ -75,8 +73,8 @@ public class WechatServiceImpl implements IWechatService {
if (accessTokenResponse == null) {
return null;
}
accessTokenResponse.setInitialTime(System.currentTimeMillis() - 10000);
redisTemplate.opsForValue().set(key, JSONObject.toJSONString(accessTokenResponse), accessTokenResponse.getExpiresIn() + 1000, TimeUnit.SECONDS);
accessTokenResponse.setInitialTime(System.currentTimeMillis() - Constants.MILLIS_OF_TEN_SECOND);
redisTemplate.opsForValue().set(key, JSONObject.toJSONString(accessTokenResponse), accessTokenResponse.getExpiresIn() + Constants.THOUSAND_SECOND, TimeUnit.SECONDS);
return accessTokenResponse;
} catch (Exception ex) {
return null;
......@@ -85,15 +83,15 @@ public class WechatServiceImpl implements IWechatService {
try {
AccessTokenResponse response = JSONObject.parseObject(resultStr, AccessTokenResponse.class);
// 刷新
if (response.getInitialTime() + response.getExpiresIn() * 1000 > System.currentTimeMillis()) {
if (response.getInitialTime() + response.getExpiresIn() * Constants.MILLIS_PER_SECOND > System.currentTimeMillis()) {
String refreshTokenStr = refreshToken(response.getRefreshToken());
response = JSONObject.parseObject(refreshTokenStr, AccessTokenResponse.class);
if (response == null) {
return null;
}
response.setInitialTime(System.currentTimeMillis() - 10000);
response.setInitialTime(System.currentTimeMillis() - Constants.MILLIS_OF_TEN_SECOND);
}
redisTemplate.opsForValue().set(key, JSONObject.toJSONString(response), response.getExpiresIn() + 1000, TimeUnit.SECONDS);
redisTemplate.opsForValue().set(key, JSONObject.toJSONString(response), response.getExpiresIn() + Constants.THOUSAND_SECOND, TimeUnit.SECONDS);
return response;
} catch (Exception ex) {
return null;
......@@ -118,7 +116,7 @@ public class WechatServiceImpl implements IWechatService {
}
@Override
@Transactional
@Transactional(rollbackFor = Exception.class)
public WechatUserInfo saveWechatUserInfo(WechatUserInfo userInfo) {
if (Objects.isNull(userInfo) || Objects.isNull(userInfo.getOpenId())) {
return null;
......
......@@ -20,7 +20,11 @@ import java.util.Objects;
public class XyqbSessionContextHolder {
private static final ThreadLocal<SessionStruct> threadSession = new ThreadLocal<>();
public static RedisTemplate<String, String> redisTemplate = null;
private static RedisTemplate<String, String> redisTemplate = null;
public static void setRedisTemplate(RedisTemplate<String, String> redisTemplate){
XyqbSessionContextHolder.redisTemplate = redisTemplate;
}
public static SessionStruct getXSession() {
SessionStruct sessionStruct;
......@@ -40,7 +44,7 @@ public class XyqbSessionContextHolder {
}
public static SessionStruct getXSessionFromRedis(String token) {
if (Objects.isNull(token) || token.length() != 36 || Objects.isNull(redisTemplate)) {
if (StringUtils.length(token) != Constants.TOKEN_LENGTH || Objects.isNull(redisTemplate)) {
return null;
}
String result = redisTemplate.opsForValue().get(Constants.Session.USER_SESSION_CACHE + token);
......
......@@ -15,7 +15,7 @@ import javax.crypto.spec.SecretKeySpec;
* @version 1.0
*/
@Slf4j
public class AESUtil {
public class AesUtil {
/**
* KEY算法
......@@ -60,7 +60,7 @@ public class AESUtil {
*/
private static byte[] decryptAfterBase64DecodeToByte(String data, String key) {
try {
if (key == null || "".equals(key.trim().length())) {
if (StringUtils.isBlank(key)) {
return null;
}
byte[] raw = key.getBytes(DATA_ENCODING);
......
......@@ -16,7 +16,7 @@ import java.util.Set;
* @author renwc
* @date 2017-12-01
*/
public class IPUtil {
public class IpUtil {
/**
* IP白名单
* <p>
......@@ -30,6 +30,8 @@ public class IPUtil {
*/
private static final Set<String> WHITE_ADDRESS = Sets.newHashSet();
private static final String LOCAL_ADDRESS = "127.0.0.1";
/** 入口服务器IP */
public static final String IO_IP = "139.198.";
static {
String[] ips = {"172.16.", "172.18.", "172.20.", "172.21.", "172.30.", "172.41.", "192.168.3.", "192.168.4."};
......@@ -96,13 +98,14 @@ public class IPUtil {
}
//过滤反向代理的ip
String[] stemps = ip.split(",");
if (stemps != null && stemps.length >= 1) {
if (stemps != null && stemps.length > 0) {
//得到第一个IP,即客户端真实IP
ip = stemps[0];
}
ip = ip.trim();
if (ip.length() > 23) {
ip = ip.substring(0, 23);
int twentyThree = 23;
if (ip.length() > twentyThree) {
ip = ip.substring(0, twentyThree);
}
return ip;
}
......
......@@ -24,7 +24,7 @@ public class MqUtils {
*/
public static void sendLoanVest(UserStatistics vest) {
try {
IVestService mqService = ApplicationContextHolder.getBean("loanVestMQService");
IVestService mqService = ApplicationContextHolder.getBean("loanVestMqService");
mqService.send(vest);
} catch (Exception e) {
log.error("[MQUtils][MQUtils_exception]发送用户统计信息,vest={},error={}",
......
package cn.quantgroup.xyqb.util;
import cn.quantgroup.xyqb.Constants;
import com.alibaba.fastjson.JSON;
import com.google.common.base.Preconditions;
import org.apache.commons.lang.StringUtils;
import java.security.MessageDigest;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ThreadLocalRandom;
......@@ -89,4 +92,20 @@ public class PasswordUtil {
return Objects.equals(thePassword, targetPassword);
}
public static String filterPasswordToString(Map<String, String> info) {
if (null == info) {
return null;
}
if(!info.containsKey(Constants.PASSWORD)){
return JSON.toJSONString(info);
}
String password = info.get(Constants.PASSWORD);
// 先删掉
info.remove(Constants.PASSWORD);
String infoString = JSON.toJSONString(info);
// 再回填
info.put(Constants.PASSWORD, password);
return infoString;
}
}
package cn.quantgroup.xyqb.util;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author mengfan.feng
*/
public class Utils {
private static Pattern pattern = Pattern.compile("(?<!\\d)(?:(?:1[34578]\\d{9})|(?:861[34578]\\d{9}))(?!\\d)");
public static String safeMap2Str(Map<String, String> info) {
if (null == info) {
return null;
}
StringBuilder builder = new StringBuilder();
builder.append("{");
info.forEach((key, value) -> {
if ("password".equals(key)) {
return;
}
builder.append(key);
builder.append("=");
builder.append(value);
builder.append(",");
});
builder.append("}");
return builder.toString();
}
public static String coverPhone(String str) {
if (str.length() <= 0) {
return "";
}
if (str.length() > 1024) //长度超过1024的字符串不走正则匹配过滤手机号
{
return "";
}
Matcher matcher = pattern.matcher(str);
Map<String, String> replaceMap = new HashMap<>();
while (matcher.find()) {
String group = matcher.group();
String replace = group.substring(0, 3).concat("****").concat(group.substring(7)).concat(" [".concat(PasswordUtil.MD5(group)).concat("]"));
replaceMap.put(group, replace);
}
Set<Map.Entry<String, String>> entries = replaceMap.entrySet();
for (Map.Entry<String, String> entry : entries) {
str = str.replaceAll(entry.getKey(), entry.getValue());
}
return str;
}
}
package cn.quantgroup.xyqb.util;
import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.util.encrypt.MD5Util;
import cn.quantgroup.xyqb.util.encrypt.Md5Util;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
......@@ -180,7 +180,7 @@ public class ValidationUtil {
public static String getMd5Key(boolean lock) {
Calendar today = Calendar.getInstance();
int hour_24 = today.get(Calendar.HOUR_OF_DAY);
return MD5Util.build(Constants.CLEAR_LOCK_FOR_IPV4_KEY + lock + hour_24);
return Md5Util.build(Constants.CLEAR_LOCK_FOR_IPV4_KEY + lock + hour_24);
}
}
......@@ -63,6 +63,18 @@ class Base64 {
*/
private static final byte PAD = (byte) '=';
private static final byte LAST_2_BIT = 0x3;
private static final byte LAST_4_BIT = 0xf;
private static final char ASCII_A_UPPER = 'A';
private static final char ASCII_Z_UPPER = 'Z';
private static final char ASCII_A_LOWER = 'a';
private static final char ASCII_Z_LOWER = 'z';
private static final char ASCII_0 = '0';
private static final char ASCII_9 = '9';
private static final char A_Z_COUNT = 26;
private static final char A_Z_LOWER_COUNT = 26;
private static final char NUMBER_0_9_COUNT = 10;
// Create arrays to hold the base64 characters and a
// lookup for base64 chars
private static byte[] base64Alphabet = new byte[BASELENGTH];
......@@ -73,29 +85,29 @@ class Base64 {
for (int i = 0; i < BASELENGTH; i++) {
base64Alphabet[i] = (byte) -1;
}
for (int i = 'Z'; i >= 'A'; i--) {
base64Alphabet[i] = (byte) (i - 'A');
for (int i = ASCII_Z_UPPER; i >= ASCII_A_UPPER; i--) {
base64Alphabet[i] = (byte) (i - ASCII_A_UPPER);
}
for (int i = 'z'; i >= 'a'; i--) {
base64Alphabet[i] = (byte) (i - 'a' + 26);
for (int i = ASCII_Z_LOWER; i >= ASCII_A_LOWER; i--) {
base64Alphabet[i] = (byte) (i - ASCII_A_LOWER + 26);
}
for (int i = '9'; i >= '0'; i--) {
base64Alphabet[i] = (byte) (i - '0' + 52);
for (int i = ASCII_9; i >= ASCII_0; i--) {
base64Alphabet[i] = (byte) (i - ASCII_0 + 52);
}
base64Alphabet['+'] = 62;
base64Alphabet['/'] = 63;
for (int i = 0; i <= 25; i++) {
lookUpBase64Alphabet[i] = (byte) ('A' + i);
for (int i = 0; i < A_Z_COUNT; i++) {
lookUpBase64Alphabet[i] = (byte) (ASCII_A_UPPER + i);
}
for (int i = 26, j = 0; i <= 51; i++, j++) {
lookUpBase64Alphabet[i] = (byte) ('a' + j);
for (int i = A_Z_COUNT, j = 0; i < A_Z_COUNT + A_Z_LOWER_COUNT; i++, j++) {
lookUpBase64Alphabet[i] = (byte) (ASCII_A_LOWER + j);
}
for (int i = 52, j = 0; i <= 61; i++, j++) {
lookUpBase64Alphabet[i] = (byte) ('0' + j);
for (int i = A_Z_COUNT + A_Z_LOWER_COUNT, j = 0; i < A_Z_COUNT + A_Z_LOWER_COUNT + NUMBER_0_9_COUNT; i++, j++) {
lookUpBase64Alphabet[i] = (byte) (ASCII_0 + j);
}
lookUpBase64Alphabet[62] = (byte) '+';
......@@ -187,7 +199,6 @@ class Base64 {
byte encodedData[] = null;
int encodedDataLength = 0;
int nbrChunks = 0;
if (fewerThan24bits != 0) {
//data not divisible by 24 bit
encodedDataLength = (numberTriplets + 1) * 4;
......@@ -195,122 +206,70 @@ class Base64 {
// 16 or 8 bit
encodedDataLength = numberTriplets * 4;
}
// If the output is to be "chunked" into 76 character sections,
// for compliance with RFC 2045 MIME, then it is important to
// allow for extra length to account for the separator(s)
// If the output is to be "chunked" into 76 character sections, for compliance with RFC 2045 MIME, then it is important to allow for extra length to account for the separator(s)
if (isChunked) {
nbrChunks =
(CHUNK_SEPARATOR.length == 0 ? 0 : (int) Math.ceil((float) encodedDataLength / CHUNK_SIZE));
nbrChunks = (CHUNK_SEPARATOR.length == 0 ? 0 : (int)Math.ceil((double) encodedDataLength / (double)CHUNK_SIZE));
encodedDataLength += nbrChunks * CHUNK_SEPARATOR.length;
}
encodedData = new byte[encodedDataLength];
byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;
int encodedIndex = 0;
int dataIndex = 0;
int encodedIndex = 0, dataIndex = 0, chunksSoFar = 0;
int i = 0;
int nextSeparatorIndex = CHUNK_SIZE;
int chunksSoFar = 0;
//log.debug("number of triplets = " + numberTriplets);
for (i = 0; i < numberTriplets; i++) {
dataIndex = i * 3;
b1 = binaryData[dataIndex];
b2 = binaryData[dataIndex + 1];
b3 = binaryData[dataIndex + 2];
//log.debug("b1= " + b1 +", b2= " + b2 + ", b3= " + b3);
l = (byte) (b2 & 0x0f);
k = (byte) (b1 & 0x03);
byte val1 =
((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
byte val2 =
((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
byte val3 =
((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc);
byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc);
encodedData[encodedIndex] = lookUpBase64Alphabet[val1];
//log.debug( "val2 = " + val2 );
//log.debug( "k4 = " + (k<<4) );
//log.debug( "vak = " + (val2 | (k<<4)) );
encodedData[encodedIndex + 1] =
lookUpBase64Alphabet[val2 | (k << 4)];
encodedData[encodedIndex + 2] =
lookUpBase64Alphabet[(l << 2) | val3];
encodedData[encodedIndex + 1] = lookUpBase64Alphabet[val2 | (k << 4)];
encodedData[encodedIndex + 2] = lookUpBase64Alphabet[(l << 2) | val3];
encodedData[encodedIndex + 3] = lookUpBase64Alphabet[b3 & 0x3f];
encodedIndex += 4;
// If we are chunking, let's put a chunk separator down.
if (isChunked) {
// this assumes that CHUNK_SIZE % 4 == 0
if (encodedIndex == nextSeparatorIndex) {
System.arraycopy(
CHUNK_SEPARATOR,
0,
encodedData,
encodedIndex,
CHUNK_SEPARATOR.length);
System.arraycopy(CHUNK_SEPARATOR, 0, encodedData, encodedIndex, CHUNK_SEPARATOR.length);
chunksSoFar++;
nextSeparatorIndex =
(CHUNK_SIZE * (chunksSoFar + 1)) +
(chunksSoFar * CHUNK_SEPARATOR.length);
nextSeparatorIndex = (CHUNK_SIZE * (chunksSoFar + 1)) + (chunksSoFar * CHUNK_SEPARATOR.length);
encodedIndex += CHUNK_SEPARATOR.length;
}
}
}
// form integral number of 6-bit groups
dataIndex = i * 3;
if (fewerThan24bits == EIGHTBIT) {
b1 = binaryData[dataIndex];
k = (byte) (b1 & 0x03);
//log.debug("b1=" + b1);
//log.debug("b1<<2 = " + (b1>>2) );
byte val1 =
((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
encodedData[encodedIndex] = lookUpBase64Alphabet[val1];
encodedData[encodedIndex + 1] = lookUpBase64Alphabet[k << 4];
encodedData[encodedIndex + 2] = PAD;
encodedData[encodedIndex + 3] = PAD;
} else if (fewerThan24bits == SIXTEENBIT) {
b1 = binaryData[dataIndex];
b2 = binaryData[dataIndex + 1];
l = (byte) (b2 & 0x0f);
k = (byte) (b1 & 0x03);
byte val1 =
((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
byte val2 =
((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
encodedData[encodedIndex] = lookUpBase64Alphabet[val1];
encodedData[encodedIndex + 1] =
lookUpBase64Alphabet[val2 | (k << 4)];
encodedData[encodedIndex + 1] = lookUpBase64Alphabet[val2 | (k << 4)];
encodedData[encodedIndex + 2] = lookUpBase64Alphabet[l << 2];
encodedData[encodedIndex + 3] = PAD;
}
if (isChunked) {
// we also add a separator to the end of the final chunk.
if (chunksSoFar < nbrChunks) {
System.arraycopy(
CHUNK_SEPARATOR,
0,
encodedData,
encodedDataLength - CHUNK_SEPARATOR.length,
CHUNK_SEPARATOR.length);
System.arraycopy(CHUNK_SEPARATOR, 0, encodedData, encodedDataLength - CHUNK_SEPARATOR.length, CHUNK_SEPARATOR.length);
}
}
return encodedData;
}
......@@ -364,7 +323,7 @@ class Base64 {
decodedData[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);
decodedData[encodedIndex + 1] =
(byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
(byte) (((b2 & LAST_4_BIT) << 4) | ((b3 >> 2) & LAST_4_BIT));
decodedData[encodedIndex + 2] = (byte) (b3 << 6 | b4);
} else if (marker0 == PAD) {
//Two PAD e.g. 3c[Pad][Pad]
......@@ -375,7 +334,7 @@ class Base64 {
decodedData[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);
decodedData[encodedIndex + 1] =
(byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
(byte) (((b2 & LAST_4_BIT) << 4) | ((b3 >> 2) & LAST_4_BIT));
}
encodedIndex += 3;
}
......@@ -456,65 +415,55 @@ class Base64 {
* @return Array containind decoded data.
*/
public static byte[] decode2(String encoded) {
if (encoded == null) {
return null;
}
char[] base64Data = encoded.toCharArray();
// remove white spaces
int len = removeWhiteSpace(base64Data);
if (len % FOURBYTE != 0) {
return null;//should be divisible by four
//should be divisible by four
return null;
}
int numberQuadruple = (len / FOURBYTE);
if (numberQuadruple == 0) {
return new byte[0];
}
byte decodedData[] = null;
byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;
char d1 = 0, d2 = 0, d3 = 0, d4 = 0;
int i = 0;
int encodedIndex = 0;
int dataIndex = 0;
decodedData = new byte[(numberQuadruple) * 3];
for (; i < numberQuadruple - 1; i++) {
if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))
|| !isData((d3 = base64Data[dataIndex++]))
|| !isData((d4 = base64Data[dataIndex++]))) {
//if found "no data" just return null
return null;
}//if found "no data" just return null
}
b1 = base64Alphabet[d1];
b2 = base64Alphabet[d2];
b3 = base64Alphabet[d3];
b4 = base64Alphabet[d4];
decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
decodedData[encodedIndex++] = (byte) (((b2 & LAST_4_BIT) << 4) | ((b3 >> 2) & LAST_4_BIT));
decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);
}
//if found "no data" just return null
if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))) {
return null;//if found "no data" just return null
return null;
}
b1 = base64Alphabet[d1];
b2 = base64Alphabet[d2];
d3 = base64Data[dataIndex++];
d4 = base64Data[dataIndex++];
if (!isData((d3)) || !isData((d4))) {//Check if they are PAD characters
if (!isData((d3)) || !isData((d4))) {
//Check if they are PAD characters
if (isPad(d3) && isPad(d4)) {
if ((b2 & 0xf) != 0)//last 4 bits should be zero
{
//last 4 bits should be zero
if ((b2 & LAST_4_BIT) != 0){
return null;
}
byte[] tmp = new byte[i * 3 + 1];
......@@ -523,27 +472,26 @@ class Base64 {
return tmp;
} else if (!isPad(d3) && isPad(d4)) {
b3 = base64Alphabet[d3];
if ((b3 & 0x3) != 0)//last 2 bits should be zero
{
//last 2 bits should be zero
if ((b3 & LAST_2_BIT) != 0){
return null;
}
byte[] tmp = new byte[i * 3 + 2];
System.arraycopy(decodedData, 0, tmp, 0, i * 3);
tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
tmp[encodedIndex] = (byte) (((b2 & LAST_4_BIT) << 4) | ((b3 >> 2) & LAST_4_BIT));
return tmp;
} else {
return null;
}
} else { //No PAD e.g 3cQl
} else {
//No PAD e.g 3cQl
b3 = base64Alphabet[d3];
b4 = base64Alphabet[d4];
decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
decodedData[encodedIndex++] = (byte) (((b2 & LAST_4_BIT) << 4) | ((b3 >> 2) & LAST_4_BIT));
decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);
}
return decodedData;
}
......
package cn.quantgroup.xyqb.util.encrypt;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -9,16 +10,15 @@ import java.security.NoSuchAlgorithmException;
/**
* Created by tums on 2015/11/30.
*/
public final class MD5Util {
private static final Logger LOGGER = LoggerFactory.getLogger(MD5Util.class);
@Slf4j
public final class Md5Util {
public static String build(String content) {
MessageDigest messageDigest;
try {
messageDigest = MessageDigest
.getInstance("md5");
messageDigest = MessageDigest.getInstance("md5");
} catch (NoSuchAlgorithmException e) {
LOGGER.error(e.getMessage(), e);
log.error("MessageDigest获取实例失败", e);
return null;
}
messageDigest.update(content.getBytes());
......
package cn.quantgroup.xyqb.util.encrypt;
import lombok.extern.slf4j.Slf4j;
import javax.crypto.Cipher;
import java.io.ByteArrayOutputStream;
import java.math.BigInteger;
......@@ -10,7 +12,8 @@ import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
public class RSA {
@Slf4j
public class Rsa {
/**
* 指定key的大小
*/
......@@ -166,19 +169,14 @@ public class RSA {
Base64.decodeBase64(privateKey.getBytes()));
KeyFactory keyf = KeyFactory.getInstance("RSA");
PrivateKey priKey = keyf.generatePrivate(priPKCS8);
Signature signature = Signature.getInstance("SHA1WithRSA");
signature.initSign(priKey);
signature.update(content.getBytes(charset));
byte[] signed = signature.sign();
return new String(Base64.encodeBase64(signed));
} catch (Exception e) {
log.error("出错了", e);
}
return null;
}
......@@ -187,19 +185,13 @@ public class RSA {
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
byte[] encodedKey = Base64.decode2(publicKey);
PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
Signature signature = Signature
.getInstance("SHA1WithRSA");
Signature signature = Signature.getInstance("SHA1WithRSA");
signature.initVerify(pubKey);
signature.update(content.getBytes("utf-8"));
boolean bverify = signature.verify(Base64.decode2(sign));
return bverify;
} catch (Exception e) {
e.printStackTrace();
log.error("出错了", e);
}
return false;
......
......@@ -5,4 +5,4 @@ import service.QuantgroupCaptchaServiceTest;
@RunWith(Suite.class)
@Suite.SuiteClasses({GeetestCaptchaServiceTest.class, QuantgroupCaptchaServiceTest.class})
public class CaptchaVerifyTests {}
\ No newline at end of file
public class CaptchaVerifyTest {}
\ No newline at end of file
import demo.*;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({DynamicTest.class, MockMvcTest.class, MvcTest.class,
ParametersJunit4Test.class, ParametersJunit5Test.class,
RepsitoryJpaTest.class, RepsitoryTest.class, ServiceTest.class, WebTest.class})
public class DemoTest {}
\ No newline at end of file
import demo.*;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({DynamicTests.class, MockMvcTests.class, MvcTests.class,
ParametersJunit4Tests.class, ParametersJunit5Tests.class,
RepsitoryJpaTests.class, RepsitoryTests.class, ServiceTests.class, WebTests.class})
public class DemoTests {}
\ No newline at end of file
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import repsitory.UserAuthorizedRepsitoryTest;
import service.UserAuthorizedServiceTest;
import web.UserAuthorizedControllerTest;
@RunWith(Suite.class)
@Suite.SuiteClasses({UserAuthorizedRepsitoryTest.class, UserAuthorizedServiceTest.class, UserAuthorizedControllerTest.class})
public class UserAuthorizedTest {}
\ No newline at end of file
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import repsitory.UserAuthorizedRepsitoryTests;
import service.UserAuthorizedServiceTests;
import web.UserAuthorizedControllerTests;
@RunWith(Suite.class)
@Suite.SuiteClasses({UserAuthorizedRepsitoryTests.class, UserAuthorizedServiceTests.class, UserAuthorizedControllerTests.class})
public class UserAuthorizedTests {}
\ No newline at end of file
......@@ -2,12 +2,11 @@ package common;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.UUID;
import java.util.stream.Collectors;
import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.util.AESUtil;
import cn.quantgroup.xyqb.util.AesUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.RandomStringUtils;
import org.junit.Assert;
......@@ -19,8 +18,8 @@ import cn.quantgroup.xyqb.util.ValidationUtil;
@Slf4j
@RunWith(JUnit4.class)
public class TestJdk8 {
final static String RANDOM_CHARS = "0123456789";
public class Jdk8Test {
private final static String RANDOM_CHARS = "0123456789";
@Test
public void testString() {
......@@ -39,7 +38,7 @@ public class TestJdk8 {
@Test
public void wechatContent() {
String userId = String.valueOf(50963791);
String content = AESUtil.encryptAndBase64Encode(userId, Constants.AES_KEY);
String content = AesUtil.encryptAndBase64Encode(userId, Constants.AES_KEY);
log.info("50963791:{}", content);
}
......@@ -51,7 +50,8 @@ public class TestJdk8 {
@Test
public void random() {
for(int i=0; i<10; i++){
int count = 10;
for(int i=0; i<count; i++){
log.info("{}-random:{}", i, RandomStringUtils.random(6, RANDOM_CHARS));
}
}
......
package common;
import cn.quantgroup.xyqb.util.encrypt.Md5Util;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@Slf4j
@RunWith(JUnit4.class)
public class Md5Test {
private final static String PWD = "123456";
@Test
public void test() {
log.info("pwd:{},Md5Util:{}", PWD, Md5Util.build(PWD));
}
}
......@@ -9,7 +9,7 @@ import cn.quantgroup.xyqb.util.ValidationUtil;
@Slf4j
@RunWith(JUnit4.class)
public class TestValidationUtil {
public class ValidationUtilTest {
public static void main(String[] args){
String[][] contacts = {
......
......@@ -8,7 +8,7 @@ import org.springframework.test.context.junit4.AbstractTransactionalJUnit4Spring
* @author renwc
* @date 2018-01-05
*/
public abstract class BaseParametersTests extends AbstractTransactionalJUnit4SpringContextTests {
public abstract class BaseParametersTest extends AbstractTransactionalJUnit4SpringContextTests {
private TestContextManager testContextManager;
@Before
public void setUpContext() throws Exception {
......
......@@ -3,6 +3,7 @@ package demo;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.function.ThrowingConsumer;
import java.security.SecureRandom;
import java.util.*;
import java.util.function.Function;
import java.util.stream.IntStream;
......@@ -19,7 +20,7 @@ import static org.junit.jupiter.api.DynamicTest.dynamicTest;
* @date 2018-01-05
*/
@Tag("Test Factory")
public class DynamicTests {
public class DynamicTest {
// This will result in a JUnitException!
@Disabled
......@@ -29,7 +30,7 @@ public class DynamicTests {
}
@TestFactory
Collection<DynamicTest> dynamicTestsFromCollection() {
Collection<org.junit.jupiter.api.DynamicTest> dynamicTestsFromCollection() {
return Arrays.asList(
dynamicTest("1st dynamic test", () -> assertTrue(true)),
dynamicTest("2nd dynamic test", () -> assertEquals(4, 2 * 2))
......@@ -37,7 +38,7 @@ public class DynamicTests {
}
@TestFactory
Iterable<DynamicTest> dynamicTestsFromIterable() {
Iterable<org.junit.jupiter.api.DynamicTest> dynamicTestsFromIterable() {
return Arrays.asList(
dynamicTest("3rd dynamic test", () -> assertTrue(true)),
dynamicTest("4th dynamic test", () -> assertEquals(4, 2 * 2))
......@@ -45,7 +46,7 @@ public class DynamicTests {
}
@TestFactory
Iterator<DynamicTest> dynamicTestsFromIterator() {
Iterator<org.junit.jupiter.api.DynamicTest> dynamicTestsFromIterator() {
return Arrays.asList(
dynamicTest("5th dynamic test", () -> assertTrue(true)),
dynamicTest("6th dynamic test", () -> assertEquals(4, 2 * 2))
......@@ -53,27 +54,27 @@ public class DynamicTests {
}
@TestFactory
Stream<DynamicTest> dynamicTestsFromStream() {
Stream<org.junit.jupiter.api.DynamicTest> dynamicTestsFromStream() {
return Stream.of("A", "B", "C")
.map(str -> dynamicTest("test" + str, () -> { /* ... */ }));
}
@TestFactory
Stream<DynamicTest> dynamicTestsFromIntStream() {
Stream<org.junit.jupiter.api.DynamicTest> dynamicTestsFromIntStream() {
// Generates tests for the first 10 even integers.
return IntStream.iterate(0, n -> n + 2).limit(10)
.mapToObj(n -> dynamicTest("test" + n, () -> assertTrue(n % 2 == 0)));
}
@TestFactory
Stream<DynamicTest> generateRandomNumberOfTests() {
Stream<org.junit.jupiter.api.DynamicTest> generateRandomNumberOfTests() {
// Generates random positive integers between 0 and 100 until
// a number evenly divisible by 7 is encountered.
Iterator<Integer> inputGenerator = new Iterator<Integer>() {
Random random = new Random();
int current;
private SecureRandom random = new SecureRandom();
private int current;
@Override
public boolean hasNext() {
......@@ -83,6 +84,9 @@ public class DynamicTests {
@Override
public Integer next() {
if(!hasNext()){
throw new NoSuchElementException();
}
return current;
}
};
......@@ -94,7 +98,7 @@ public class DynamicTests {
ThrowingConsumer<Integer> testExecutor = (input) -> assertTrue(input % 7 != 0);
// Returns a stream of dynamic tests.
return DynamicTest.stream(inputGenerator, displayNameGenerator, testExecutor);
return org.junit.jupiter.api.DynamicTest.stream(inputGenerator, displayNameGenerator, testExecutor);
}
@TestFactory
......
......@@ -31,7 +31,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@RunWith(SpringRunner.class)
@WebMvcTest({UserController.class})
@ContextConfiguration(classes = {JpaConfig.class, RedisConfig.class}, initializers = ApolloPropertySourceInitializer.class)
public class MockMvcTests {
public class MockMvcTest {
@Resource
private MockMvc mvc;
@MockBean
......
......@@ -26,10 +26,10 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Bootstrap.class)
@ContextConfiguration(initializers = ApolloPropertySourceInitializer.class)
public class MvcTests {
public class MvcTest {
private MockMvc mvc;
@Resource
WebApplicationContext webApplicationConnect;
private WebApplicationContext webApplicationConnect;
@Before
public void setUp() throws JsonProcessingException {
......
......@@ -15,10 +15,10 @@ import java.util.Collection;
*/
@Tag("Parameters")
@RunWith(value = Parameterized.class)
public class ParametersJunit4Tests {
public class ParametersJunit4Test {
private String key;
private int value;
public ParametersJunit4Tests(String key, int value) {
public ParametersJunit4Test(String key, int value) {
this.key = key;
this.value = value;
}
......
......@@ -17,7 +17,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
* @date 2018-01-05
*/
@Tag("Parameters")
public class ParametersJunit5Tests {
public class ParametersJunit5Test {
@ParameterizedTest
@ValueSource(strings = { "racecar", "radar", "able was I ere I saw elba" })
void palindromes(String candidate) {
......
......@@ -27,12 +27,12 @@ import java.time.Instant;
* @date 2018-01-05
*/
@Rollback
@Transactional
@Transactional(rollbackFor = Exception.class)
@RunWith(SpringRunner.class)
@DataJpaTest
@ContextConfiguration(classes = {JpaConfig.class, RedisConfig.class}, initializers = ApolloPropertySourceInitializer.class)
@AutoConfigureTestDatabase(replace= AutoConfigureTestDatabase.Replace.NONE)
public class RepsitoryJpaTests {
public class RepsitoryJpaTest {
@Resource
private TestEntityManager entityManager;
......
......@@ -25,11 +25,11 @@ import java.time.Instant;
* @date 2018-01-05
*/
@Rollback
@Transactional
@Transactional(rollbackFor = Exception.class)
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Bootstrap.class)
@ContextConfiguration(initializers = ApolloPropertySourceInitializer.class)
public class RepsitoryTests extends AbstractTransactionalJUnit4SpringContextTests {
public class RepsitoryTest extends AbstractTransactionalJUnit4SpringContextTests {
@Resource
private IUserRepository userRepository;
......
......@@ -24,11 +24,11 @@ import java.time.Instant;
* @date 2018-01-05
*/
@Rollback
@Transactional
@Transactional(rollbackFor = Exception.class)
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Bootstrap.class)
@ContextConfiguration(initializers = ApolloPropertySourceInitializer.class)
public class ServiceTests extends AbstractTransactionalJUnit4SpringContextTests {
public class ServiceTest extends AbstractTransactionalJUnit4SpringContextTests {
@Resource
private IUserService userService;
......
......@@ -26,7 +26,7 @@ import javax.annotation.Resource;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Bootstrap.class, webEnvironment= WebEnvironment.RANDOM_PORT)
@ContextConfiguration(initializers = ApolloPropertySourceInitializer.class)
public class WebTests {
public class WebTest {
@Resource
private TestRestTemplate restTemplate;
......
......@@ -3,16 +3,16 @@ package login;
import java.nio.charset.Charset;
import java.util.Base64;
public class TestStringCode {
public class StringCodeTest {
public static void main(String[] args) {
System.out.println(ap_base64("13461067662", "abc123"));
System.out.println(pc_base64("18222288391", "0000"));
}
final static String AUTHORIZATION = "authorization";
final static String PREFIX_AP = "Basic ";
final static String PREFIX_PC = "Verification ";
private final static String AUTHORIZATION = "authorization";
private final static String PREFIX_AP = "Basic ";
private final static String PREFIX_PC = "Verification ";
/*
* 4.153
* 13576450525 123456 318e235d3e52648b236faa3f748000d5
......
......@@ -31,10 +31,10 @@ import java.util.List;
/**
* Created by 11 on 2017/1/3.
*/
@Slf4j
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Bootstrap.class )
@Slf4j
public class TestUserLogin {
public class UserLoginTest {
private MockHttpServletRequest request = new MockHttpServletRequest();;
......@@ -77,7 +77,8 @@ public class TestUserLogin {
//String userId = "8c02a7b8-815f-4ba0-b39c-a9e6e52904de";
//测试userId为空的情况
String userId = "";
request.addHeader("x-original-client-ip", "172.16.0.1");
String ip = "172.16.0.1";
request.addHeader("x-original-client-ip", ip);
request.addHeader("authorization", "Basic MTg1MTMzNDE4MDg6MTIzNDU2");
JsonResult jsonResult = userController.login(channelId, appChannel, createFrom, userId,"xyqb","xyqb", request);
AuthBean authBean = (AuthBean) jsonResult.getData();
......@@ -93,15 +94,14 @@ public class TestUserLogin {
try {
entity = new UrlEncodedFormEntity(pairList, "UTF-8");
}catch (Exception e){
e.printStackTrace();
log.error("error", e);
}
post.setEntity(entity);
String result = "";
try {
CloseableHttpResponse response = httpClient.execute(post);
result = EntityUtils.toString(response.getEntity());
EntityUtils.toString(response.getEntity());
} catch (IOException e) {
e.printStackTrace();
log.error("error", e);
}
}
......
......@@ -5,7 +5,7 @@ import cn.quantgroup.xyqb.entity.UserAuthorized;
import cn.quantgroup.xyqb.model.AuthPattern;
import cn.quantgroup.xyqb.repository.IUserAuthorizedRepository;
import com.ctrip.framework.apollo.spring.config.ApolloPropertySourceInitializer;
import demo.BaseParametersTests;
import demo.BaseParametersTest;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.Test;
......@@ -28,17 +28,17 @@ import java.util.Collection;
*/
@Slf4j
@Rollback
@Transactional
@Transactional(rollbackFor = Exception.class)
@RunWith(value = Parameterized.class)
@SpringBootTest(classes = Bootstrap.class)
@ContextConfiguration(initializers = ApolloPropertySourceInitializer.class)
public class UserAuthorizedRepsitoryTests extends BaseParametersTests {
public class UserAuthorizedRepsitoryTest extends BaseParametersTest {
@Resource
private IUserAuthorizedRepository userAuthorizedRepository;
UserAuthorized obj = new UserAuthorized();
public UserAuthorizedRepsitoryTests(String userUuid, String idNo, String name, AuthPattern authPattern, Boolean available) {
private UserAuthorized obj = new UserAuthorized();
public UserAuthorizedRepsitoryTest(String userUuid, String idNo, String name, AuthPattern authPattern, Boolean available) {
obj.setUserUuid(userUuid);
obj.setIdNo(idNo);
obj.setName(name);
......
......@@ -6,7 +6,7 @@ import cn.quantgroup.xyqb.model.AuthPattern;
import cn.quantgroup.xyqb.model.UserAuthorizedParam;
import cn.quantgroup.xyqb.service.auth.IUserAuthorizedService;
import com.ctrip.framework.apollo.spring.config.ApolloPropertySourceInitializer;
import demo.BaseParametersTests;
import demo.BaseParametersTest;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.FixMethodOrder;
......@@ -31,18 +31,18 @@ import java.util.Optional;
*/
@Slf4j
@Rollback(true)
@Transactional
@Transactional(rollbackFor = Exception.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@RunWith(value = Parameterized.class)
@SpringBootTest(classes = Bootstrap.class)
@ContextConfiguration(initializers = ApolloPropertySourceInitializer.class)
public class UserAuthorizedServiceTests extends BaseParametersTests {
public class UserAuthorizedServiceTest extends BaseParametersTest {
@Resource
private IUserAuthorizedService userAuthorizedService;
UserAuthorizedParam obj = new UserAuthorizedParam();
public UserAuthorizedServiceTests(String userUuid, String idNo, String name, AuthPattern authPattern, Boolean available) {
private UserAuthorizedParam obj = new UserAuthorizedParam();
public UserAuthorizedServiceTest(String userUuid, String idNo, String name, AuthPattern authPattern, Boolean available) {
obj.setUserUuid(userUuid);
obj.setIdNo(idNo);
obj.setName(name);
......
......@@ -31,9 +31,9 @@ import java.util.List;
@SpringBootTest(classes = Bootstrap.class )
@Slf4j
@Rollback
@Transactional
@Transactional(rollbackFor = Exception.class)
@RunWith(Parameterized.class)
public class TestUserService {
public class UserServiceTest {
private TestContextManager testContextManager;
......@@ -44,7 +44,7 @@ public class TestUserService {
private Address addressObj;
public TestUserService(Address addressObj) {
public UserServiceTest(Address addressObj) {
super();
this.addressObj = addressObj;
}
......
......@@ -4,7 +4,7 @@ import cn.quantgroup.xyqb.Bootstrap;
import cn.quantgroup.xyqb.model.AuthPattern;
import cn.quantgroup.xyqb.model.UserAuthorizedParam;
import com.ctrip.framework.apollo.spring.config.ApolloPropertySourceInitializer;
import demo.BaseParametersTests;
import demo.BaseParametersTest;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.Test;
......@@ -28,11 +28,11 @@ import java.util.Optional;
*/
@Slf4j
@Rollback
@Transactional
@Transactional(rollbackFor = Exception.class)
@RunWith(value = SpringRunner.class)
@SpringBootTest(classes = Bootstrap.class, webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT)
@ContextConfiguration(initializers = ApolloPropertySourceInitializer.class)
public class UserAuthorizedControllerTests extends BaseParametersTests {
public class UserAuthorizedControllerTest extends BaseParametersTest {
@Resource
private TestRestTemplate restTemplate;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment