【发布时间】:2010-10-24 14:01:24
【问题描述】:
我正在尝试使用摘要式身份验证连接到我机器上的 Tomcat Web 服务器。我正在使用tomcat的内存领域。以下是服务器的配置方式:
1) 在 server.xml 中:
<Realm className="org.apache.catalina.realm.MemoryRealm" digest="MD5" />
2) 在tomcat-users.xml中
<user username="testuser" password="81dc9bdb52d04dc20036dbd8313ed055" roles="test"/>
3) 在我的 web 项目的 web.xml 中:
<auth-method>DIGEST</auth-method>
如您所见,我已将摘要方法指定为“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 ;
}
我认为我的客户端代码和服务器的配置都可以。尽管服务器不断向我发送状态码 401,并带有消息“未经授权”。由于我不是经验丰富的 java 开发人员,所以我想问一下是否有人有想法或在我的实现中看到错误。
提前谢谢你!
【问题讨论】:
-
一般来说,如果摘要认证不是强制性的,最好使用HTTPS连接和一些标准的基于HTML的认证形式,因为HTTP认证在客户端关闭浏览器之前不支持“注销”。
标签: java