LogInHelper.java

package com.yd.dcap.integration.helper;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.yd.dcap.integration.EnvConfig;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.codec.binary.Base64;
import org.glassfish.jersey.jackson.JacksonFeature;

import javax.crypto.Cipher;
import javax.ws.rs.ProcessingException;
import javax.ws.rs.client.*;
import javax.ws.rs.core.MediaType;
import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.X509EncodedKeySpec;

public class LogInHelper {
    public static String getToken(String account, String password) {
        Client client = ClientBuilder.newBuilder().hostnameVerifier((s1, s2) -> true).register(new JacksonFeature()).build();
        WebTarget webTarget = client.target(EnvConfig.base_url + "api/user/getPublicKey");
        Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
        PubKey publicKey = invocationBuilder.get(PubKey.class);

        byte[] decoded = Base64.decodeBase64(publicKey.data);
        RSAPublicKey pubKey;
        for (int i = 0; i < 3; i++) {
            try {
                pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
                Cipher cipher = Cipher.getInstance("RSA");
                cipher.init(Cipher.ENCRYPT_MODE, pubKey);
                String outStr = Base64.encodeBase64String(cipher.doFinal(password.getBytes(StandardCharsets.UTF_8)));
                LoginData loginData = new LoginData(account, outStr);
                LoginResponse loginResponse = client.target(EnvConfig.base_url + "api/login")
                        .request(MediaType.APPLICATION_JSON)
                        .post(Entity.entity(loginData, MediaType.APPLICATION_JSON), LoginResponse.class);
                return loginResponse.data.token;
            } catch (ProcessingException ex) {
                ex.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
        return null;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class PubKey {
        private int code;
        private String data;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class LoginData {
        private String account;
        public String password;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class LoginResponse {
        public int code;
        public LoginResponseData data;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class LoginResponseData {
        public String token;
    }
}

 

PlatformClient.java

package com.yd.dcap.integration.helper;

import com.yd.dcap.integration.EnvConfig;
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.client.ClientProperties;
import org.glassfish.jersey.jackson.JacksonFeature;

import javax.ws.rs.ProcessingException;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.core.MediaType;
import java.util.HashMap;
import java.util.Map;

public class PlatformClient {
    //private Invocation.Builder builder;
    String token;

    public PlatformClient(String userName, String password) {
        token = LogInHelper.getToken(userName, password);
    }

    private Invocation.Builder getBuilder(String path) {
        ClientConfig configuration = new ClientConfig();
        configuration = configuration.property(ClientProperties.CONNECT_TIMEOUT, 30000);
        configuration = configuration.property(ClientProperties.READ_TIMEOUT, 30000);
        Client client = ClientBuilder.newBuilder().withConfig(configuration).hostnameVerifier((s1, s2) -> true).register(new JacksonFeature()).build();
        return client.target(EnvConfig.base_url).path(path)
                .request(MediaType.APPLICATION_JSON)
                .header("token", token);
    }

    public <T> T doPostRequest(String url, Object payload, Class<T> klass) {
        Invocation.Builder invoker = this.getBuilder(url);
        try {
            return invoker.post(Entity.entity(payload, MediaType.APPLICATION_JSON), klass);
        } catch (ProcessingException ex) {
            return invoker.post(Entity.entity(payload, MediaType.APPLICATION_JSON), klass);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public <T> T doPostRequest(String url, Object payload, String mtype, Class<T> klass) {
        Invocation.Builder invoker = this.getBuilder(url);
        try {
            return invoker.post(Entity.entity(payload, mtype), klass);
        } catch (ProcessingException ex) {
            return invoker.post(Entity.entity(payload, mtype), klass);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public <T> T doGetRequest(String url, Class<T> klass) {
        Invocation.Builder invoker = this.getBuilder(url);
        try {
            return invoker.get(klass);
        } catch (ProcessingException ex) {
            return invoker.get(klass);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    static Map<String, PlatformClient> clientMap = new HashMap<>();

    public static PlatformClient getClient(String userName, String password) {
        return clientMap.computeIfAbsent(userName, k -> new PlatformClient(userName, password));
    }
}

 

原文地址:http://www.cnblogs.com/panda4671/p/16837573.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性