有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java存储SSLSocketFactory为静态字段

在我的安卓项目中,我使用以下代码片段在几个活动中连接到tomcat服务器,我想将其移动到另一个类中——封装此代码片段。通过封装,我不必像以前那样通过每个连接加载和创建证书、密钥库和信任库

        URL url;
        HttpsURLConnection connection = null;
        try {
            // Load CAs from an InputStream
            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            InputStream caInput = new BufferedInputStream(getAssets().open("my_certificate.crt"));
            Certificate ca = cf.generateCertificate(caInput);

            // Create a KeyStore containing our trusted CAs
            String keyStoreType = KeyStore.getDefaultType();
            KeyStore keyStore = KeyStore.getInstance(keyStoreType);
            keyStore.load(null, null);
            keyStore.setCertificateEntry("ca", ca);

            // Create a TrustManager that trusts the CAs in our KeyStore
            String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
            TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
            tmf.init(keyStore);

            // Create an SSLContext that uses our TrustManager
            SSLContext context = SSLContext.getInstance("TLS");
            context.init(null, tmf.getTrustManagers(), null);

            String urlParameters = SOME_PARAMETERS;
            url = new URL(SOME_URL);
            connection = (HttpsURLConnection) url.openConnection();
            connection.setSSLSocketFactory(context.getSocketFactory());

            connection.setUseCaches(false);
            connection.setDoInput(true);
            connection.setDoOutput(true);

            connection.setRequestMethod("POST");
            connection.setFixedLengthStreamingMode(urlParameters.getBytes().length);
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

            PrintWriter out = new PrintWriter(connection.getOutputStream());
            out.print(urlParameters);
            out.close();

我将前4个子段移到新类的方法中,并将第一次调用的结果存储为静态字段,这样可以吗?范例

public class ConnectionPreparer {
    private static SSLSocketFactory sslSocketFactory;
    private Context context;
    public ConnectionPreparer (Context context){
        this.context = context;
    }
    private SSLSocketFactory getSSLSocketFactory(){
        if(sslSocketFactory==null){
            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            InputStream caInput = new BufferedInputStream(context.getAssets().open("my_certificate.crt"));
            Certificate ca = cf.generateCertificate(caInput);

            // Create a KeyStore containing our trusted CAs
            String keyStoreType = KeyStore.getDefaultType();
            KeyStore keyStore = KeyStore.getInstance(keyStoreType);
            keyStore.load(null, null);
            keyStore.setCertificateEntry("ca", ca);

            // Create a TrustManager that trusts the CAs in our KeyStore
            String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
            TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
            tmf.init(keyStore);

            // Create an SSLContext that uses our TrustManager
            SSLContext context = SSLContext.getInstance("TLS");
            context.init(null, tmf.getTrustManagers(), null);

            sslSocketFactory = context.getSocketFactory();
        }
        return sslSocketFactory;
    }
    public HttpsURLConnection prepareConnection(){
        URL url = SOME_URL;            
        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
        connection.setSSLSocketFactory(getSSLSocketFactory());
        // and so on
    }
}

如果不可以,为什么?如果一切顺利,我会很高兴

谢谢你的关注


共 (1) 个答案

  1. # 1 楼答案

    是的,成功了。这是一个结果类

    import android.content.Context;
    import android.util.Log;
    
    import java.io.BufferedInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.PrintWriter;
    import java.io.UnsupportedEncodingException;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLEncoder;
    import java.security.KeyStore;
    import java.security.cert.Certificate;
    import java.security.cert.CertificateFactory;
    import java.util.Scanner;
    
    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSocketFactory;
    import javax.net.ssl.TrustManagerFactory;
    
    /**
     * Created by Rinomancer on 20.08.2015.
     */
    public class ConnectionBuilder {
        private static SSLSocketFactory sslSocketFactory;
        private Context context;
        private URL url;
        private String parameters = "";
        private String response;
        private HttpsURLConnection connection;
    
        public ConnectionBuilder() {
    
        }
    
        public ConnectionBuilder(Context context, URL url) {
            this.context = context;
            this.url = url;
        }
    
        private SSLSocketFactory getSSLSocketFactory() throws Exception {
            if (sslSocketFactory == null) {
                CertificateFactory cf = CertificateFactory.getInstance("X.509");
                InputStream caInput = new BufferedInputStream(context.getAssets().open("my_certificate.crt"));
                Certificate ca = cf.generateCertificate(caInput);
    
                // Create a KeyStore containing our trusted CAs
                String keyStoreType = KeyStore.getDefaultType();
                KeyStore keyStore = KeyStore.getInstance(keyStoreType);
                keyStore.load(null, null);
                keyStore.setCertificateEntry("ca", ca);
    
                // Create a TrustManager that trusts the CAs in our KeyStore
                String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
                TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
                tmf.init(keyStore);
    
                // Create an SSLContext that uses our TrustManager
                SSLContext context = SSLContext.getInstance("TLS");
                context.init(null, tmf.getTrustManagers(), null);
    
                sslSocketFactory = context.getSocketFactory();
            }
            return sslSocketFactory;
        }
    
        public ConnectionBuilder connect() throws Exception {
            connection = null;
            try {
                connection = (HttpsURLConnection) url.openConnection();
                connection.setSSLSocketFactory(getSSLSocketFactory());
                connection.setConnectTimeout(5000);
    
                connection.setUseCaches(false);
                connection.setDoInput(true);
                connection.setDoOutput(true);
    
                connection.setRequestMethod("POST");
                connection.setFixedLengthStreamingMode(parameters.getBytes().length);
                connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                if (sessionId != null && !sessionId.isEmpty()) {
                    connection.setRequestProperty("Session-Id", sessionId);
                }
    
                PrintWriter out = new PrintWriter(connection.getOutputStream());
                out.print(parameters);
                out.close();
    
                String response = "";
                Scanner inStream = new Scanner(connection.getInputStream());
                while (inStream.hasNextLine()) {
                    response += inStream.nextLine();
                }
                this.response = response;
    
                return this;
            } finally {
                if (connection != null) {
                    connection.disconnect();
                }
            }
        }
    
        public ConnectionBuilder context(Context context) {
            this.context = context;
            return this;
        }
    
        public ConnectionBuilder url(URL url) {
            this.url = url;
            return this;
        }
    
        public ConnectionBuilder url(String url) throws MalformedURLException {
            this.url = new URL(url);
            return this;
        }
    
        public ConnectionBuilder parameter(String parameter, String value) throws UnsupportedEncodingException {
            if (parameters.isEmpty()) {
                parameters = parameter + "=" + URLEncoder.encode(value, "UTF-8");
            } else {
                parameters += "&" + parameter + "=" + URLEncoder.encode(value, "UTF-8");
            }
            return this;
        }
    
        public String getResponse() {
            return response;
        }
    
        public String getHeader(String headerName) {
            return connection.getHeaderField(headerName);
        }
    
        public int getStatusCode() throws IOException{
            return connection.getResponseCode();
        }
    }
    

    以及在android活动中使用该类:

    try {
        ConnectionBuilder cb = new ConnectionBuilder().context(getApplicationContext()).url(YOUR_URL).parameter("parameterName",parameterValue).parameter("anotherParameter",itsValue).connect();
        result = cb.getResponse();
        } catch (Exception e){
            e.printStackTrace();
        }
    

    当然,您可以通过添加setHeader()功能来扩展这个类。但在我看来,这不是必要的