1. 程式人生 > >解決ldap獲取資料中的objectGUID亂碼問題

解決ldap獲取資料中的objectGUID亂碼問題

宣告:

1、解決辦法是從一個英文網站找到的,現在找不到了,不是我自己解決的

2、連線ldap的方法,也是從網上拷貝,因為方法是固定和通用的

3、歡迎拍磚和開罵,真的,但是至少罵完後告訴我哪裡不對,教小弟幾招

    前一陣子需要做一個從第三方ldap同步使用者到本地系統的功能,本地後臺服務是java寫的,考慮到資料同步的一致性,使用ldap獲取的資料中的的objectGUID作為兩個系統的唯一標示

    但是問題來了,objectGUID這個東西貌似是octString型別的,本地服務獲取時,居然出現了亂碼。在網上找了好多方法,無外乎都是轉換成String然後getBytes(),然後通過一系列的演算法操作轉換為16進位制碼等等。

    好吧,基本上,是這樣的

......//連線ldap和查詢程式碼省略
 
if("objectGUID".equals(Attr.getID())){  
    String st = getGUID(Attr.get().toString().getBytes()); //objectGUID
     
......//後續處理程式碼省略
 
}//方法結束
 
private static String getGUID(byte[] inArr) {  
 
    StringBuffer guid = new StringBuffer();  
     
        for (int i = 0; i < inArr.length; i++) {  
            StringBuffer dblByte = new StringBuffer(  
                    Integer.toHexString(inArr[i] & 0xff));  
            if (dblByte.length() == 1) {  
                guid.append("0");  
            }  
            guid.append(dblByte);  
        }  
        return guid.toString();  
    }

不知道是我沒有搞清楚原理還是什麼原因,上面這種方法,因為先把取出來的值toString了一次,在不同的伺服器(計算機)上,轉換出來的十六進位制碼是不同的,具體原因待查。這樣對將來的備份和資料遷移肯定是災難!!!

    下面這種方法就好多了,而且還原了ldap伺服器上的呈現形式,比如:

objectGUID:{751837D8-A40F-4F78-AE6C-29E2AD8D9921}

    public static void main(String[] args) {
 
        String adminName = "[email protected]";             // 賬號
        String adminPassword = "123456";             // 密碼
        String ldapURL = "ldap://192.168.0.123:389"; // 地址
 
        Properties env = new Properties();
 
        env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.SECURITY_AUTHENTICATION, "simple");// "none","simple","strong"
        env.put(Context.SECURITY_PRINCIPAL, adminName);
        env.put(Context.SECURITY_CREDENTIALS, adminPassword);
        env.put(Context.PROVIDER_URL, ldapURL);
         
        //  **解決 亂碼 的關鍵一句
        env.put("java.naming.ldap.attributes.binary","objectGUID");
 
        try {
             
            //  建立連線
            LdapContext ctx = new InitialLdapContext(env, null);
             
            //  定義要取出的屬性
            String returnedAtts[] = { 
                    "cn", 
                    "sn", 
                    "givenname",
                    "distinguishedName", 
                    "displayname", 
                    "objectCategory",
                    "objectClass", 
                    "objectGUID", 
                    "objectSid",
                    "userAccountControl", 
                    "name", 
                    "distinguishedName" 
            };
            SearchControls searchCtls = new SearchControls();
            searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
            searchCtls.setReturningAttributes(returnedAtts);
 
            //  定義條件
            String searchFilter = "(&(objectClass=person)(objectClass=organizationalPerson)(objectClass=user)(!(objectClass=computer)))";
            String searchBase = "DC=com,DC=cn";
 
            //  執行查詢
            NamingEnumeration<SearchResult> answer = ctx.search(searchBase,searchFilter, searchCtls);
            while (answer.hasMoreElements()) {
 
                SearchResult sr = (SearchResult) answer.next();
//              System.out.println(sr.getAttributes().get("distinguishedName")
//                      .toString()
//                      + " || "
//                      + sr.getAttributes().get("userAccountControl").toString()
//                      + " || "
//                      + sr.getAttributes().get("objectClass").toString()
//                      + " || "
//                      + sr.getAttributes().get("name").toString()
//                      + " || "
//                      + sr.getAttributes().get("objectGUID").toString());
                 
                byte[] GUID = (byte[])sr.getAttributes().get("objectGUID").get();
                 
                String strGUID = "";
                String byteGUID = "";
                 
                 
                //Convert the GUID into string using the byte format
                for (int c=0;c<GUID.length;c++) {
                     byteGUID = byteGUID + "\\" + AddLeadingZero((int)GUID[c] & 0xFF);
                }
                strGUID = "{";
                strGUID = strGUID + AddLeadingZero((int)GUID[3] & 0xFF);
                strGUID = strGUID + AddLeadingZero((int)GUID[2] & 0xFF);
                strGUID = strGUID + AddLeadingZero((int)GUID[1] & 0xFF); 
                strGUID = strGUID + AddLeadingZero((int)GUID[0] & 0xFF);
                strGUID = strGUID + "-";
                strGUID = strGUID + AddLeadingZero((int)GUID[5] & 0xFF);
                strGUID = strGUID + AddLeadingZero((int)GUID[4] & 0xFF);
                strGUID = strGUID + "-";
                strGUID = strGUID + AddLeadingZero((int)GUID[7] & 0xFF);
                strGUID = strGUID + AddLeadingZero((int)GUID[6] & 0xFF);
                strGUID = strGUID + "-";
                strGUID = strGUID + AddLeadingZero((int)GUID[8] & 0xFF);
                strGUID = strGUID + AddLeadingZero((int)GUID[9] & 0xFF);
                strGUID = strGUID + "-";
                strGUID = strGUID + AddLeadingZero((int)GUID[10] & 0xFF);
                strGUID = strGUID + AddLeadingZero((int)GUID[11] & 0xFF);
                strGUID = strGUID + AddLeadingZero((int)GUID[12] & 0xFF);
                strGUID = strGUID + AddLeadingZero((int)GUID[13] & 0xFF);
                strGUID = strGUID + AddLeadingZero((int)GUID[14] & 0xFF);
                strGUID = strGUID + AddLeadingZero((int)GUID[15] & 0xFF);
                strGUID = strGUID + "}";
                System.out.println(sr.getAttributes().get("name"));
                System.out.println("GUID (String format): " + strGUID);
                //System.out.println("GUID (Byte format): " + byteGUID);
 
            }
             
             
            ctx.close();
        } catch (NamingException e) {
            e.printStackTrace();
            System.err.println("Problem searching directory: " + e);
        }
    }
 
    public static String AddLeadingZero(int k) {
        return (k <= 0xF) ? "0" + Integer.toHexString(k) : Integer
                .toHexString(k);
    }




相關推薦

解決ldap獲取資料objectGUID亂碼問題

宣告: 1、解決辦法是從一個英文網站找到的,現在找不到了,不是我自己解決的 2、連線ldap的方法,也是從網上拷貝,因為方法是固定和通用的 3、歡迎拍磚和開罵,真的,但是至少罵完後告訴我哪裡不對,教小弟幾招     前一陣子需要做一個從第三方ldap同步使用者到

一文解決中文在Eclipse顯示亂碼的問題

很多童鞋反應在吧專案匯入到eclipse(myeclipse)時中文會有亂碼,修改了編碼格式後還是亂碼,這裡給大家介紹一下關於中文亂碼時修改編碼的注意事項: 當在eclipse中開啟一個檔案後發現有中文亂碼後,千萬不能修改這個檔案內容,一旦改過這個檔案的內容,那怎麼修改編碼也沒用了,只能

使用ByteArrayOutputStream解決FileInputStream讀取過程亂碼問題

public static void main(String[] args) throws IOException { // 1.read(byte[] b);是位元組輸入流中的方法,建立FileInputStream,關聯a.txt FileInputStream

angularJs使用$q服務進行同步請求資料解決非同步獲取資料導致return返回為空的問題

angularJs使用$q服務進行同步請求資料 一般angularJs中的$http進行的是非同步請求操作;在我們想要等待先請求完資料,再進行別的操作,使用這種方式,並不管用,往往請求不到資料。 a

解決SpringBoot在IDEA亂碼問題

修改idea的配置    在idea.exe.vmoptions和idea64.exe.vmoptions加入一行程式碼 -Dfile.encoding=UTF-8    配置Tomcat的時新增VM引數 -Dfile.encoding=UTF-8中文亂碼問題當在.prope

php 使用webservice從伺服器獲取資料時中文亂碼

本小白由於公司erp需求,讓我來搞webservice這塊。 伺服器端為本公司的伺服器,客戶端為自己的主機。 從伺服器的sql資料庫獲取了對於的資料後,從客戶端獲取了。 結果發現中文出現亂碼。 查看了多個地方引數。頁面沒問題,兩邊的引數設定都沒問題的。 webservic

解決JS與CSS文字亂碼問題

文字亂碼問題都是 因為字元沒有按照utf-8進行編譯css  @charset "utf-8"js<script type="text/javascript" src="myscripts.js" charset="UTF-8"></script>

val和attr和prop獲取資料的區別

var vals = $('#id').val(); var attrs = $('#id').attr('value'); var props = $('#id').prop('value'); 程式碼如上所示,為輸入框設定了初始值:123,此時點選按鈕,控制檯輸出為:

利用MapReduce解決在海量資料求Top K個數

package jtlyuan.csdn; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configured; import org.apache.

用Base64加密資料解決json傳輸資料特殊字元問題

在用json進行遠端同步資料時,json中的資料有特殊字元時,容易造成json解析不了。用對特殊字元進行轉義,實現太麻煩(個人覺得)。於是想到了對屬性值進行加密處理,而且加密後的資料不會有特殊字元。而base64非常適合(個人覺得base64的出現就是為了解決資料傳輸特殊字

解決eclipse寫資料入資料庫亂碼問題

首先確保你的專案所採取的編碼和資料庫所採取的編碼一致,具體設定參考網上的資料,如果採用的是utf-8編碼,還是出現亂碼,直接在你的jdbc url後面拼接如下引數: jdbc.url=jdbc:mys

Angularjs Promise 解決非同步獲取資料導致return返回為空的問題

最近在開發專案的時候。我在service中請求資料返回給控制器的時候,由於資料是非同步請求的,這裡需要知道javascript的執行環境是單執行緒的,一次只能執行一個任務,但是單執行緒壞處就是如果前一個任務執行時間較長就會導致整個頁面的阻塞,因此javascript提供了

Java解決Servlet獲取請求(GET/POST)資料資料亂碼問題

一:Servlet獲取請求資料時亂碼問題解決方法   <1> get方式資料亂碼只能使用下面的方法解決    String username = request.getParameter(

ajax獲取資料中文亂碼問題最簡單的完美解決方案

$.ajax({ url : "${ctx}/selection/democracyRecommend/partyMzAjaxSelectListNewA?hytjId="+hytjId+"&voteFlag="+voteFlag, type : "POST", data : { numIds : n

解決jsp插入資料庫資料出現亂碼問題

一般在jsp頁面中新增下面三句 基本可以解決亂碼問題,注意 前後臺 資料庫 編碼一致 <%@   page   contentType="text/html;charset=utf-8"   %>      <%@ page   pageEncoding

關於《JavaWeb開發實戰經典》接收封裝表單的文字資料出現中文亂碼問題的解決方法

smartupload亂碼問題 今天在寫smartupload的demo時,在接收表單資料時出現了中文亂碼,從網上綜合了各種方法才得以解決。 1.smartupload.html中可見對form使用enctype進行表單封裝 <!DOCTYPE html&

獲取requestheader資料,用來解決多裝置登入驗證問題

引言: 接上一篇文章,對@RequestMapping進行地址對映講解之後,該篇主要講解request 資料到handler method 引數資料的繫結所用到的註解和什麼情形下使用; 簡介: handler method 引數繫結常用的註解,我們根據他們處理的R

使用localStorage解決瀏覽器重新整理後無法再從vuex獲取資料的問題

假設有這樣一個場景:使用者登入後,用vuex管理使用者的資訊,登入成功後進入主介面,在進入主介面後重新整理瀏覽器,此時vuex中的使用者資訊將無法獲取到。那麼應該如何解決?辦法之一是使用localStorage儲存使用者資訊。在登入成功後儲存使用者資訊,重新整理瀏覽器後從lo

php 使用$_SERVER["REQUEST_URI"]獲取url含中文亂碼解決辦法

$request_uri = $_SERVER["REQUEST_URI"];//獲取當前頁url var_dump(urldecode($request_uri)); 中文等自動urlenco

mysql資料庫資料表出現亂碼解決辦法

 最近發現,在MySQL的dos客戶端輸出視窗中查詢表中的資料時,表中的中文資料都顯示成亂碼,如下圖所示:      上網查了一下原因:之所以會顯示亂碼,就是因為MySQL客戶端輸出視窗顯示中文時使用的字元編碼不對造成的,可以使用如下的命令檢視輸出視窗使用的字元編碼