设计模式之适配器模式

组合模式:

    @Override
    public EdgeNode mock(String userId, String token, String sign) {
        EdgeNode edgeNode = new EdgeNode();
        baseService.service(token, sign, new HashMap<>(), new ServiceWrapper<ResponseDto>() {
            @Override
            public ResponseDto doLogic() {
                ResponseDto responseDto=new ResponseDto();
                EdgeNode edgeNode=new EdgeNode();
                edgeNode.setEdgeNodeIp("127.0.0.1");
                edgeNode.setUserId(userId);
                responseDto.setData(edgeNode);
                return responseDto;
            }
        });
        return edgeNode;
    }

public interface ServiceWrapper<T> {

    /**
     * 业务逻辑处理
     */
    ResponseDto doLogic();
}

基础类

@Service
@Transactional
@Slf4j
public class BaseServiceBoImpl implements BaseService {

    private static final String splitWord = "__";
    private final static Logger logger = LoggerFactory.getLogger(BaseServiceBoImpl.class);

    private String salt = "salt_aies";                    // 盐
    protected String encryptKeyDecode = "encrypt_aies";   // 加密秘钥
    protected String signKeyDecode = "sign_aies";         // 签名秘钥
    private static final int EXPIREDATE = 1;            // token过期时间间隔-天
    private static final String ENCODE = "utf-8";       // 编码

    protected String userDB = "shuzhiping";             //数据库中查询
    protected String secretDB = "password";           //加密后的,数据库中查询,原始:password

    @Override
    public ResponseDto checkTokenAndSign(String token, String sign, Map<String, String> params) {
        logger.info("----checkTokenAndSign----" + params.toString());
        ResponseDto result = new ResponseDto();
        // 1、验证token是否为空
        if (StringUtils.isEmpty(token) || StringUtils.isEmpty(sign)) {
            String code = ErrorEnum.input_null.getCode();
            result.setErrorcode(code);
            result.setErrormsg("\"token or sign is null\"");
            return result;
        }
        String decryptStr = DESUtil.decrypt(token, this.encryptKeyDecode);
        String user = decryptStr.split(splitWord)[0];
        String secret = decryptStr.split(splitWord)[1];
        String timestamp = decryptStr.split(splitWord)[3];

        // secret验证不通过
        if (!secret.equals(secretDB) && !user.equals(userDB)) {
            String code = ErrorEnum.secret_error.getCode();
            result.setErrorcode(code);
            result.setErrormsg(ErrorEnum.getMsg(code));
            return result;
        }
        //验证过期
        int diff_day = (int) ((System.currentTimeMillis() - Long.valueOf(timestamp)) / 1000 / 60 / 60 / 24); // 当前时间与token时间的时间差(天为单位)

        if (diff_day > EXPIREDATE) {
            String code = ErrorEnum.token_expired.getCode();
            result.setErrorcode(code);
            result.setErrormsg(ErrorEnum.getMsg(code));
            return result;
        }

        // 2、验证签名(token和sign不做签名)是否一致
        System.out.println("======" + JSON.toJSONString(params));
        String newSign = SignatureUtil.sign(params, this.signKeyDecode, ENCODE);
        if (!newSign.equals(sign)) {
            String code = ErrorEnum.sign_failure.getCode();
            result.setErrorcode(code);
            result.setErrormsg(ErrorEnum.getMsg(code));
            return result;
        }
        result.setErrorcode(ErrorEnum.ok.getCode());
        return result;
    }

    @Override
    public ResponseDto getToken(String user, String encodeSecret) {
        ResponseDto result = new ResponseDto();
        try {
            String deSecret = DESUtil.decrypt(encodeSecret, this.encryptKeyDecode);// 解密用户的appSecret
            // secret验证不通过
            if (!deSecret.equals(secretDB) && !user.equals(userDB)) {
                String code = ErrorEnum.secret_error.getCode();
                result.setErrorcode(code);
                result.setErrormsg(ErrorEnum.getMsg(code));
                return result;
            }

            String timestamp = String.valueOf(System.currentTimeMillis());
            String token = DESUtil.encrypt(user + splitWord + deSecret + splitWord + salt + splitWord + timestamp, this.encryptKeyDecode);
            String code = ErrorEnum.ok.getCode();
            result.setErrorcode(code);
            result.setErrormsg(ErrorEnum.getMsg(code));
            result.setData(token);
            return result;
        } catch (Exception e) {
            String code = ErrorEnum.unknown_error.getCode();
            result.setErrorcode(code);
            result.setErrormsg(ErrorEnum.getMsg(code));
            return result;
        }

    }

    public ResponseDto checkRequest(Map<String, String> params) {
        ResponseDto result = new ResponseDto();
        String user = params.get("user");
        // 判断必填
        if (StringUtils.isEmpty(user)) {
            String code = ErrorEnum.input_null.getCode();
            result.setErrorcode(code);
            result.setErrormsg(ErrorEnum.getMsg(code));
            return result;
        }
        result.setErrorcode(ErrorEnum.ok.getCode());
        return result;
    }

    @Override
    public void service(String token, String sign, Map<String, String> params,
                        ServiceWrapper<ResponseDto> serviceWrapper) {
        ResponseDto result = new ResponseDto();
        boolean flag = true;
        // 1、校验字段是否为空,如果有错误,只写日志
        result = checkRequest(params);
        if (!"0".equals(result.getErrorcode())) {
            flag = false;
        }
        // 2、校验token和签名,如果有错误,只写日志
        if (flag) {
            result = checkTokenAndSign(token, sign, params);
            if (!"0".equals(result.getErrorcode())) {
                flag = false;
            }
        }
        // 3、验空和token都没问题,执行业务逻辑操作
        if (flag) {
            result = serviceWrapper.doLogic();
        }

        // 4、写日志
        writeLog(params, result);
    }

    @Override
    public boolean checkInWhiteList(String ip) {
//        String ipList = diamondConfigBo.getConfigByBuffer("white_list"); 
//        // 如果请求的IP不在白名单里面,那么不允许访问
//        if (!ipList.contains(ip)) {
//            return false;
//        }
        return true;
    }

    /**
     * 写调用log
     *
     * @param params
     * @param result
     */
    private void writeLog(Map<String, String> params, ResponseDto result) {

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值