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);
	}
时间: 2024-09-30 05:16:48

ldap获取数据中的objectGUID乱码问题的相关文章

php 写入数据到MySQL以及从MySQL获取数据,页面出现乱码的解决方法

现象如标题. 解决思路: 1,在php中添加 header('charset=utf-8'); 2,在连接到数据库后,添加如下代码,写入数据和获取数据的地方均要添加 mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_serve

获取字符串中某一个字段的数据,GetValueFromStr

gps数据格式为:$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A* /********************************************************************** *版权所有 (C)2015, Wuyq. * *文件名称: GetValueFromStr.c *内容摘要:用于演示从gps数据字符串中获取相应的内容 *其它说明:无 *当前版本: V1.0 *作

MariaDB 10.0.X中,动态列支持 JSON 格式来获取数据。

MariaDB 10.0.X中,动态列(Dynamic Columns),可以支持 JSON 格式来获取数据. 为了兼容传统SQL语法,MariaDB 10和MySQL5.7支持原生JSON格式,即关系型数据库和文档型NoSQL数据库集于一身. 使用说明: ###表结构 create table assets (   item_name varchar(32) primary key, -- A common attribute for all items   dynamic_cols  blo

Swing中使用JTable动态获取数据库中的数据并显示

笔者注:本文供新手学习使用,若有一定基础,可以直接看3! 1.创建数据库: /* Navicat MySQL Data Transfer Source Server : aa Source Server Version : 50519 Source Host : localhost:3306 Source Database : test Target Server Type : MYSQL Target Server Version : 50519 File Encoding : 65001 D

zend framework获取数据库中枚举类enum的数据并将其转换成数组

在model中建立这样的模型,在其中写入获取枚举类的方法 class Student extends Zend_Db_Table{ protected $_name ='student'; protected $_primary ='id'; function getPartyEnum($enumname){ //适配器并获取数据 $db = $this->getAdapter(); $db->query("SET NAMES GBK"); $sql = $db->q

是用JDBC从数据库中获取数据并以java对象返回

/** * * @param c * for example Person.class * @param primaryKeys * primaryKeys为主键,参数顺序和表中保持一致 如果id, name 为主键 类名为Person 则 getEntity(Person.class,1,"name") * @return */ public static Object getEntity(Class c, Object... primaryKeys) { PreparedState

Android:解决客户端从服务器上获取数据乱码的方法

向服务器发送HTTP请求,接收到的JSON包为response,用String content = EntityUtils.toString(response.getEntity(),"utf-8");解码还是出现了中文乱码,在后面加了 String name = new String(response.getBytes("iso-8859-1"), "UTF-8"); 也无济于事.想到服务器好像是用URLENCODER编了码的,怀着试一试的态度

在ASP.NET MVC控制器中获取链接中的路由数据

在ASP.NET MVC中,在链接中附加路由数据有2种方式.一种是把路由数据放在匿名对象中传递: <a href="@Url.Action("GetRouteData","Home",new { ReturnUrl = Request.Url.PathAndQuery, x = 10})">走你</a> 一种是放在RouteValueDictionary对象中传递: <a href="@Url.Action

init-param和context-param 中获取数据的一个问题

init-param  中的数据是要在制定的 servlet 下才能取的到数据的 其中获取 init-param  的可以用 这样的一个方式去获取 ServletConfig config = getServletConfig(); String name = config.getServletName("name") 或者在init方法中获取 public void init(ServletConfig config) throws ServletException { config