JSP解码的String不等于普通的String

时间:2014-01-27 10:13:38

标签: java jsp encoding base64 string-comparison

我是新手,所以请耐心等待...... 我找到了一个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- 

我在这里缺少什么? 任何帮助非常感谢!

1 个答案:

答案 0 :(得分:0)

好的,问题是返回的字符串是UTF16LE。不要问为什么,显然我们的服务管理系统使用这个...... 无论如何,解决方案是将结果字符串声明为utf16le:

s = new String(msg, offset, length, "UTF-16LE");

如果你像我这样的初学者,你可能想要记住UTF16默认是UTF-16BE。