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 楼答案
是的,成功了。这是一个结果类
以及在android活动中使用该类:
当然,您可以通过添加setHeader()功能来扩展这个类。但在我看来,这不是必要的