需帮忙!!! 用 URL 和 SSLSocket 访问 https 类型的网址出现不同结果!
在主程序,我分别用了 URL 和 SSLSocket 进行测试同一个 HTTPS 地址,
这是测试结果的说明:
(1) 用 URL 可以返回正确的结果.
(2) 用 SSLSocket 总是返回一个 302 的错误信息结果.
注:
(1) 的结果 与 在 IE 浏览器中直接浏览的结果相一致。
(2) SSLSocket 总是返回 302 , 并且从产生的 Header 的 Location 的值可以看出,该值与原测试值相同,
因此,如果程序会重定向的话,就会出现死循环了!
请问有没谁可以帮忙修改一下 SSLSocket 部分的代码,使之可以返回与 URL 一样的结果 ?
thanks!
====================================================
以下是类中在 main 方法的测试源代码.
====================================================
public static void main(String[] args) {
try {
System.out.println("----------------by URL--------------------");
final URL sourceForgeLogin = new URL(
"https://sourceforge.net/account/login.php");
java.io.BufferedReader reader = new java.io.BufferedReader(
new java.io.InputStreamReader(sourceForgeLogin.openStream()));
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println("URL Result Line = " + line);
}
System.out.println("----------------by SSLSocket--------------");
TrustManager[] trustManager = { new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
} };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, trustManager, new SecureRandom());
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
SSLSocket sslSocket = (SSLSocket) sslSocketFactory.createSocket(
sourceForgeLogin.getHost(), 443);
sslSocket.setEnabledCipherSuites(sslSocket
.getSupportedCipherSuites());
sslSocket
.addHandshakeCompletedListener(new HandshakeCompletedListener() {
public void handshakeCompleted(
HandshakeCompletedEvent event) {
System.out.println("Handshake successful.");
System.out.println("Using cipher suite: "
+ event.getCipherSuite());
try {
System.out.println();
System.out
.println("Writing HTTP
get request ...");
System.out.println();
OutputStream outputStream =
event.getSocket()
.getOutputStream();
String getFile = "GET "
+
sourceForgeLogin.getFile()
+ " HTTP/1.1" + "\r\n";
System.out.println(getFile);
outputStream.write(getFile.getBytes());
String getHost = "Host: "
+
sourceForgeLogin.getHost() + ":443"
+ "\r\n";
System.out.println(getHost);
outputStream.write(getHost.getBytes());
outputStream.write("\r\n".getBytes());
outputStream.flush();
System.out
.println("Before reading
the SSLSocket InputStream...");
System.out.println();
java.io.BufferedReader reader2 = new
java.io.BufferedReader(
new
java.io.InputStreamReader(event
.getSocket().getInputStream()));
String line = null;
while ((line = reader2.readLine()) !=
null) {
System.out
.println
("SSLSocket Result Line = "
+
line);
}
System.out.println();
System.out
.println("After reading
the SSLSocket InputStream...");
} catch (Throwable ex) {
ex.printStackTrace();
}
}
});
System.out.println("Starting handshaking...");
sslSocket.startHandshake();
} catch (Throwable ex) {
ex.printStackTrace();
}
}