2014-01-27 82 views
0

我是新手,請耐心等待... 我發現了一個JSP代碼片段,它從頭信息中讀出用戶數據,並將其更改一點點(做它的功能)。問題是,字符串作爲回報只是讓人比較好:我做了功課,並意識到它必須是某種字符集問題,因爲即使兩個字符串長度不匹配,但我找不到解。我怎樣才能將它們中的任何一個轉換成適當的格式?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

好的,問題是返回的字符串是UTF16LE。不要問爲什麼,顯然我們的服務管理系統使用這樣的產品...... 不管怎樣,解決辦法是宣佈結果字符串作爲utf16le應按:

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

如果你是這樣的初學者,因爲我,你可能想記住UTF16默認是UTF-16BE。

相關問題