我是新手,所以请耐心等待...... 我找到了一个JSP代码片段,它从头信息中读出用户数据,并稍微改变了一下(将其改为函数)。问题是,返回的字符串只是很好的比较:我完成了我的作业,并意识到它必须是某种字符集问题,因为即使两个字符串长度不匹配,但我找不到解。如何将其中的任何一种转换为适当的格式?
<%@ page import="sun.misc.BASE64Encoder" %>
<%@ page import="java.io.*" %>
<%!
public String matchuser(String inputUser,HttpServletRequest request,HttpServletResponse response) throws java.io.IOException
{
String auth = request.getHeader("Authorization");
String s = "";
String retval = "kakukk";
//no auth, request NTLM
if (auth == null) {
response.setStatus(response.SC_UNAUTHORIZED);
response.setHeader("WWW-Authenticate", "NTLM");
return "no auth";
}
//check what client sent
if (auth.startsWith("NTLM ")) {
//System.out.println(auth);
byte[] msg = new sun.misc.BASE64Decoder().decodeBuffer(auth.substring(5));
int off = 0, length, offset;
//############################
if (msg[8] == 1)
{
off = 18;
byte z = 0;
byte[] msg1 =
{(byte)'N', (byte)'T', (byte)'L', (byte)'M', (byte)'S',(byte)'S', (byte)'P',
z,(byte)2, z, z, z, z, z, z, z,
(byte)40, z, z, z, (byte)1, (byte)130, z, z,
z, (byte)2, (byte)2, (byte)2, z, z, z, z, //
z, z, z, z, z, z, z, z};
// send ntlm type2 msg
response.setStatus(response.SC_UNAUTHORIZED);
response.setHeader("WWW-Authenticate", "NTLM "
+ new sun.misc.BASE64Encoder().encodeBuffer(msg1).trim());
return "dunno msg[8]";
}
else if (msg[8] == 3)
{
off = 30;
length = msg[off+17]*256 + msg[off+16];
offset = msg[off+19]*256 + msg[off+8];
s = new String(msg, offset, length);
// print computer name // out.println(s + " ");
}
else
{
return "done";
}
length = msg[off+9]*256 + msg[off+8];
offset = msg[off+11]*256 + msg[off+10];
//############################
s = new String(msg, offset, length);
if(s.equals(inputUser))
{
return "match";
}
else
{
return "not match:-" + s + "- input:-" + inputUser+"-";
}
}
return "final";
}
%>
<%
String fnc = matchuser("u099511",request,response);
out.println(fnc);
%>
在最后几行中,我用我的用户(u099511)调用该函数。从表面上看,这两个字符串看起来是一样的,但它们不是,我无法比较它们:
not match:-u099511- input:-u099511-
我在这里缺少什么? 任何帮助非常感谢!
答案 0 :(得分:0)
好的,问题是返回的字符串是UTF16LE。不要问为什么,显然我们的服务管理系统使用这个...... 无论如何,解决方案是将结果字符串声明为utf16le:
s = new String(msg, offset, length, "UTF-16LE");
如果你像我这样的初学者,你可能想要记住UTF16默认是UTF-16BE。