【问题标题】:Uploading a file from java using HTTP connection使用 HTTP 连接从 java 上传文件
【发布时间】:2012-01-08 16:32:29
【问题描述】:

我正在尝试从在浏览器中运行的小程序上传文件(日志文件)。我正在读取字符串中的文件。下面的函数,给定一个字符串数据和一个字符串 URL(例如:http://192.168.0.166:8380/app/customer/UploadData.do),将数据上传到一个 URL。因为,超时后,与服务器的会话丢失。因此,我在 URL 中附加了用户名和密码,以避免任何会话过期问题(因为此上传应该是自动的,无需任何手动输入等)。 URL(非公开)看起来像:

http://192.168.0.166:8380/app/customer/UploadData.do?username=uname&password=pword

public static void sendData(String aData, String aURL) throws Exception {
    try {
        byte[] myData = aData.getBytes();
        /* Uploading the data */
        URL myURL = new URL(aURL);
        HttpURLConnection myConnection = (HttpURLConnection) myURL.openConnection();
        myConnection.setDoOutput(true);
        myConnection.setUseCaches(false);
        myConnection.setDefaultUseCaches(false);
        myConnection.setRequestProperty("Content-type", "application/octet-stream");
        OutputStream myOutputStream = myConnection.getOutputStream();
        myOutputStream.write(myData);
        myOutputStream.flush();
        myOutputStream.close();

        int status = ((HttpURLConnection) myConnection).getResponseCode();

    } catch (Exception exception) {
        throw exception
    }
}

只要与服务器的会话处于活动状态,此功能就可以正常工作。例如,当会话过期或用户注销(小程序 24/7 运行)时,它不起作用。请注意,通过 Web 浏览器访问时,上述 URL 可以正常工作。它的这个java代码(小程序)在会话到期时无法再次连接。如果有人能指出我在这里做错了什么,那将有很大帮助。任何帮助将不胜感激。

环境: Jboss 作为应用服务器,JBoss Secured Realm 用于登录。

【问题讨论】:

  • 没有答案。 (这不是 HTTP POST。)我不得不考虑会话 cookie。也许您应该先单独登录,然后使用会话 cookie/url 重写。 setDoInput(false) 不会受伤。
  • @Joop Eggen:感谢指正,我更新了标题。

标签: java http upload


【解决方案1】:

您查询的网页是否接受登录并根据您发送的用户名/密码参数创建新会话?

如果用户通过标准方法登录网站(例如,他们在浏览器中输入详细信息的登录页面),那么这将创建一个 cookie,该 cookie 会来回发送,将他们标识为该网站的“所有者”该会话并对其进行身份验证(直到超时)。如果他们随后运行您的小程序,那么您的小程序将最终捎带该会话和 cookie,直到它过期。

如果它确实过期,您的小程序将需要执行与用户登录相同的操作,很可能对登录页面执行 HTTP POST,除非上传页面明确接受用户名和密码并且不需要会话或创建一个然后你正在尝试的将不起作用。

您可以查看表单的登录页面,并让您的小程序查询该页面,解析 cookie 的输出 HTTP 标头并将其传递回上传。

如果没有一个简单的解决方案,可能是让您的小程序简单地定期(每小时或 20 分钟一次)查询网站,以防止会话超时。它不一定需要上传 - 它可能可以查询任何受限页面。

【讨论】:

    【解决方案2】:

    问题在于您的服务器实现,而不是客户端代码。当客户端程序连接到服务器时,您不应该使用会话来识别用户。在 Web 浏览器上下文中使用 session 更合适。

    当您从 cilent 程序连接到您的服务器时,您应该使用Basic Authentication 方法。这可以通过在您的上传请求中添加Authorization 标头来完成,服务器会解析它以获取用户名和密码。这比将用户名和密码放在您的 url 中稍微安全一些。还有其他身份验证方法,您可能想看看。

    【讨论】:

    • 感谢您的回复:)。我使用 Jboss 作为服务器并使用“JBoss Secured Realm”来确保安全。登录也由 Jboss 管理。
    • 然后使用与你设置的realm匹配的认证方式。
    • 如果您使用正确的身份验证方法,您的会话应该由 JBoss 重新创建。大多数服务器使用基本身份验证,因为它很简单。
    • :如上所述,如果我使用网络浏览器访问相同的 URL,它绝对可以正常工作。实际上,如果用户在 URL 中提供用户名/密码,则要求用户应该能够直接登录。我认为领域没有问题。
    • 如果是这种情况,那么您必须找到一个解决方法。我在这里的回答只是对如何正确使用身份验证和自动化的建议。
    【解决方案3】:

    HttpClient 在这里可能会有所帮助:HTTP PUT。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 2023-03-24
    • 2012-04-04
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    相关资源
    最近更新 更多