需帮忙!!! 用 URL 和 SSLSocket 访问 https 类型的网址出现不同结果!

wealth 2007-06-14 12:01:26

在主程序,我分别用了 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();
}
}
...全文
273 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
a_nuo 2007-06-17
  • 打赏
  • 举报
回复
学习!
wealth 2007-06-14
  • 打赏
  • 举报
回复
====================================================
以下是上面 main 运行所产生的输出结果:
====================================================




----------------by URL--------------------
URL Result Line = <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
URL Result Line = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
URL Result Line = <!-- Server: sf-web23 -->
URL Result Line = <!--
URL Result Line = ~ SourceForge.net: Create, Participate, Evaluate
URL Result Line = ~ Copyright (c) 1999-2007 OSTG, Inc. All rights reserved.
URL Result Line = ~ @version $Id: header.html 13594 2007-06-04 17:47:21Z avoigt $
URL Result Line = -->
URL Result Line =
URL Result Line = <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
URL Result Line = <head>
URL Result Line = <meta http-equiv="content-type" content="text/html; charset=utf-8" />
URL Result Line = <meta name="description" content="The world's largest development and download repository of Open Source code and applications" />
URL Result Line = <meta name="keywords" content="Open Source, Development, Developers, Projects, Downloads, OSTG, VA Software, SF.net, SourceForge" />
URL Result Line = <link rel="alternate" type="application/rss+xml" title="SourceForge.net Project News" href="http://sourceforge.net/export/rss2_sfnews.php?group_id=1&rss_fulltext=1" />
URL Result Line = <link rel="alternate" type="application/rss+xml" title="SourceForge.net News" href="http://sourceforge.net/export/rss2_projnews.php?group_id=141424&rss_fulltext=1" />

(此处因为长度太长,删减部分)


URL Result Line =
URL Result Line =
URL Result Line = </body>
URL Result Line = </html>
URL Result Line =
----------------by SSLSocket--------------
Starting handshaking...
Handshake successful.
Using cipher suite: SSL_RSA_WITH_RC4_128_MD5

Writing HTTP get request ...

GET /account/login.php HTTP/1.1

Host: sourceforge.net:443

Before reading the SSLSocket InputStream...

SSLSocket Result Line = HTTP/1.1 302 Found
SSLSocket Result Line = X-Powered-By: PHP/5.2.1
SSLSocket Result Line = Expires: Wed, 11 Nov 1998 11:11:11 GMT
SSLSocket Result Line = Cache-Control: must-revalidate
SSLSocket Result Line = X-SFX-Webhead: sf-web23
SSLSocket Result Line = X-SFX-Revision: release_20070521
SSLSocket Result Line = Location: https://sourceforge.net/account/login.php
SSLSocket Result Line = Content-type: text/html
SSLSocket Result Line = Content-Length: 0
SSLSocket Result Line = Date: Thu, 14 Jun 2007 03:28:50 GMT
SSLSocket Result Line = Server: lighttpd/1.4.15
SSLSocket Result Line =

After reading the SSLSocket InputStream...

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧