使用HttpUrlConnection进行HTTP摘要认证

use*_*624 9 java

我正在尝试使用摘要式身份验证连接到我的计算机上的Tomcat Web Server.我正在使用tomcat的内存领域.以下是服务器的配置方式:

1)在server.xml中:

<Realm className="org.apache.catalina.realm.MemoryRealm" digest="MD5" />
Run Code Online (Sandbox Code Playgroud)

2)在tomcat-users.xml中

<user username="testuser" password="81dc9bdb52d04dc20036dbd8313ed055" roles="test"/>
Run Code Online (Sandbox Code Playgroud)

3)在我的web项目的web.xml中:

<auth-method>DIGEST</auth-method>
Run Code Online (Sandbox Code Playgroud)

如您所见,我已指定为摘要方法"MD5",并且我已使用Tomcat的digest.sh加密了密码.

这是我在客户端的代码:

private static void testGet() throws IOException {

    // Create a URL
    URL test = new URL("http://localhost:8080/TestWebProject/TestServlet");

    // Open a connection to the URL
    HttpURLConnection conn = (HttpURLConnection) test.openConnection();

    MessageDigest md5 = null;
    try {
      md5 = MessageDigest.getInstance("MD5");
    } catch(NoSuchAlgorithmException e) {
      e.printStackTrace();
    }

    // Digest password using the MD5 algorithm
    String password = "1234";
    md5.update(password.getBytes());
    String digestedPass = digest2HexString(md5.digest());

    // Set header "Authorization"
    String credentials = "testuser:" + digestedPass;
    conn.setRequestProperty("Authorization", "Digest " + credentials);

    // Print status code and message
    System.out.println("Test HTTP GET method:");
    System.out.println("Status code: " + conn.getResponseCode());
    System.out.println("Message: " + conn.getResponseMessage());
    System.out.println();

}

private static String digest2HexString(byte[] digest)
{
   String digestString="";
   int low, hi ;

   for(int i=0; i < digest.length; i++)
   {
      low =  ( digest[i] & 0x0f ) ;
      hi  =  ( (digest[i] & 0xf0)>>4 ) ;
      digestString += Integer.toHexString(hi);
      digestString += Integer.toHexString(low);
   }
   return digestString ;
}
Run Code Online (Sandbox Code Playgroud)

我认为我的客户端代码是可以的,也是服务器的配置.虽然服务器不断向我发送状态代码401并显示消息"未授权".由于我不是一位经验丰富的Java开发人员,我想询问是否有人有想法或在我的实现中发现错误.

先感谢您!

bia*_*bit 6

摘要式身份验证远比仅发送更复杂username:password(实际上是基本身份验证......并且username:password元组需要进行Base64编码!).

你可以在这里阅读所有关于摘要的内容.

如果您不需要使用,HttpUrlConnection请查看这两个项目:

他们都已经开箱即用支持Digest(以及其他有用的东西).