Java 从 URL 获取请求的文件时遇到问题
Java trouble getting the requested file from a URL
我目前正在为学校开展一个项目,该项目的目标是与 Java 建立 SSL 连接并在 Web 浏览器中显示请求的文件。我目前挂断了尝试捕获请求消息,以便我可以解析它以获取请求文件的名称。
SSL 证书是自签名的,因此 Chrome 和 Internet Explorer 都会发出有关 "suspicious" 站点的警告。但是,此时我的代码已经尝试捕获请求消息,但因遇到 NullPointerException 而失败。
我的代码如下所示:
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(new File(keystore)), keystorepass);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, keypassword);
SSLContext sslcontext = SSLContext.getInstance("TLSv1.2");
sslcontext.init(kmf.getKeyManagers(), null, null);
ServerSocketFactory ssf = sslcontext.getServerSocketFactory();
SSLServerSocket server = (SSLServerSocket)ssf.createServerSocket(65000);
Socket connectionSocket = null;
BufferedReader in = null;
String requestedFile = null;
boolean getRequest = true;
while(getRequest || requestedFile == null)
{
try
{
System.out.println("Web Server: Listening for connection from Web browser");
connectionSocket = server.accept();
System.out.println("Web Server: Connection Established");
in = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
requestedFile = in.readLine();
System.out.println(requestedFile);
getRequest = false;
}
catch(Exception e)
{
connectionSocket.close();
}
if(requestedFile != null)
System.out.println(requestedFile);
//Here is where the NullPointerException occurs
requestedFile = requestedFile.substring(requestedFile.indexOf("GET") + 4,
requestedFile.indexOf("HTTP"));
我做的另一个项目仅使用 HTTP 连接,该项目的目标完全相同,两者之间的唯一区别是使用 SSL 连接。
HTTP 连接请求消息是这样捕获的:
in = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
out = new DataOutputStream(connectionSocket.getOutputStream());
String requestedFile;
requestedFile = in.readLine();
while((in.readLine()).length() > 0);
requestedFile = requestedFile.substring(requestedFile.indexOf("GET") + 4, requestedFile.indexOf("HTTP"));
我尝试在 HTTPS 项目中实现 while 循环,但没有成功。我唯一的想法是,可能由于 Chrome 和 Internet Explorer 的安全性,它没有收到请求,直到我说我想继续访问该站点,而这会丢弃我的代码。 (纯属猜测)
我知道这是一个学校项目,这个社区不喜欢为学生解决家庭作业。因此,在搜索 Whosebug 和大量谷歌搜索之后,在此处发布是最后的选择。如果有人能指出我为什么无法捕获请求的正确方向,将不胜感激。
接受证书使用javax.net.ssl.TrustManager。
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) {
}
}
};
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
}
我目前正在为学校开展一个项目,该项目的目标是与 Java 建立 SSL 连接并在 Web 浏览器中显示请求的文件。我目前挂断了尝试捕获请求消息,以便我可以解析它以获取请求文件的名称。
SSL 证书是自签名的,因此 Chrome 和 Internet Explorer 都会发出有关 "suspicious" 站点的警告。但是,此时我的代码已经尝试捕获请求消息,但因遇到 NullPointerException 而失败。
我的代码如下所示:
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(new File(keystore)), keystorepass);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, keypassword);
SSLContext sslcontext = SSLContext.getInstance("TLSv1.2");
sslcontext.init(kmf.getKeyManagers(), null, null);
ServerSocketFactory ssf = sslcontext.getServerSocketFactory();
SSLServerSocket server = (SSLServerSocket)ssf.createServerSocket(65000);
Socket connectionSocket = null;
BufferedReader in = null;
String requestedFile = null;
boolean getRequest = true;
while(getRequest || requestedFile == null)
{
try
{
System.out.println("Web Server: Listening for connection from Web browser");
connectionSocket = server.accept();
System.out.println("Web Server: Connection Established");
in = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
requestedFile = in.readLine();
System.out.println(requestedFile);
getRequest = false;
}
catch(Exception e)
{
connectionSocket.close();
}
if(requestedFile != null)
System.out.println(requestedFile);
//Here is where the NullPointerException occurs
requestedFile = requestedFile.substring(requestedFile.indexOf("GET") + 4,
requestedFile.indexOf("HTTP"));
我做的另一个项目仅使用 HTTP 连接,该项目的目标完全相同,两者之间的唯一区别是使用 SSL 连接。
HTTP 连接请求消息是这样捕获的:
in = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
out = new DataOutputStream(connectionSocket.getOutputStream());
String requestedFile;
requestedFile = in.readLine();
while((in.readLine()).length() > 0);
requestedFile = requestedFile.substring(requestedFile.indexOf("GET") + 4, requestedFile.indexOf("HTTP"));
我尝试在 HTTPS 项目中实现 while 循环,但没有成功。我唯一的想法是,可能由于 Chrome 和 Internet Explorer 的安全性,它没有收到请求,直到我说我想继续访问该站点,而这会丢弃我的代码。 (纯属猜测)
我知道这是一个学校项目,这个社区不喜欢为学生解决家庭作业。因此,在搜索 Whosebug 和大量谷歌搜索之后,在此处发布是最后的选择。如果有人能指出我为什么无法捕获请求的正确方向,将不胜感激。
接受证书使用javax.net.ssl.TrustManager。
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) {
}
}
};
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
}