Java

Manipulando DOM de Maneira Simples com JSOUP

Postado em Atualizado em

Image

Olá,

Na semana passada precisei manipular uma página XHTML utilizando Java. A maneira mais simples que encontrei e mais efetiva foi o JSOUP que disponibiliza uma API para manipulação e extração dados utilizando o melhor do DOM.

Por exemplo se por algum requisito da aplicação for necessário adicionar um  <h:commandButton> utilizando somente Java o JSOUP é uma mão na roda.

Temos a seguinte página:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
   <title>JSF - JSOUP</title>
</h:head>
<h:body>
  <h3>Apenas Testando!!</h3>
  <h:form>
    <h:inputtext id="name" value="#{helloController.name}"></h:inputtext>
  </h:form>
</h:body>
</html>

Nessa situação por exemplo teríamos que adicionar um <h:commandButton> abaixo do input. Sendo bem “grosso” poderíamos fazer da seguinte maneira:

File input = new File("/home/mmagnani/Desktop/antes.xhtml");
Document doc = Jsoup.parse(input, "UTF-8", "");

BufferedWriter out = new BufferedWriter(new FileWriter("/home/mmagnani/Desktop/depois.xhtml"));

doc.getElementById("name").after("<h:commandButton value=\"Welcome Me\" action=\"welcome\"></h:commandButton>");

out.write(doc.html());
out.close();

Resultado Final:

<!--?xml version="1.0" encoding="UTF-8"?--><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html">
 <h:head>
    <title>JSF - JSOUP</title>
 </h:head>
<h:body>
<h3>Apenas Testando!!</h3>
<h:form>
<h:inputtext id="name" value="#{helloController.name}"></h:inputtext>
<h:commandbutton value="Welcome Me" action="welcome"></h:commandbutton>
</h:form>
</h:body>
</html>

Espero que isso seja útil em algum momento!

Abraços

Fonte: http://jsoup.org/

Configurando HPROF no JBoss AS 7.1.2 ( JBoss EAP 6 )

Postado em

Olá amigos,

Hoje vamos aprender a configurar  o HPROF que eu considero fundamental para um administrador de instâncias JBoss. O HPROF é uma biblioteca nativa da JVM  que é carregado dinâmicamente na inicialização da mesma, tornando-se parte do processo Java. O HPROF nos fornece dados para analisar a heap do processo Java em questão e também informações relacionadas ao uso de CPU. Os dados gerados podem ser em forma de texto ou binário com isso podemos rastrear e isolar problemas de desempenho que envolvem o uso de memória e problemas com código ineficiente.

O primeiro passo é indenticar o processo alvo na JVM. Podemos monitorar um único processo que é o caso do standalone mode mas também pode ocorrer a necessidade de monitarar instâncias em domain mode e com isso também o domain process controller e host controller.

Como exemplo vamos utilizar a configuração em Standalone Mode, que é uma unica instância como nas versões anteriores do JBoss.

No Linux edite o arquivo JBOSS_HOME/bin/standalone.conf  e procure pela propriedade JBOSS_MODULES_SYSTEM_PKGS e adicione as classes do HPROF separando-as com vírgula como abaixo. Essa propriedade “diz” ao JBoss Modules para deixar as classes do HPROF acessíveis de qualquer class loader.

if [ "x$JBOSS_MODULES_SYSTEM_PKGS" = "x" ]; then
JBOSS_MODULES_SYSTEM_PKGS="org.jboss.byteman,sun.tools.hprof,com.sun.tools.hat.internal.parser,com.sun.demo.jvmti.hprof"
#JBOSS_MODULES_SYSTEM_PKGS="org.jboss.byteman"
fi

Ainda no arquivo JBOSS_HOME/bin/standalone.conf , descomente a variável JAVA_OPTS e deixe-a como abaixo:

JAVA_OPTS="$JAVA_OPTS -agentlib:hprof=file=myhprof.txt"

O meu JBOSS_HOME/bin/standalone.conf nessa parte ficou como abaixo:

if [ "x$JAVA_OPTS" = "x" ]; then
 JAVA_OPTS="-Xms1303m -Xmx1303m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"
 JAVA_OPTS="$JAVA_OPTS -Djboss.modules.system.pkgs=$JBOSS_MODULES_SYSTEM_PKGS -Djava.awt.headless=true"
 JAVA_OPTS="$JAVA_OPTS -Djboss.server.default.config=standalone.xml"
 JAVA_OPTS="$JAVA_OPTS -agentlib:hprof=file=myhprof.txt"
else
 echo "JAVA_OPTS already set in environment; overriding default settings with values: $JAVA_OPTS"
fi

Inicie o JBoss em Standalone mode e perceba que o arquivo myhprof.txt foi criado no diretório atual.

Para utilizar o formato binário basta modificar o JAVA_OPTS como abaixo:

 JAVA_OPTS="$JAVA_OPTS -agentlib:hprof=format=b,file=MyHeapDump.hprof"

Quando pararmos o JBoss,  o HPROF criará o dump e você verá o seguinte erro:

Dumping Java heap ...HPROF ERROR: Missing jclass when fields needed [hprof_class.c:642]
HPROF ERROR: Trouble with unprepared classes [hprof_reference.c:379]
HPROF ERROR: Missing jclass when fields needed [hprof_class.c:642]
HPROF ERROR: Trouble with unprepared classes [hprof_reference.c:379]
HPROF ERROR: Missing jclass when fields needed [hprof_class.c:642]
HPROF ERROR: Trouble with unprepared classes [hprof_reference.c:379]
HPROF ERROR: Missing jclass when fields needed [hprof_class.c:642]
HPROF ERROR: Trouble with unprepared classes [hprof_reference.c:379]
HPROF ERROR: Missing jclass when fields needed [hprof_class.c:642]
HPROF ERROR: Missing jclass when fields needed [hprof_class.c:642]
HPROF ERROR: Trouble with unprepared classes [hprof_reference.c:379]
allocation sites ... done.

Mesmo com o erro acima o arquivo de dump do HPROF foi criado com sucesso. Me pareceu ser algo relacionado a referência de alguns objetos mas tenho que pesquisar e testar mais algumas vezes.

Para mais informações sobre o HPROF veja o link abaixo:

Outras fontes interessantes sobre JVM e Profile:

Abraços

Resolvendo a Exception Unsupported Major.minor Version

Postado em Atualizado em

Olá amigos

Hoje pela manhã no guj  apareçeu um problema bem comum mas que muitos ficam perdidos.  Uma pessoa estava tentando realizar o deploy e se deparou com a seguinte exception:

Service Module Loader: java.lang.UnsupportedClassVersionError: br/com/startup/s3/servlet/SairServlet : Unsupported major.minor version 51.0

Essa exception é um clásico 🙂

Em um ambiente Java isso occore quando você compila as suas classes utilizando por exemplo  Java 1.7 e depois tenta executar o programa  utilizando  Java  1.6.

Cada versão do Java tem um major source version veja abaixo:

Java Version    Major Version

Java 4                   48.0
Java 5                   49.0
java 6                    50.0
java 7                    51.0
Ou seja  se você compilar o projeto utilizando Java 1.7 ele irá criar arquivos .class com a major version 51.0, e se você executar esses arquivos com Java 1.6 ele irá lançar a exception java.lang.unsupportedclassversionerror unsupported major.minor version 51.0.
Entao chegamos a conclusão de que não conseguimos executar classes compiladas por um JDK superior em um JDK inferior.
Para resolver verifique a versão dos JDKs envolvidos utilizando o comando java -version e seja feliz.
Espero que tenha ajudado 🙂
Abraços

Utilizando PrimeFaces 3.4 com JQuery MaskMoney no JBoss AS 7.1.1

Postado em Atualizado em

E ai galera blz?

Esses dias precisei configurar um input text no meu projeto JSF 2 + Primeface para utilizar máscara com valores monetários. Pesquisando na web encontrei o MaskMoney. Trata-se de um plugin baseado em JQuery que ajuda a formatar uma máscara para campos monetários. Foi um verdadeiro inferno fazer isso funcionar. Na verdade nao consegui fazer funcionar de uma forma elegante. Vejas as quantidades de tópicos no GUJ em relacionado com isso:

Só de ver isso me dá até arrepios rsrs. Como pode um negócio tão simples gerar tanto problema?!  Acredito que isso se deve e muito aos conflitos com o PrimeFaces pois o mesmo já traz o JQuery embarcado. Eu testei uma quantidade absurda de tópicos todos utlizando html e funcionaram numa boa. Já com a página .xhtml num ia nem com reza brava 😦

A solução foi colocar o form com a propriedade prependId igual a false e colocar a configuração da  máscara no body da página.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
 xmlns:h="http://java.sun.com/jsf/html"
 xmlns:f="http://java.sun.com/jsf/core"
 xmlns:ui="http://java.sun.com/jsf/facelets"
 xmlns:p="http://primefaces.org/ui"
 xmlns:fn="http://java.sun.com/jsp/jstl/functions">

<h:head>
 <title>Test</title>
 <script type="text/javascript" src="jquery.maskMoney.js"></script>
</h:head>

<h:body>
  <h:form prependId="false">

  <h:inputText value="#{moneyMBean.contractPrice}" required="true" id="valor" styleClass="valor"  converter="com.magnani.test.converter.MoneyConverter"/>
  <script>$("#valor").maskMoney({showSymbol:true,symbol:"R$", decimal:",", thousands:".", allowZero:true});</script>

  <h:commandButton action="#{moneyMBean.getPriceValue}" value="OK"/>

  <h:outputText value="#{moneyMBean.price}" />
</h:form>
</h:body>
</html>

Vou deixar aqui também o converter utilizado 🙂

@FacesConverter("com.magnani.test.converter.MoneyConverter")
public class MoneyConverter implements Converter {

 final private Locale locale = new Locale("pt", "BR");
 final private DecimalFormat decimalFormat = new DecimalFormat("##0,00", new DecimalFormatSymbols(locale));

 public BigDecimal getAsObject(FacesContext fc, UIComponent component, String value) {

 try {

   decimalFormat.setParseBigDecimal(true);

   return (BigDecimal) decimalFormat.parse(value);
 } catch (ParseException e) {
  throw new ConverterException("Error", e);
 }

}

public String getAsString(FacesContext fc, UIComponent component, Object value) {
  DecimalFormat df = new DecimalFormat("###,###,##0.00");
  return df.format(value);
 }
}

Se alguém souber de uma solução mais interessante por favor me avise 🙂

Abraços

Fontes:

http://www.rafaelwendel.com/2012/07/mascara-para-campos-monetarios-com-jquery-maskmoney/

http://blog.caixadesolucoes.com.br/post/mascara-para-campos-monetarios-com-jquery-e-maskmoney

Balanceamento de Carga com Mod JK no JBoss AS 7.1.1

Postado em Atualizado em

Iniciamente devemos baixar o mod_jk, que é um módulo para balanceamento de carga da apache muito utilizado, pois possui grande diversidade de parâmetros podendo  se adequar a inúmeras situações. O mod_jk também é bem robusto e estável. Ele é customizado através de parâmetros salvos em arquivos “.conf”.

O mod_jk pode ser baixado na seguinte url: http://tomcat.apache.org/download-connectors.cgi, o arquivo tomcat-connectors-1.2.32-src.tar.gz, deverá ser baixado.

Logo em seguida devemos descompactar o arquivo, e compilar utilizando os comandos abaixo:

yum install httpd-devel
tar xvfz tomcat-connectors-1.2.32-src.tar.gz
cd tomcat-connectors-1.2.32-src/native/
./configure --with-apxs=yes
make
make install

Agora o mod_jk.so já está  no diretório modules do httpd :

ls /etc/httpd/modules

Crie em /etc/httpd/conf.d/ o arquivo mod-jk.conf e o configure-o como abaixo:

vim /etc/httpd/conf.d/mod-jk.conf

 

#### Mod JK 1.32 ####
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkLogStampFormat  "[%a %b %d %H:%M:%S %Y]"
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
JkMount /application/* loadbalancer
JkMountFile conf/uriworkermap.properties
JkShmFile logs/jk.shm

<Location /jkstatus/>
JkMount status
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>

Edite o arquivo httpd.conf :

vim /etc/httpd/conf/httpd.conf

E  adicione o arquivo de configuração do mod-jk.conf:

Include conf/mod-jk.conf

Crie o arquivo workers.properties. No arquivo worker estão as informações relacionadas aos hosts envolvidos e  parâmetros como factor de balanceamento, protocolos, configurações de cache entre outros.

vim /etc/httpd/conf/workers.properties

 


# Define instance01
worker.instance01.port=8009
worker.instance01.host=192.168.0.160
worker.instance01.type=ajp13
worker.instance01.ping_mode=A
worker.instance01.lbfactor=1

# Define instance02
worker.instance02.port=8009
worker.instance02.host=192.168.0.170
worker.instance02.type=ajp13
worker.instance02.ping_mode=A
worker.instance02.lbfactor=1

# Load-balancing behaviour
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=instance01,instance02
worker.loadbalancer.sticky_session=False
worker.list=loadbalancer

Crie o arquivo uriworkermap.properties, mapeando a url da sua aplicação conforme o exemplo abaixo:

/TestApp=loadbalancer
/TestApp/*=loadbalancer

No JBoss AS 7.1 edite o arquivo standalone.xml :

vim jboss-as-7.1.0.Final/standalone/configuration/standalone.xml

O “jvmRoute”  agora se chama instance-id (https://issues.jboss.org/browse/AS7-1365):

   <subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" instance-id="instance01" native="false">

Adicione o protocolo AJP:

   <connector name="ajp" protocol="AJP/1.3" socket-binding="ajp" enabled="true" scheme="http"/>

Em <socket-binding-group name=”standard-sockets” default-interface=”public” port-offset=”${jboss.socket.binding.port-offset:0}”>, adicione a port AJP configurada no arquivo workers.properties, que para instance01 é 8009.

<socket-binding name="ajp" port="8009"/>

Agora no outro servidor repita os procedimentos realizados em instance01 para instance02

Inicie as instâncias:

Instance01

./jboss-as-7.1.0.Final/bin/standalone.sh  -b 192.168.0.160 -bmanagement 192.168.0.160

Instance02

./jboss-as-7.1.0.Final2/bin/standalone.sh  -b 192.168.0.170 -bmanagement 192.168.0.170

Realize o deploy a aplicação no diretório: jboss-as-7.1.0.Final/standalone/deployments/  de instance01 e instance02

Acesse a url: http://ipservidor/TestApp , a sua aplicação deverá estar funcionando em conjunto com o Mod JK. Lembre-se que existem algumas configurações  que não foram abordadas nesse post.

Espero que tenha ajudado abraços!

Balanceamento de Carga no JBoss AS 6.1 – Parte 2 ( Final )

Postado em Atualizado em

Mod Cluster  é um balanceador de carga HTTP,  mas diferente do mod_jk, o mod_cluster se baseia na carga da aplicação para distribuir as requisições.Vamos utilizar o Mod Cluster 1.1.3.

O primeiro passo é baixar os binários para o sistema operacional que será utilizado. Para isso execute o comando abaixo:

   wget http://downloads.jboss.org/mod_cluster//1.1.3.Final/mod_cluster-1.1.3.Final-linux2-x64-ssl.tar.gz
   wget mod_cluster-1.1.3.Final-linux2-x64-ssl.tar.gz

Copie os arquivos  *.so, para o diretório /etc/httpd/modules :

  • mod_slotmem.so
  • mod_manager.so
  • mod_proxy_cluster.so
  • mod_advertise.so

Edite o arquivo httpd.conf, e insira as linhas abaixo:

LoadModule slotmem_module modules/mod_slotmem.so
LoadModule manager_module modules/mod_manager.so
LoadModule proxy_cluster_module modules/mod_proxy_cluster.so
LoadModule advertise_module modules/mod_advertise.so
<VirtualHost *:80>
<Directory />
  Order deny,allow
  Allow from all
</Directory>
<Location /mod_cluster_manager>
  SetHandler mod_cluster-manager
  Order deny,allow
  Allow from all
</Location>
  KeepAliveTimeout 60
  MaxKeepAliveRequests 0
  ManagerBalancerName testcluster
  AdvertiseFrequency 5
</VirtualHost>
Comente a linha LoadModule proxy_balancer_module modules/mod_proxy_balancer.so ,  para não ocorrer um conflito com LoadModule proxy_cluster_module modules/mod_proxy_cluster.so.
Incie o apache e acesse a url : http://ip/mod_cluster_manager , você deverá ver algo semelhante a imagem abaixo:
  • Mod Cluster Manager
Agora no JBoss AS 6.1, crie um novo profile , para ser utilizado no balanceamento:

  cd /opt/jboss-6.1.0.Final/server/
  cp -Rap all instance01
Para habilitar o profile instance01, edite o arquivo :
    vim /opt/jboss-6.1.0.Final/server/instance01/deploy/mod_cluster.sar/META-INF/mod_cluster-jboss-beans.xml
Altere a seguinte linha conforme abaixo:
     <property name="advertise">${jboss.mod_cluster.advertise.enabled:true}</property></div>
Outra forma é acrecentando o  parâmetro a linha de execução:
   -Djboss.mod_cluster.advertise.enabled=true
Edite o arqui server.xml :
  vim jboss-6.1.0.Final/server/instance01/deploy/jbossweb.sar/server.xml
Adicione o parâmetro para o JvmRoute :

 <Engine name="jboss.web" defaultHost="localhost" jvmRoute="${jboss.jvmRoute}">
Para finalizar, crei uma nova instância:
   cp -Rap instance01 instance02
Agora inicie as duas instâncias, utilizando os comandos abaixo:

./run.sh -b 0.0.0.0 -g mycluster -c instance01 -Djboss.service.binding.set=ports-default -Djboss.jvmRoute="instance01"  -Djboss.messaging.ServerPeerID=1

 ./run.sh -b 0.0.0.0 -g mycluster -c instance02 -Djboss.service.binding.set=ports-01 -Djboss.jvmRoute="instance02"  -Djboss.messaging.ServerPeerID=2
Acesse novamente http://ip/mod_cluster_manager ,  você deverá ver as instâncias que acabamos de inciar:
  • Mod Cluster Manager / Instances
Baixe o Java Bundles do Mod Cluster. Vamos utilizar as aplicações de demo, para realizar alguns testes:
  wget http://downloads.jboss.org/mod_cluster//1.1.3.Final/mod_cluster-1.1.3.Final-bin.tar.gz</div>
  tar -xvzf mod_cluster-1.1.3.Final-bin.tar.gz
Faça  o deploy da aplicação load-demo.war , na pasta farm de instance01 para que seja replicado para instance02.
   cp demo/server/load-demo.war /opt/jboss-6.1.0.Final/server/instance01/farm/
Veja que a aplicação já está disponível e pronto para os testes:
  • Mod Cluster Manager / Instances / Deploy
Agore execute o client, e divirta-se a vontade.
cd demo/client
./run-demo.sh
Espero que tenha ajudado 🙂

Utilizando LDAP Login Module no JBoss AS 7.1

Postado em Atualizado em

Segundo a Wikipedia LDAP Lightweight Directory Access Protocol, ou LDAP, é um protocolo para atualizar e pesquisar diretórios rodando sobre TCP/IP.

Um servidor LDAP pode fornecer uma central de informações de diretório para:

• As credenciais do usuário (login e senha)
• Informações de diretório do usuário (como nomes e endereços de correio electrônico)
• Web diretórios

Vamos instalar o OpenLDAP e criar a nossa primeira estrutura de diretórios.

Instalando e Criando a Estrutura Inicial do OpenLDAP

Para instalar o LDAP no CentOS 6.2, execute o comando abaixo:

   yum install openldap openldap-servers openldap-devel compat-openldap php-ldap openldap-clients

O próximo passo é gerar a senha root do Distinguished Name (dn) :

  /usr/sbin/slappasswd

Anote o Hash retornado:

{SSHA}lQtV0mTn20N8PLuurHjoqgkXMPe0owG3

Copie o DB_CONFIG.example para /var/lib/ldap/ :

  cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

Edite o arquivo de configuração:

  vim /etc/openldap/ldap.conf

E deixe-o como abaixo:

 include /etc/openldap/schema/core.schema
 include /etc/openldap/schema/cosine.schema
 include /etc/openldap/schema/inetorgperson.schema
 include /etc/openldap/schema/nis.schema
 allow bind_v2
 pidfile /var/run/openldap/slapd.pid
 argsfile /var/run/openldap/slapd.args
 database bdb
 suffix "dc=example,dc=com"
 rootdn "cn=Manager,dc=example,dc=com"
 rootpw {SSHA}lQtV0mTn20N8PLuurHjoqgkXMPe0owG3
 directory /var/lib/ldap
 index objectClass eq,pres
 index ou,cn,mail,surname,givenname eq,pres,sub
 index uidNumber,gidNumber,loginShell eq,pres

Para iniciar o serviço execute:

  /etc/init.d/slapd start

Agora crie o arquivo LDIF, conforme a estrutura abaixo:

dn: dc=example,dc=com
objectclass: top
objectclass: dcObject
objectclass: organization
dc: example
o: MCC

dn: ou=People,dc=example,dc=com
objectclass: top
objectclass: organizationalUnit
ou: People

dn: uid=admin,ou=People,dc=example,dc=com
objectclass: top
objectclass: uidObject
objectclass: person
uid: admin
cn: Manager
sn: Manager
userPassword: secret

dn: ou=Roles,dc=example,dc=com
objectclass: top
objectclass: organizationalUnit
ou: Roles

dn: cn=Manager,ou=Roles,dc=example,dc=com
objectClass: top
objectClass: groupOfNames
cn: Manager
description: the Sample group
member: uid=admin,ou=People,dc=example,dc=com

Adicione usuário ao LDAP, utilizando o comando abaixo:

  ldapadd -x -D "cn=Manager,dc=example,dc=com" -W -f users.ldif

Enter LDAP Password:
adding new entry “dc=example,dc=com”
adding new entry “ou=People,dc=example,dc=com”
adding new entry “uid=admin,ou=People,dc=example,dc=com”
adding new entry “ou=Roles,dc=example,dc=com”
adding new entry “cn=Manager,ou=Roles,dc=example,dc=com”

Se ocorrer algum problema, sigam as dicas desse link: http://www.ezylinux.com/en/red-hat-6-how-to-fixes-ldapadd-ldap_bind-invalid-credentials-49/

Configurando o JBoss AS 7.1

O primeiro passo é adicionar o “my_ldap_security_domain”  no arquivo JBOSS_HOME/standalone/configuration/standalone.xml , como abaixo:

<security-domain name="my_ldap_security_domain">
  <authentication>
     <login-module code="LdapExtended" flag="required">
       <module-option name="java.naming.factory.initial"  value="com.sun.jndi.ldap.LdapCtxFactory"/>
       <module-option name="java.naming.provider.url" value="ldap://localhost:389"/>
       <module-option name="java.naming.security.authentication" value="simple"/>
       <module-option name="bindDN" value="uid=admin,ou=People,dc=example,dc=com"/>
       <module-option name="bindCredential" value="secret"/>
       <module-option name="baseCtxDN" value="ou=People,dc=example,dc=com"/>
       <module-option name="baseFilter" value="(uid={0})"/>
       <module-option name="rolesCtxDN" value="ou=Roles,dc=example,dc=com"/>
       <module-option name="roleFilter" value="(member={1})"/>
       <module-option name="roleAttributeID" value="cn"/>
       <module-option name="throwValidateError" value="true"/>
       <module-option name="searchScope" value="ONELEVEL_SCOPE"/>
     </login-module>
   </authentication>
</security-domain>

Adicione também  a categoria para o logging:

<logger category="org.jboss.security">
  <level name="TRACE"/>
</logger>

Agora crie uma aplicação para utilizar o dominio de segurança my_ldap_security_domain.

No jboss-web.xml , adicione o dominio de segurança:

<jboss-web>
    <security-domain>java:/jaas/my_ldap_security_domain</security-domain>
</jboss-web>

E no web.xml,  as configurações como abaixo:

<security-constraint>
  <web-resource-collection>
    <web-resource-name>HtmlAuth</web-resource-name>
    <description>application security constraints
    </description>
    <url-pattern>/*</url-pattern>
    <http-method>GET</http-method>
    <http-method>POST</http-method>
  </web-resource-collection>
  <auth-constraint>
    <role-name>Manager</role-name>
  </auth-constraint>
</security-constraint>
<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>Test LDAP</realm-name>
</login-config>
<security-role>
    <role-name>Manager</role-name>
</security-role>

Faça o deploy e acesse a aplicação. Será solicitado usuário e senha, adicionados anteriormente ( users.ldif  –> admin / secret ) .

Vou deixar aqui a aplicação web criada para testar a autenticação no LDAP, o arquivo users.ldif e o standalone.xml.

Espero que tenha ajudado.
Abraços

Fonte: http://blog.javachap.com/index.php/installing-openldap-on-centos/

Habilitando Log HTTP ( Request , Reponse ) no JBoss AS 5.1

Postado em Atualizado em

 

Para verificar o funcionamento das requisições,  temos que adicionar ao JBossWeb uma válvula para que seja realizado o logging do request e response.
Sendo assim, edite o arquivo: JBOSS_HOME/server/<config>/deploy/jbossweb.sar/server.xml , e entre as tags Host, adicione o código abaixo:

<Host name="localhost">

<Valve className="org.apache.catalina.valves.RequestDumperValve"
prefix="localhost_access_log." suffix=".log"
pattern="common" directory="${jboss.server.log.dir}"
resolveHosts="false" />

</Host>

Inicie o JBoss, realize o deploy de sua aplicação, você deverá ver algo pareçido com o log abaixo:

01:35:50,269 INFO  [[localhost]] ===============================================================
01:36:00,128 INFO  [[localhost]] REQUEST URI       =/IETest/OutSimplePdf
01:36:00,128 INFO  [[localhost]]           authType=null
01:36:00,128 INFO  [[localhost]]  characterEncoding=null
01:36:00,128 INFO  [[localhost]]      contentLength=-1
01:36:00,128 INFO  [[localhost]]        contentType=null
01:36:00,128 INFO  [[localhost]]        contextPath=/IETest
01:36:00,128 INFO  [[localhost]]             cookie=JSESSIONID=DFD04B42EF225E194C19686823CF91D5
01:36:00,129 INFO  [[localhost]]             header=host=localhost:8080
01:36:00,129 INFO  [[localhost]]             header=user-agent=Mozilla/5.0 (X11; Linux i686; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
01:36:00,129 INFO  [[localhost]]             header=accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
01:36:00,129 INFO  [[localhost]]             header=accept-language=en-us,en;q=0.5
01:36:00,129 INFO  [[localhost]]             header=accept-encoding=gzip, deflate
01:36:00,129 INFO  [[localhost]]             header=accept-charset=ISO-8859-1,utf-8;q=0.7,*;q=0.7
01:36:00,129 INFO  [[localhost]]             header=connection=keep-alive
01:36:00,129 INFO  [[localhost]]             header=referer=http://localhost:8080/IETest/index.jsp
01:36:00,130 INFO  [[localhost]]             header=cookie=JSESSIONID=DFD04B42EF225E194C19686823CF91D5
01:36:00,130 INFO  [[localhost]]             locale=en_US
01:36:00,130 INFO  [[localhost]]             method=GET
01:36:00,130 INFO  [[localhost]]           pathInfo=null
01:36:00,130 INFO  [[localhost]]           protocol=HTTP/1.1
01:36:00,130 INFO  [[localhost]]        queryString=null
01:36:00,130 INFO  [[localhost]]         remoteAddr=127.0.0.1
01:36:00,130 INFO  [[localhost]]         remoteHost=127.0.0.1
01:36:00,130 INFO  [[localhost]]         remoteUser=null
01:36:00,130 INFO  [[localhost]] requestedSessionId=DFD04B42EF225E194C19686823CF91D5
01:36:00,130 INFO  [[localhost]]             scheme=http
01:36:00,130 INFO  [[localhost]]         serverName=localhost
01:36:00,131 INFO  [[localhost]]         serverPort=8080
01:36:00,131 INFO  [[localhost]]        servletPath=/OutSimplePdf
01:36:00,131 INFO  [[localhost]]           isSecure=false
01:36:00,131 INFO  [[localhost]] ---------------------------------------------------------------
01:36:00,340 INFO  [[localhost]] ---------------------------------------------------------------
01:36:00,340 INFO  [[localhost]]           authType=null
01:36:00,340 INFO  [[localhost]]      contentLength=892
01:36:00,340 INFO  [[localhost]]        contentType=application/pdf
01:36:00,340 INFO  [[localhost]]             header=X-Powered-By=Servlet 2.5; JBoss-5.0/JBossWeb-2.1
01:36:00,341 INFO  [[localhost]]             header=Expires=0
01:36:00,341 INFO  [[localhost]]             header=Cache-Control=maxage=3600, must-revalidate, post-check=0, pre-check=0
01:36:00,341 INFO  [[localhost]]             header=Pragma=public
01:36:00,341 INFO  [[localhost]]             header=Content-Type=application/pdf
01:36:00,341 INFO  [[localhost]]             header=Content-Length=892
01:36:00,341 INFO  [[localhost]]             header=Date=Tue, 31 Jan 2012 03:36:00 GMT
01:36:00,341 INFO  [[localhost]]            message=null
01:36:00,341 INFO  [[localhost]]         remoteUser=null
01:36:00,341 INFO  [[localhost]]             status=200
01:36:00,341 INFO  [[localhost]] ===============================================================

Espero que tenha ajudado 🙂
Abraços!

JBoss Certified Application Administrator (JBCAA) – Parte 2

Postado em Atualizado em

Continuando os meus estudos para JBCAA, hoje vamos abordar mais um tópico.

3 – Configuração dos conectores do JBoss Web (incluindo HTTPS)  ( Configure JBoss Web Connectors (including HTTPS) )

No Study Guide, podemos verificar as seguintes informações para esse tópico:

● JB336 JBoss for Administrators course
● JBoss EAP Administration and Configuration Guide3
● JBoss Web Documentation4
http://community.jboss.org/wiki/SecureTheJmxConsole
http://community.jboss.org/wiki/SSLSetup
● Creating an SSL Keystore Using the Java Keytool5
http://java.sun.com/javase/6/docs/technotes/tools/index.html#security (look for keytool)
● Example configurations included with JBoss EAP

Vamos iniciar abordando a segurança no Jmx-Console, que já é bem conhecida pelos administradores mais experientes.

O primeiro passo é visualizar o web.xml, da app jmx-console.war, e verificar se o atributo  <security-constraint> não está comentado, e com as devidas configurações, abaixo temos uma exemplo em que tudo está correto:

Localização do arquivo:  JBOSS_HOME/server/instance01/deploy/jmx-console.war/WEB-INF/web.xml

<security-constraint>
 <web-resource-collection>
   <web-resource-name>HtmlAdaptor</web-resource-name>
   <description>An example security config that only allows users with the role JBossAdmin to access the HTML JMX console web application
   </description>
   <url-pattern>/*</url-pattern>
 </web-resource-collection>
 <auth-constraint>
    <role-name>JBossAdmin</role-name>
 </auth-constraint>
 <user-data-constraint>
    <transport-guarantee>CONFIDENTIAL</transport-guarantee>
 </user-data-constraint>
</security-constraint>

<login-config>
  <auth-method>BASIC</auth-method>
  <realm-name>JBoss JMX Console</realm-name>
</login-config>

<security-role>
  <role-name>JBossAdmin</role-name>
</security-role>

Agora devemos verificar o arquivo jboss-web.xml, o <security-domain>, deve estar sem o  comentário, como abaixo:

Localização do arquivo: JBOSS_HOME/server/instance01/deploy/jmx-console.war/WEB-INF/jboss-web.xml

<!DOCTYPE jboss-web PUBLIC
"-//JBoss//DTD Web Application 5.0//EN"
"http://www.jboss.org/j2ee/dtd/jboss-web_5_0.dtd">

<jboss-web>
<!-- Uncomment the security-domain to enable security. You will need to edit the htmladaptor login configuration to setup the login modules used to authentication users. -->
   <security-domain>java:/jaas/jmx-console</security-domain>
</jboss-web>

Obs: Segundo a security note – CVE-2010-0738, devemos remover do JBOSS_HOME/server/instance01/deploy/jmx-console.war/WEB-INF/web.xml  os métodos HTTP:

  <http-method>GET</http-method>
  <http-method>POST</http-method>

Deve-se ainda adicionar ao JBOSS_HOME/server/instance01/deploy/jmx-console.war/WEB-INF/web.xml , o atributo CONFIDENTIAL que garante o uso de HTTPS, que vamos ativar posteriormente.

<user-data-constraint>
   <transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>

Para finalizar, verificamos se os arquivos aonde estão armazenados os roles e users estão corretos.

Localização do Arquivo: JBOSS_HOME/server/instance01/conf/props/jmx-console-roles.properties

  # A sample roles.properties file for use with the UsersRolesLoginModule
  admin=JBossAdmin,HttpInvoker

Localização do Arquivo: JBOSS_HOME/server/instance01/conf/props/jmx-console-users.properties

  # A sample users.properties file for use with the UsersRolesLoginModule
  admin=admin

Application Policy do Jmx-Console:

 <application-policy name="jmx-console">
   <authentication>
     <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag="required">
       <module-option name="usersProperties">props/jmx-console-users.properties</module-option>
       <module-option name="rolesProperties">props/jmx-console-roles.properties</module-option>
     </login-module>
   </authentication>
</application-policy>

Como já disse anteriormente, eu nunca fiz a prova e realmente não sei o que vai ser cobrado,  então  a aprenderem o máximo que puderem sobre os assuntos mencionados no study guide. Como recomendação para essa parte eu aconselho que os precedimentos acima sejam repetidos para o web-console e jbossws, qualquer dificuldade nessas tarefas deixem comentários.

Vamos gerar o nosso certificado ( keystore ), e habilitar o connetor HTTPS. Para obter o certificado execute o comando abaixo:

   keytool -genkey -alias example -keystore example.keystore -keypass 123456 -keyalg RSA

Por convenção geralmente o .keystore, fica armazenado no diretório JBOSS_HOME/server/instance01/conf/ .

Para visualizar informações do certificado execute:

  keytool -v -list -keystore example.keystore
Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

Alias name: example
Creation date: Jan 29, 2012
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Mauricio Magnani, OU=Home, O=Home, L=SP, ST=SP, C=BR
Issuer: CN=Mauricio Magnani, OU=Home, O=Home, L=SP, ST=SP, C=BR
Serial number: 4f25c7bf
Valid from: Sun Jan 29 20:27:11 BRST 2012 until: Sat Apr 28 19:27:11 BRT 2012
Certificate fingerprints:
MD5:  70:2F:D1:5E:23:E2:1A:3C:DF:E4:76:1D:82:28:AE:0A
SHA1: 03:EF:60:BF:2D:33:D1:29:6A:67:44:07:28:4B:09:E5:6F:56:70:D2
Signature algorithm name: SHA1withRSA
Version: 3

*******************************************
*******************************************

Finalmente vamos ativer o connector HTTPS, isso é bem simples, no arquivo JBOSS_HOME/server/instance01/deploy/jbossweb.sar/server.xml, descomente e altere o bloco abaixo:

<!-- SSL/TLS Connector configuration using the admin devl guide keystore-->
<Connector protocol="HTTP/1.1" SSLEnabled="true" port="8443" address="${jboss.bind.address}"
scheme="https" secure="true" clientAuth="false" keystoreFile="${jboss.server.home.dir}/conf/example.keystore"
keystorePass="123456" sslProtocol = "TLS" />

Agora acesse a url https://localhost:8443/ , e verifique se tudo está funcionando.

Não percam a próxima parte 🙂

abraços!

Cluster de Servidores Standalone no JBoss AS 7.1 – Parte 1

Postado em Atualizado em

Em aplicações sérias, é essencial que o ambiente ofereça escalabilidade e alta disponibilidade, esse objetivo pode ser alcançado através de ambientes clusterizados e altamente elásticos. Hoje vamos abordar uma das formas de criação de Cluster no JBoss AS 7.1, utilizando o conceito de servidores standalone.

As possíveis configurações de cluster  para servidores standalone podem ser divididos em dois cenários principais:

• Cluster de nós executando na mesma máquina
• Cluster de nós executando em máquinas diferentes

Cluster de Nós Executando na Mesma Máquina

A criação de cluster de servidores JBoss na mesma máquina, se aplica  quando possuímos ótimos recursos de hardware. A configuração de nós na mesma máquina exige que você duplique a sua distribuição do JBoss AS 7.  Também será necessário que você escolha entre duas opções:

1. Definir múltiplos endereços IP  na mesma máquina.
2. Definir um offset de portas para cada nó.

A primeira forma é conhecida como multi-homing,  possuir múltiplas conexões reduzem a chance de acontecer uma parada catastrófica se uma das conexões falhar. Para configurar multi-homing no Linux, é bem simples, basta especificar o IP que deverá responder em determinada interface:

# ifconfig eth0 192.168.0.10 up
# ifconfig eth1 192.168.0.20 up

Exemplo:

eth0      Link encap:Ethernet  Endereço de HW 08:00:27:53:CD:E5
          inet end.: 192.168.0.10  Bcast:192.168.0.255  Masc:255.255.255.0
          endereço inet6: fe80::a00:27ff:fe53:cde5/64 Escopo:Link
          UP BROADCASTRUNNING MULTICAST  MTU:1500  Métrica:1
          RX packets:4939 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4919 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000
          RX bytes:5269711 (5.0 MiB)  TX bytes:761430 (743.5 KiB)

eth1      Link encap:Ethernet  Endereço de HW 08:00:27:4A:3C:82
          inet end.: 192.168.0.20  Bcast:192.168.0.255  Masc:255.255.255.0
          endereço inet6: fe80::a00:27ff:fe4a:3c82/64 Escopo:Link
          UP BROADCASTRUNNING MULTICAST  MTU:1500  Métrica:1
          RX packets:118 errors:0 dropped:0 overruns:0 frame:0
          TX packets:190 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000
          RX bytes:32243 (31.4 KiB)  TX bytes:22900 (22.3 KiB)

O próximo passo agora é configurarmos o arquivo standalone-ha.xml, só para deixar claro, nós duplicamos os arquivos de instalação do JBoss AS 7, então temos JBossAS7-1 e JBossAS7-2 .

Edite o arquivo standalone-ha.xml do JBossAS7-1

   vim JBOSS_HOME/standalone/configuration/standalone-ha.xml

Atualize as interface public e management, com o IP configurado anteriormente.

 <interfaces>
         <interface name="management">
            <inet-address value="192.168.0.10"/>
         </interface>
         <interface name="public">
            <inet-address value="192.168.0.10"/>
         </interface>
 </interfaces>

Repita o Processo para o JBossAS-2

vim JBOSS_HOME/standalone/configuration/standalone-ha.xml

Atualize as interfaces:

 <interfaces>
         <interface name="management">
            <inet-address value="192.168.0.20"/>
         </interface>
         <interface name="public">
            <inet-address value="192.168.0.20"/>
         </interface>
 </interfaces>

Agora já estamos prontos para iniciar o cluster do JBoss AS 7, para isso execute os comandos abaixo:

JBossAS7-1 –>    ./JBOSS_HOME/bin/standalone.sh –server-config=standalone-ha.xm -Djboss.node.name=node1

JBossAS7-2 –>    ./JBOSS_HOME/bin/standalone.sh –server-config=standalone-ha.xm -Djboss.node.name=node2

Ao iniciarmos os servidores não encontramos detalhes sobre os nós do cluster, isso se deve ao fato de que o serviço de cluster só é  iniciado sob demanda no JBoss AS 7, por isso não conseguimos visualizar nada relacionado a isso no console.
Para habilitarmos o cluster, devemos realizar o deploy de uma aplicação que esteja utilizando a tag <distributable/>  no web.xml.

<web-app>
   <distributable/>
</web-app>

Ao realizar o deploy, podemos verificar que os serviços de cluster são ativados:

13:35:05,796 INFO  [stdout] (MSC service thread 1-2)
13:35:05,797 INFO  [stdout] (MSC service thread 1-2) -------------------------------------------------------------------
13:35:05,797 INFO  [stdout] (MSC service thread 1-2) GMS: address=node2/web, cluster=web, physical address=192.168.0.20:55200
13:35:05,797 INFO  [stdout] (MSC service thread 1-2) -------------------------------------------------------------------
13:35:06,177 INFO  [org.jboss.as.clustering.CoreGroupCommunicationService.web] (MSC service thread 1-2) JBAS010207: Number of cluster members: 2
13:35:08,184 INFO  [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (MSC service thread 1-2) ISPN000078: Starting JGroups Channel
13:35:08,187 AVISO [org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher] (MSC service thread 1-2) Channel Muxer already has a default up handler installed (org.jboss.as.clustering.jgroups.ClassLoaderAwareUpHandler@35cfee57) but now it is being overridden
13:35:08,190 INFO  [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (MSC service thread 1-2) ISPN000094: Received new cluster view: [node1/web|1] [node1/web, node2/web]
13:35:08,192 INFO  [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (MSC service thread 1-2) ISPN000079: Cache local address is node2/web, physical addresses are [192.168.0.20:55200]
13:35:08,201 INFO  [org.infinispan.factories.GlobalComponentRegistry] (MSC service thread 1-2) ISPN000128: Infinispan version: Infinispan 'Brahma' 5.1.0.CR1
13:35:08,203 WARN  [org.infinispan.config.ConfigurationValidatingVisitor] (MSC service thread 1-1) ISPN000152: Passivation configured without a valid eviction policy. This could mean that the cache store will never get used unless code calls Cache.evict() manually.
13:35:08,681 INFO  [org.infinispan.jmx.CacheJmxRegistration] (MSC service thread 1-2) ISPN000031: MBeans were successfully registered to the platform mbean server.
13:35:08,805 INFO  [org.infinispan.jmx.CacheJmxRegistration] (MSC service thread 1-1) ISPN000031: MBeans were successfully registered to the platform mbean server.
13:35:09,469 INFO  [org.jboss.as.clustering] (MSC service thread 1-2) JBAS010301: Started registry cache from web container
13:35:09,474 INFO  [org.jboss.as.clustering] (MSC service thread 1-1) JBAS010301: Started repl cache from web container
13:35:09,939 INFO  [org.jboss.web] (MSC service thread 1-2) registering web context: /myapptest
13:35:10,124 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 2) JBAS018559: Deployed "myapptest.war"

Lembrando que que não existe mais o conceito de farm deployment, mas você pode realizar o deploy de uma aplicação para todos as instâncias que fazem parte do mesmo grupo de servidores. Vamos abordar esse conceito mais a frente. Nesse caso é necessário realizar o deploy nos dois nós. O deploy pode pode ser realizado no diretório JBOSS_HOME/standalone/deployments/.

Uma ultima observação é de que poderíamos ter ter passado via parametro na inicialização os IPs das interfaces public e management, como abaixo:

JBossAS7-1 –> ./JBOSS_HOME/standalone.bat –server-config=standalone-ha.xml –b 192.168.0.10 -bmanagement 192.168.0.10 -Djboss.node.name=node1

JBossAS7-2 –> ./JBOSS_HOME/standalone.bat –server-config=standalone-ha.xml –b 192.168.0.20 -bmanagement 192.168.0.20 -Djboss.node.name=node2

Na próxima parte vamos abordar Cluster de nós executando em máquinas diferentes, que é muita similar ao que fizemos.

Abraços a todos!

🙂