使用Java中的摘要式身份验证的Java HTTP PUT

时间:2010-09-23 09:45:38

标签: java http authentication httpwebrequest digest

我正在尝试使用 PUT 上传Java文件,服务器执行摘要式身份验证。我想保持精益,所以我尝试使用 HttpURLConnection。

public void putData(String path, byte [] data) throws IOException, MalformedURLException {

Authenticator.setDefault(new Authenticator() {
      protected PasswordAuthentication getPasswordAuthentication() {
          return new PasswordAuthentication(user,password.toCharArray());
      }});

  debug("Default authenticator set");
  //Safeguard against double slashes
  if (path.startsWith("/")) {
   path = path.replaceFirst("/","");
  }

  debug(hostname + path);
  URL url = new URL(hostname + path);
  HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  debug("HttpURLConnection acquired");
  conn.setDoOutput(true);
        conn.setDoInput(true);

  conn.setRequestMethod("PUT");
  conn.setRequestProperty("Content-Length",String.valueOf(data.length));
  conn.setRequestProperty("Content-type","application/binary");
  conn.setFixedLengthStreamingMode(data.length);
  conn.connect();

  debug("Properties set");
  OutputStream out = conn.getOutputStream();
  debug("Outputstrem acquired");
  out.write(data,0,data.length);
  out.flush();
  out.close();
  debug("Data written, stream closed."); 
 }

出于某种原因,这无可救药地失败了:我看到401回来了,然后就完成了。如果我禁用授权,相同的代码工作。使用摘要认证下载具有类似代码的文件“只是工作”。有任何想法吗?我真的不想开始使用下一个如Apache的htclient这么多的库(......它是2010年......你希望带有digest authN的http请求可以在任何标准库中使用)。

1 个答案:

答案 0 :(得分:1)

您应该至少在方法结束时尝试conn.getInputStream(),以强制评估服务器响应。否则,将无法正确检测到来自服务器的潜在错误消息。