Java 无法从 URL 获取请求的文件

标签 java sockets ssl httpwebrequest

我目前正在为学校开展一个项目,该项目的目标是与 Java 建立 SSL 连接并在 Web 浏览器中显示请求的文件。我目前挂断了 try catch 请求消息,以便我可以解析它以获取请求文件的名称。

SSL 证书是自签名的,因此 Chrome 和 Internet Explorer 都会发出有关“可疑”网站的警告。但是,此时我的代码已经 try catch 请求消息,但因遇到 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 的安全性,它可能没有收到请求,直到我说我想继续访问该站点,它才会发送它,这会丢弃我的代码。 (纯属猜测)

我知道这是一个学校项目,这个社区不喜欢为学生解决家庭作业。因此,在搜索 StackOverflow 和大量谷歌搜索之后,在此处发布是最后的选择。如果有人能指出我为什么无法捕获请求的正确方向,将不胜感激。

最佳答案

接受证书使用 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 无法从 URL 获取请求的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29956523/

相关文章:

Java 可观察接口(interface)

c# - 无法在每个其他请求中创建 SSL/TLS 安全通道

ssl - 如何在 centos 7 上的 apache 2.4 上禁用密码 CBC

java - 如何将 "combine"JButton 与 JComboBox 一起使用?

java - Spring 4.1 MVC 未将我的 Ajax Json 调用分派(dispatch)到我的 Controller 方法,出现 404 Not Found 错误

reactjs - Socket.io 适用于 localhost 但不适用于 heroku 部署

java - Java套接字-关闭与服务器套接字的telnet客户端连接

将 32 位网络命令转换为 C 中的主机

Azure 应用服务突然 SSL 证书无效

java - 以管理员身份发布到 Facebook 页面