瀏覽代碼

调整hos-camel的gateway结构

Airhead 8 年之前
父節點
當前提交
d6c603dca0

+ 84 - 31
hos-camel/src/main/java/gateway/processor/GatewayProcessor.java

@ -1,10 +1,13 @@
package gateway.processor;
import com.yihu.hos.core.datatype.DateUtil;
import com.yihu.hos.core.datatype.StringUtil;
import org.apache.camel.Body;
import org.apache.camel.Exchange;
import org.apache.camel.Header;
import org.apache.camel.Message;
import org.apache.camel.Processor;
import java.sql.Date;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
@ -13,41 +16,31 @@ import java.util.stream.Stream;
public class GatewayProcessor implements Processor {
    public void process(Exchange exchange) throws Exception {
        Message outMessage = exchange.getOut();
        String queryString = exchange.getIn().getHeader(Exchange.HTTP_QUERY, String.class);
        Map<String, String> map = Stream.of(queryString.split("&")).map(obj -> obj.split("=")).collect(Collectors.toMap(entry -> entry[0], entry -> entry[1]));
        String api = map.get("api");                     // API接口名称
        String sign = map.get("sign");                     // 簽名
        String timestamp = map.get("timestamp");        // 时间戳
        String appKey = map.get("appKey");               // HOP分配给应用的AppKey ,创建应用时可获得
        String version = map.get("v");                   // API协议版本
        String param = map.get("param");
        if (api != null && timestamp != null && appKey != null && version != null && param != null) {
    }
            ParamVerifyBean paramSign = new ParamVerifyBean();
            paramSign.setApi(api);
            paramSign.addParam(map);
            paramSign.genParam();
            String md5Sign = paramSign.signParam();
            if (!md5Sign.equals(sign)) {
                //TODO  签名认证未通过
                System.out.println("传递的签名:" + sign);
                System.out.println("生成的签名:" + md5Sign);
                return;
            } else {
                System.out.println("签名验证通过,验证API权限");
                exchange.getOut().setHeader("api", api);
            }
            //TODO api权限验证
    public String route(@Body String body) {
        Map<String, String> params = parseBody(body);
        boolean pass = checkParams(params);
        if (!pass) {
            return "jetty:http://0.0.0.0:9999/error/paramError";    //TODO:
        }
        pass = checkTimeStamp(params);
        if (!pass) {
            return "jetty:http://0.0.0.0:9999/error/outdataError";    //TODO:
        }
        } else {
            return;
        pass = checkSign(params);
        if (pass) {
            return "jetty:http://0.0.0.0:9999/error/signValidError";    //TODO:
        }
    }
        pass = checkAuthorized(params);
        if (pass) {
            return "jetty:http://0.0.0.0:9999/error/unauthorizedError";    //TODO:
        }
    public String route(@Header("api") String api) {
        String api = params.get("api");
        Map<String, String> apiRouters = new HashMap<>();
        if (api == null) {
            System.out.println("api参数为null");
@ -60,5 +53,65 @@ public class GatewayProcessor implements Processor {
        return apiRouters.get(api);
    }
    private boolean checkParams(Map<String, String> params) {
        String api = params.get("api");                     // API接口名称
        String sign = params.get("sign");                     // 簽名
        String timestamp = params.get("timestamp");        // 时间戳
        String appKey = params.get("appKey");               // HOP分配给应用的AppKey ,创建应用时可获得
        String version = params.get("v");                   // API协议版本
        return !(StringUtil.isEmpty(api) || StringUtil.isEmpty(timestamp)
                || StringUtil.isEmpty(appKey) || StringUtil.isEmpty(version)
                || StringUtil.isEmpty(sign));
    }
    private boolean checkTimeStamp(Map<String, String> params) {
        final long ONE_MIN = 60000; //millisecond
        String timestamp = params.get("timestamp");
        Date ts = DateUtil.toDateFromTime(timestamp);
        if (ts == null){
            return false;   //时间格式不正确
        }
        Calendar date = Calendar.getInstance();
        long timeInMillis = date.getTimeInMillis();
        Date min = new Date(timeInMillis - 5 * ONE_MIN);
        Date max = new Date(timeInMillis + 5 * ONE_MIN);
        return ts.after(min) && ts.before(max);
    }
    private boolean checkSign(Map<String, String> params) {
        try {
            String sign = params.get("sign");                     // 簽名
            ParamVerifyBean paramSign = new ParamVerifyBean();
            paramSign.addParam(params);
            paramSign.genParam();
            String md5Sign = paramSign.signParam();
            if (!md5Sign.equals(sign)) {
                System.out.println("传递的签名:" + sign);
                System.out.println("生成的签名:" + md5Sign);
                return false;
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    private boolean checkAuthorized(Map<String, String> params) {
        return true;
    }
    private Map<String, String> parseBody(String body) {
        return Stream.of(body.split("&")).map(obj -> obj.split("="))
                .collect(Collectors.toMap(entry -> entry[0], entry -> entry[1]));
    }
}

+ 57 - 56
hos-camel/src/main/java/gateway/processor/ParamVerifyBean.java

@ -28,9 +28,15 @@ public class ParamVerifyBean {
    private String appSecret = "esb-secret";
    private String token;
    public static void main(String[] args) throws Exception {
        ParamVerifyBean paramSignUtil = new ParamVerifyBean();
        paramSignUtil.setApi("collect");
        paramSignUtil.addParam("patientId", "11111", true);
        paramSignUtil.addParam("eventNo", "2222222", true);
        paramSignUtil.genParam();
        String s = paramSignUtil.signParam();
        System.out.println(s);
    public void setToken(String token) {
        this.token = token;
    }
    public void setApi(String api) {
@ -41,45 +47,8 @@ public class ParamVerifyBean {
        this.gatewayUrl = gatewayUrl;
    }
    /**
     *   TODO 无用可删除
     * 获取完整请求地址
     * @return
     */
    private String completeUrl() {
        try {
            addParam("api", api, true);
            addParam("param", genParam(), false);
            addParam("appKey", appKey, true);
            addParam("token", token, false);
            addParam("v", version, true);
            addParam("timestamp", getTimestamp(), false);
            addParam("sign", signParam(), true);
            String completeUrl = gatewayUrl + genParam();
            return completeUrl;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    private void addParam(String paramName, String paramValue, boolean bMust) throws Exception {
        if (StringUtil.isEmpty(paramValue)) {
            if (bMust) {
                throw new Exception(paramName + "参数不能为空.");
            } else {
                return;
            }
        }
        String encodeValue = URLEncoder.encode(paramValue, "UTF-8");
        paramMap.put(paramName, encodeValue);
    }
    public void addParam(Map<String,String> params) throws Exception {
        if (params !=null) {
    public void addParam(Map<String, String> params) throws Exception {
        if (params != null) {
            params.remove("sign");
            Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator();
            while (iterator.hasNext()) {
@ -90,13 +59,14 @@ public class ParamVerifyBean {
                paramMap.put(key, encodeValue);
            }
        }else {
        } else {
            return;
        }
    }
    /**
     * sign 签名生成  (   md5(secret + params拼接字符串 + secret)   )
     *
     * @return
     */
    public String signParam() {
@ -122,7 +92,8 @@ public class ParamVerifyBean {
    }
    /**
     *  http请求 参数拼接
     * http请求 参数拼接
     *
     * @return
     * @throws Exception
     */
@ -150,14 +121,56 @@ public class ParamVerifyBean {
        return builder.toString();
    }
    //TODO 获取应用token
    public String getToken() {
        return null;
    }
    public void setToken(String token) {
        this.token = token;
    }
    /**
     * TODO 无用可删除
     * 获取完整请求地址
     *
     * @return
     */
    private String completeUrl() {
        try {
            addParam("api", api, true);
            addParam("param", genParam(), false);
            addParam("appKey", appKey, true);
            addParam("token", token, false);
            addParam("v", version, true);
            addParam("timestamp", getTimestamp(), false);
            addParam("sign", signParam(), true);
            String completeUrl = gatewayUrl + genParam();
            return completeUrl;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    private void addParam(String paramName, String paramValue, boolean bMust) throws Exception {
        if (StringUtil.isEmpty(paramValue)) {
            if (bMust) {
                throw new Exception(paramName + "参数不能为空.");
            } else {
                return;
            }
        }
        String encodeValue = URLEncoder.encode(paramValue, "UTF-8");
        paramMap.put(paramName, encodeValue);
    }
    /**
     * 获取 ISO 8601格式的时间戳
     *
     * @return
     */
    private String getTimestamp() {
@ -167,16 +180,4 @@ public class ParamVerifyBean {
        return timestamp;
    }
    public static void main(String[] args) throws Exception {
        ParamVerifyBean paramSignUtil = new ParamVerifyBean();
        paramSignUtil.setApi("collect");
        paramSignUtil.addParam("patientId","11111",true);
        paramSignUtil.addParam("eventNo","2222222",true);
        paramSignUtil.genParam();
        String s = paramSignUtil.signParam();
        System.out.println(s);
    }
}