Часто возникает необходимость отобразить в браузере картинку, которая хранится в LDAP. Так бывает, когда Вы, допустим, храните в LDAP список пользователей домена. Явным тому примером является связка Samba + LDAP. В этой статье описывается процесс создания Java сервлета, который получает через адресную строку идентификатор пользователя и в зависимости от его значения отображает его фотографию. Фотография хранится в поле jpegPhoto.
Итак, для начала объявим имя пакета и импортируем нужные классы:
Далее в созданном классе, объявляем переменные для подключение к LDAP серверу и фильтру по которому будут извлекаться пользователи:
И наконец само тело сервлета. Сначала указывается заголовок, указывающий тип отображаемого содержимого. Далее указываются параметры подключения к серверу. Затем идет само подключение с учетом параметра переданного через адресную строку (идентификатор пользователя). В завершении, побайтовый вывод полученного содержимого поля в выходной поток:
На этом все!
Итак, для начала объявим имя пакета и импортируем нужные классы:
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 ) {}
}
}
На этом все!