Часто возникает необходимость отобразить в браузере картинку, которая хранится в LDAP. Так бывает, когда Вы, допустим, храните в LDAP список пользователей домена. Явным тому примером является связка Samba + LDAP. В этой статье описывается процесс создания Java сервлета, который получает через адресную строку идентификатор пользователя и в зависимости от его значения отображает его фотографию. Фотография хранится в поле jpegPhoto.

Итак, для начала объявим имя пакета и импортируем нужные классы:

package ru.itmanblog.web;

import java.io.*;
import java.util.Hashtable;

import javax.servlet.*;
import javax.servlet.http.*;

import javax.naming.NamingEnumeration;
import javax.naming.directory.Attributes;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;


Далее в созданном классе, объявляем переменные для подключение к LDAP серверу и фильтру по которому будут извлекаться пользователи:

@SuppressWarnings( "serial" )
public class LdapImgServlet extends HttpServlet
{
private final String LDAP_LISTEN_ADDR = "192.168.0.1";
private final String LDAP_LISTEN_PORT = "389";
private final String LDAP_BASE_DNAME = "ou=Users,dc=itmanblog,dc=ru";
private final String LDAP_FILTER_LPART = "(objectclass=inetorgperson)";
private final String LDAP_FILTER_RPART = "(businesscategory=general)";


И наконец само тело сервлета. Сначала указывается заголовок, указывающий тип отображаемого содержимого. Далее указываются параметры подключения к серверу. Затем идет само подключение с учетом параметра переданного через адресную строку (идентификатор пользователя). В завершении, побайтовый вывод полученного содержимого поля в выходной поток:

@SuppressWarnings( "unchecked" )
public void doGet( HttpServletRequest req, HttpServletResponse res )
throws ServletException, IOException
{
res.setContentType( "image/jpeg" );
try
{
Hashtable<String, String> ldapParams = new Hashtable
<String, String>();

ldapParams.put( "java.naming.ldap.version", "3" );
ldapParams.put( "java.naming.factory.initial",
"com.sun.jndi.ldap.LdapCtxFactory" );
ldapParams.put( "java.naming.referral", "follow" );
ldapParams.put( "java.naming.provider.url", "ldap://"+
LDAP_LISTEN_ADDR +":"+ LDAP_LISTEN_PORT );

InitialLdapContext ldapLink = new InitialLdapContext(
ldapParams, null );
SearchControls ldapSearchCtrls = new SearchControls();

ldapSearchCtrls.setSearchScope( SearchControls.SUBTREE_SCOPE );

NamingEnumeration searchResults = ldapLink.search(
LDAP_BASE_DNAME, "(&(uid=" + req.getParameter( "uid" ) + ")" +
LDAP_FILTER_LPART + LDAP_FILTER_RPART + ")", ldapSearchCtrls );
Attributes ldapAttrs = ((SearchResult)searchResults.next()).
getAttributes();

byte [] bytePhotoStr = (byte[])ldapAttrs.get("jpegPhoto").get();

for( byte i : bytePhotoStr )
res.getOutputStream().write( i );

res.getOutputStream().close();
}
catch( Exception e ) {}
}
}


На этом все!