Я думаю, что кэширование запросов в Hash и доступ к хешу в отдельном GET-запросе, включающем параметр page и request id, должны быть в порядке.
Вот мое решение, которое включает в себя некоторые идеи из этого потока и скомпилировано вместе с кодом из сети. Все, что я вызываю, - это функция, и она устанавливает по умолчанию Trust Manager и HostName Verifier для HttpsURLConnection. Для некоторых это может быть нежелательно, потому что это повлияет на все HttpsURLConnections, но я просто пишу простой прокси, чтобы он работал у меня.
private void setTrustAllCerts() throws Exception
{
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted( java.security.cert.X509Certificate[] certs, String authType ) { }
public void checkServerTrusted( java.security.cert.X509Certificate[] certs, String authType ) { }
}
};
// Install the all-trusting trust manager
try {
SSLContext sc = SSLContext.getInstance( "SSL" );
sc.init( null, trustAllCerts, new java.security.SecureRandom() );
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(
new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
return true;
}
});
}
catch ( Exception e ) {
//We can not recover from this exception.
e.printStackTrace();
}
}
Вероятно, необходимо установить a HostnameVerifier
. Перед соединением Вы должны добавить его к объекту соединения
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
// check hostname/session
return true;
}
});
conn.connect();
// read/write...
Конечно, существуют некоторые реализации там при необходимости в том. Вы могли бы хотеть посмотреть на проект HttpClient также.
Другая вещь посмотреть на TrustManager
Вы используете. Сообщение об ошибке предполагает, что сертификат, представленный сервером, не подписывается доверяемым корнем. Так как у Вас нет прямого управления сокетом SSL, который создается, я думаю, что Ваш лучший выбор состоит в том, чтобы инициализировать Ваше собственное SSLContext
с a TrustManager
это было установкой с корневым CA цепочки сертификата сервера. Затем установите этот контекст по умолчанию.
Это предполагает использование Java 6. API более ограничен в Java 5. Можно получить значение по умолчанию SSLSocketFactory
, но нет никакого стандартного способа установить его.
Проблема, на которую это жалуется, состоит в том, что при создании соединения SSL сервер должен представить действительный сертификат клиенту. Можно записать соответствующую конечную точку в Java (HTTPServerSocket сделает это, я думаю), но требовалось бы некоторое взламывание, собирающееся настраивать его. Вероятно, легче настроить локальный веб-сервер с чем-либо, что обрабатывает SSL правильно---Apache, lighttp, безотносительно---, и создайте самоподписанный сертификат с помощью openssl инструментов.
ОбновленныйВот пример из Альманаха Java. http://www.exampledepot.com/egs/javax.net.ssl/Server.html
Сокет сервера SSL требует сертификатов, которые он отправит клиентам для аутентификации. Сертификаты должны содержаться в keystore, местоположение которого должно быть явно указано (нет никакого значения по умолчанию). Следование примеру, который мы описываем, как создать и указать keystore для сокета сервера SSL для использования.
try {
int port = 443;
ServerSocketFactory ssocketFactory = SSLServerSocketFactory.getDefault();
ServerSocket ssocket = ssocketFactory.createServerSocket(port);
// Listen for connections
Socket socket = ssocket.accept();
// Create streams to securely send and receive data to the client
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
// Read from in and write to out...
// Close the socket
in.close();
out.close();
} catch(IOException e) {
}
Укажите keystore сертификатов с помощью javax.net.ssl.keyStore системного свойства:
> java -Djavax.net.ssl.keyStore=mySrvKeystore -Djavax.net.ssl.keyStorePassword=123456 MyServer
Это может также помочь Вам добавить сертификат, который localhost сервер использует (я предполагаю, что это самоподписывается) к keystore JVM, с помощью "keytool" утилиты. Это должно иметь эффект сообщения JVM, "можно доверять этому сертификату".
Я закончил тем, что выполнил статический метод (только на dev), который устанавливает очень доверчивый TrustManager (принимает все), и также добавил hostnameVerifier, который всегда возвращает true (благодарит sblundy).