瀏覽代碼

Merge branch 'master' of http://192.168.1.220:10080/esb/esb

# Conflicts:
#	hos-camel/src/main/java/gateway/processor/GatewayProcessor.java
Airhead 8 年之前
父節點
當前提交
88732b71a7

+ 53 - 3
hos-camel/src/main/java/gateway/processor/GatewayProcessor.java

@ -1,14 +1,64 @@
package gateway.processor;
import org.apache.camel.Exchange;
import org.apache.camel.Header;
import org.apache.camel.Message;
import org.apache.camel.Processor;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
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权限验证
        } else {
            return;
        }
    }
    public String route(Exchange exchange) {
        String query = (String)exchange.getIn().getHeader(Exchange.HTTP_QUERY);
        return null;
    public String route(@Header("api") String api) {
        Map<String, String> apiRouters = new HashMap<>();
        if (api == null) {
            System.out.println("api参数为null");
        } else if (api.equals("secret")) {
            apiRouters.put("secret", "restlet:http://sdw2:10000/api/v1.0/admin/apps/Y3hpgpMRyI");
        } else {
            return null;
        }
        return apiRouters.get(api);
    }
}

+ 182 - 0
hos-camel/src/main/java/gateway/processor/ParamVerifyBean.java

@ -0,0 +1,182 @@
package gateway.processor;
import com.yihu.hos.core.datatype.StringUtil;
import com.yihu.hos.core.encrypt.MD5;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
/**
 * @author HZY
 * @vsrsion 1.0
 * Created at 2017/3/15.
 */
public class ParamVerifyBean {
    private final String version = "1.0";
    private TreeMap<String, String> paramMap = new TreeMap<>();
    private String timestamp;
    //TODO 配置文件中配置
    private String gatewayUrl = "seb-gatewayUrl";
    private String api;
    private String appKey = "esb-key";
    private String appSecret = "esb-secret";
    private String token;
    public void setToken(String token) {
        this.token = token;
    }
    public void setApi(String api) {
        this.api = api;
    }
    public void setGatewayUrl(String gatewayUrl) {
        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) {
            params.remove("sign");
            Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry<String, String> next = iterator.next();
                String key = next.getKey();
                String value = next.getValue();
                String encodeValue = URLEncoder.encode(value, "UTF-8");
                paramMap.put(key, encodeValue);
            }
        }else {
            return;
        }
    }
    /**
     * sign 签名生成  (   md5(secret + params拼接字符串 + secret)   )
     * @return
     */
    public String signParam() {
        Iterator<Map.Entry<String, String>> iterator = paramMap.entrySet().iterator();
        StringBuilder builder = new StringBuilder();
        builder.append(appSecret);
        while (iterator.hasNext()) {
            Map.Entry<String, String> next = iterator.next();
            String key = next.getKey();
            String value = next.getValue();
            builder.append(key);
            builder.append(value);
        }
        builder.append(appSecret);
        try {
            return MD5.hash(builder.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     *  http请求 参数拼接
     * @return
     * @throws Exception
     */
    public String genParam() throws Exception {
        Iterator<Map.Entry<String, String>> iterator = paramMap.entrySet().iterator();
        StringBuilder builder = new StringBuilder();
        while (iterator.hasNext()) {
            Map.Entry<String, String> next = iterator.next();
            String key = next.getKey();
            String value = next.getValue();
            if (value == null) {
                throw new Exception("参数错误:参数" + key + "值为空.");
            }
            if (builder.length() == 0) {
                builder.append("?");
            } else {
                builder.append("&");
            }
            builder.append(key);
            builder.append("=");
            builder.append(URLEncoder.encode(value, "UTF-8"));
        }
        return builder.toString();
    }
    //TODO 获取应用token
    public String getToken() {
        return null;
    }
    /**
     * 获取 ISO 8601格式的时间戳
     * @return
     */
    private String getTimestamp() {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SSZ");
        timestamp = format.format(new Date());
        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);
    }
}

+ 23 - 0
hos-camel/src/main/java/gateway/route/GateWayRouter.java

@ -0,0 +1,23 @@
package gateway.route;
import gateway.processor.GatewayProcessor;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;
/**
 * @author HZY
 * @vsrsion 1.0
 * Created at 2017/3/13.
 */
@Component
public class GateWayRouter extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        from("jetty:http://localhost:8888/api/v1").routeId("mock:collect")
                .process(new GatewayProcessor())
                .routingSlip(method(GatewayProcessor.class,"route"));
//                .dynamicRouter(method(DynamicRouterBean.class, "slip"));
    }
}

+ 45 - 0
hos-rest/src/main/java/com/yihu/hos/rest/services/crawler/EsbHttp.java

@ -72,6 +72,51 @@ public class EsbHttp {
        }
    }
    /**
     * 获取app secret
     * @return
     */
    public static String getSecret() {
        try {
            String loginAction = EHRHttpHelper.defaultHttpUrl + "/apps/" + EHRHttpHelper.clientId;
            Map<String, String> header = new HashMap<>();
            header.put("Authorization", "Basic " + EHRHttpHelper.clientKey);
            //本地指纹
            Map<String, String> params = new HashMap<>();
            params.put("info", "{\"fingerprint\": \"" + GetFingerprint() + "\"}");
            HTTPResponse response = EHRHttpHelper.put(loginAction, params, header);
            if (response != null && response.getStatusCode() == HttpStatus.SC_OK) {
                JSONObject obj = new JSONObject(response.getBody());
                //判断是否成功
                if (Boolean.parseBoolean(obj.get("successFlg").toString())){
                    JSONObject app = obj.getJSONObject("obj");
                    if (app.has("secret")) {
                        return app.getString("secret");
                    } else {
                        logger.info("返回未包含secret。");
                        return null;
                    }
                }else {
                    logger.info("获取secret 请求失败。");
                    return null;
                }
            } else {
                String msg = "获取secret失败。";
                if (response != null) {
                    msg += "(错误代码:" + response.getStatusCode() + ",错误信息:" + response.getBody() + ")";
                }
                logger.info(msg);
                return null;
            }
        } catch (Exception ex) {
            logger.info("获取Token失败," + ex.getMessage());
            return null;
        }
    }
    /**
     * 应用登录验证
     */