Arquivo de janeiro \31\UTC 2012
Habilitando Log HTTP ( Request , Reponse ) no JBoss AS 5.1
Publicado por Mauricio Magnani em Java, JBoss AS 5 em 31 de janeiro de 2012
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
Publicado por Mauricio Magnani em Diversos, Java, JBCAA, JBoss AS 5 em 29 de janeiro de 2012
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
Publicado por Mauricio Magnani em Java, JBoss AS 7 em 29 de janeiro de 2012
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!
Implantando Sua Aplicação Web No Contexto Raiz no JBoss AS 7.1
Publicado por Mauricio Magnani em Java, JBoss AS 7 em 28 de janeiro de 2012
Ps: Copei boa parte do post Implantando Sua Aplicação Web No Contexto Raiz no JBoss AS 6.1
Como implantar os aplicativos criados para que sejam acessados no contexto raiz ( localhost:8080 ) ?. Bom para fazer isso é bem simples \o/ , basta criar em sua aplicação web o arquivo jboss-web.xml , abaixo de WEB_INF, e inserir o conteúdo abaixo:
<!DOCTYPE jboss-web PUBLIC
"-//JBoss//DTD Web Application 5.0//EN"
"http://www.jboss.org/j2ee/dtd/jboss-web_5_0.dtd">
<jboss-web>
<context-root>/</context-root>
</jboss-web>
No JBoss AS 7 não podemos mais remover ROOT.war , a solução agora é desativá-lo.
No arquivo JBOSS_HOME/standalone/configuration/standalone.xml, e subsystem jboss:domain:web: atualize a propriedade enable-welcome-root para false .
<subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host">
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
<virtual-server name="default-host" enable-welcome-root="false">
<alias name="localhost"/>
<alias name="example.com"/>
</virtual-server>
</subsystem>
Agora faça o deploy e acesse a url http://localhost:8080. Sua aplicação deverá estar rodando no contexto raiz, como a imagem abaixo:
Abraços!
Salvando o Log no Banco de Dados no JBoss AS 7.1
Publicado por Mauricio Magnani em Java, JBoss AS 7 em 28 de janeiro de 2012
Obs: Pré Requisito Módulo JDBC MySQL
JBoss: jboss-as-7.1.0.CR1b
Algumas vezes necessitamos armazenar o log das nossas aplicações diretamente no banco de dados. Podemos fazer isso através de Logs customizáveis. A comunidade JBoss.org, criou um excelente artigo sobre Custom Log Handlers, e o nosso post de hoje será baseado nesse artigo.
A comunidade deixou uma classe de exemplo, que extende java.util.logging.Handler, segue abaixo o código:
package com.JdbcLogger;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Handler;
import java.util.logging.LogRecord;
import org.jboss.logmanager.MDC;
public class JdbcLogger extends Handler
{
private static final Object PARAM_TIMESTAMP = "$TIMESTAMP";
private static final Object PARAM_LEVEL = "$LEVEL";
private static final Object PARAM_MESSAGE = "$MESSAGE";
private static final String PARAM_MDC = "$MDC[";
private static final Object PARAM_PASSTROUGH = "?";
private String driverClassName;
private String jdbcUrl;
private String username;
private String password;
private String insertStatement;
private Connection connection;
private List<String> parameters = new ArrayList<String>();
@Override
public void publish(LogRecord record)
{
if (!ensureReady())
{
return;
}
try
{
insertRecord(record);
}
catch (SQLException e)
{
e.printStackTrace();
}
}
private synchronized boolean ensureReady()
{
if (connection != null)
{
return true;
}
try
{
parseStatementParameters();
setupConnection();
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
return false;
}
catch (SQLException e)
{
e.printStackTrace();
return false;
}
return true;
}
private void parseStatementParameters()
{
int paramsStart = insertStatement.indexOf("(");
int paramsStop = insertStatement.lastIndexOf(")");
String paramsString = insertStatement.substring(paramsStart + 1, paramsStop);
for (String param : paramsString.split(","))
{
parameters.add(param.trim());
paramsString = paramsString.replace(param, "?");
}
insertStatement = String.format("%s(%s)", insertStatement.substring(0, paramsStart), paramsString);
}
private void setupConnection() throws ClassNotFoundException, SQLException
{
Class.forName(driverClassName);
connection = DriverManager.getConnection(jdbcUrl, username, password);
}
private void insertRecord(LogRecord logRecord) throws SQLException
{
PreparedStatement statement = null;
try
{
statement = connection.prepareStatement(insertStatement);
setStatementParameters(statement, logRecord);
statement.executeUpdate();
}
finally
{
if (statement != null)
{
statement.close();
}
}
}
private void setStatementParameters(PreparedStatement statement, LogRecord logRecord) throws SQLException
{
for (int i = 0; i < parameters.size(); i++)
{
statement.setObject(i + 1, getParameterValue(i, logRecord));
}
}
private Object getParameterValue(int i, LogRecord record)
{
String parameter = parameters.get(i);
if (PARAM_PASSTROUGH.equals(parameter))
{
return null;
}
if (PARAM_TIMESTAMP.equals(parameter))
{
return new Date(record.getMillis());
}
else if (PARAM_LEVEL.equals(parameter))
{
return record.getLevel().toString();
}
else if (PARAM_MESSAGE.equals(parameter))
{
return getFormatter().format(record);
}
else if (parameter.startsWith(PARAM_MDC))
{
int startIndex = parameter.indexOf("[") + 1;
int stopIndex = parameter.indexOf("]") - 1;
String key = parameter.substring(startIndex, stopIndex + 1);
return MDC.get(key);
}
else
{
return parameter;
}
}
@Override
public void flush()
{
}
@Override
public void close()
{
if (connection != null)
{
try
{
connection.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
public void setDriverClassName(String driverClassName)
{
this.driverClassName = driverClassName;
}
public void setJdbcUrl(String jdbcUrl)
{
this.jdbcUrl = jdbcUrl;
}
public void setUsername(String username)
{
this.username = username;
}
public void setPassword(String password)
{
this.password = password;
}
public void setInsertStatement(String insertStatement)
{
this.insertStatement = insertStatement;
}
}
Agora devemos gerar um arquivo .jar para empacotar a classe acima, como por exemplo logger.jar
O próximo passo é criar um módulo, para disponibilizarmos o nosso log no JBoss AS 7.
Com o comando abaixo, criamos a estrutura de diretórios necessária para o funcionamento.
mkdir -p JBOSS_HOME/modules/com/JdbcLogger/main
Copie o logger.jar gerado anteriormente para JBOSS_HOME/modules/com/JDBCLogger/main
Agora crie o arquivo module.xml
vim JBOSS_HOME/modules/com/JdbcLogger/main/module.xml
E e adicione o conteúdo abaixo:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="com.JdbcLogger">
<resources>
<resource-root path="logger.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="org.jboss.logging"/>
<module name="org.jboss.logmanager"/>
<module name="com.mysql"/>
</dependencies>
</module>
Lembrando que o módulo com.mysql, já precisa estar disponível no JBoss AS 7. Caso não saiba como criar, veja o artigo http://jbossdivers.wordpress.com/2012/01/20/introducao-ao-jboss-as-7-parte-2/ .
No arquivo JBOSS_HOME/standalone/configuration/standalone.xml, e subsystem jboss:domain:logging:1.1, adicione o conteúdo abaixo:
<custom-handler name="DB" module="com.JdbcLogger">
<level name="INFO"/>
<formatter>
<pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t)%s%E%n"/>
</formatter>
<properties>
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://192.168.0.189:3306/security"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<property name="insertStatement" value="insert into log_table values (?, $TIMESTAMP, $LEVEL, $MDC[ip], $MDC[user], $MESSAGE, hardcoded)"/>
</properties>
</custom-handler>
No root logger adicione o handler criado.
<root-logger>
<level name="INFO"/>
<handlers>
<handler name="CONSOLE"/>
<handler name="FILE"/>
<handler name="DB"/>
</handlers>
</root-logger>
A tabela abaixo, deve ser criada no banco de dados que armazenará os logs ( no nosso caso o security ).
CREATE TABLE log_table(id INT(11) NOT NULL AUTO_INCREMENT, timestamp VARCHAR(255) DEFAULT NULL,level VARCHAR(255) DEFAULT NULL,mdc_ip VARCHAR(255) DEFAULT NULL,mdc_user VARCHAR(255) DEFAULT NULL,message VARCHAR(1500) DEFAULT NULL,hardcoded VARCHAR(255) DEFAULT NULL,PRIMARY KEY (id))ENGINE = INNODB AUTO_INCREMENT = 1;
Inicie o JBoss AS 7
./JBOSS_HOME/bin/standalone.sh
Agora realize o select na tabela log_table.
select * from log_table
Alguns dados deverão ser retornados, como na imagem abaixo.
Podemos ainda utilizar um dominio de segurança encriptado para os dados de acesso ao banco de dados, para isso vejam o Post Introdução ao JBoss AS parte 2 .
Espero que seja útil ![]()
Abraços!
Fonte: https://community.jboss.org/wiki/CustomLogHandlersOn701
Comandos Úteis no CLI utilizando o JBoss AS 7.1
Publicado por Mauricio Magnani em Java, JBoss AS 7 em 27 de janeiro de 2012
Vou listar abaixo, alguns comandos que são essenciais para administração do JBoss AS 7, utilizando o CLI.
Visualizar a árvore JNDI
/subsystem=naming:jndi-view
Visualizar a interface publica do JBoss
/interface=public:read-attribute(name=resolved-address)
Visualizar informações do Ambiente
version
Visualizar os serviços registrados no container e seus status
/core-service=service-container:dump-services
Visualizar todos os drivers instalados
/subsystem=datasources:installed-drivers-list
Existem muito mais comandos úteis, estudem a documentação
Abraços!
Fonte: https://docs.jboss.org/author/display/AS71/CLI+Recipes
Configurando o Histórico do CLI no JBoss AS 7.1
Publicado por Mauricio Magnani em JBoss AS 7 em 27 de janeiro de 2012
Todos os comando executados através da command-line interface (CLI), são guardados em arquivos de histórico, similar ao que acontece no sistemas Linux / Unix. Se você já utilizou o CLI , deve ter percebido que os comandos são mantidos na mémória. Também são persistidos em um arquivo de histórico chamdo jboss-cli-history, que se localizar no home do usuário ( user.home ), por exemplo:
-rw-rw-r–. 1 mmagnani mmagnani 5250 Jan 27 01:48 .jboss-cli-history
O CLI guarda os últimos 500 comandos, para visualizá-los execute: history.
Por padrão o o histórico do CLI, possui 3 opções: habilitar / desabilitar ou apagar o histórico.
Segue abaixo a descrição dos comportamentos:
| Argumento | Comportamento |
| disable | Desabilita o histórico, mas não limpa os comandos que já estavam salvos |
| enable | Habilita novamente o histórico e inicia do ponto em que havia sido desabilitado. |
| clear | Limpa completamente o histórico, mas não deleta o arquivo .jboss-cli-history |
Os comandos devem ser utilizados da seguinte forma:
history –enable
history –disable
history –clear
Espero que tenha ajudado, abraços!
Caminhos Relativos ( Paths ) no JBoss AS 7.1
Publicado por Mauricio Magnani em Java, JBoss AS 7 em 27 de janeiro de 2012
Por padrão o JBoss AS fornece um conjunto de caminhos do sistema, que estão disponíveis para utilização, como caminhos relativos.
Abaixo temos um quadro explicativo desses caminhos no JBoss AS 7.
| Caminhos | Descrição |
| jboss.home | Diretório root do JBoss AS |
| user.home | Diretório inicial do usuário |
| user.dir | Diretório de trabalho do usuário atual |
| java.home | Diretório da instalação Java / JDK |
| jboss.server.base.dir | Diretório root para instâncias dos servidores |
| jboss.server.data.dir | Diretório utilizado para persistir dados em disco / arquivos |
| jboss.server.log.dir | Diretório utilizado para armazenar os logs das aplicações. |
| jboss.server.tmp.dir | Diretório utilizado para aquivos temporários |
| jboss.domain.servers.dir | Diretório utilizado pelo host controller para criar a área de trabalho das instâncias do servidores. |
Espero que seja útil.
Abraços!
Habilitando SSL no JBoss AS 7.1
Publicado por Mauricio Magnani em JBoss AS 7 em 27 de janeiro de 2012
Hoje vamos aprender como habilitar SSL no JBoss AS 7.
Vamos armazenar o .keystore no diretório configuration da nossa instância.
cd JBOSS_HOME/standalone/configuration/
Agora execute:
keytool -genkey -alias example -keystore example.keystore -keypass 123456 -keyalg RSA
Preencha as informações do certificado, conforme a sua necessidade.
Adicione o ao JBOSS_HOME/standalone/configuration/standalone.xml , as configurações abaixo no subsystem web.
<connector name="https" protocol="HTTP/1.1" scheme="https" socket-binding="https"> <ssl name="ssl" key-alias="example" password="123456" certificate-key-file="../standalone/configuration/example.keystore"/> </connector>
Abra o navegador de sua preferência e verifique a url https://localhost:8443/ .
O SSL está habilitado.
Espero que tenha ajudado.
Abraços!
JBoss: jboss-as-7.1.0.CR1b
Fonte: https://docs.jboss.org/author/display/AS7/HTTPS+Connectors
Introdução ao JBoss AS 7.1 – Parte 2
Publicado por Mauricio Magnani em Java, JBoss AS 7 em 20 de janeiro de 2012
Continuando o post anterior http://jbossdivers.wordpress.com/2012/01/20/introducao-ao-jboss-as-7-parte-1/, hoje o objetivo será criar um novo data source e um domínio de segurança baseado em banco de dados com a senha escriptada.
Como o nosso foco aqui é o JBoss AS 7, utilize o post http://jbossdivers.wordpress.com/2011/08/29/instalando-mysql-5-5-on-centos-5-6/, para se ambientar com o MySQL. Crie um banco de dados chamado db_security. Vamos utiliza-lo para armazenar os nossos roles e passwords.
1 – Instalando um Driver JDBC / MySQL como Módulo
Devemos realizar o download do driver JDBC para o nosso banco de dados, que no caso é o MySQL 5.
O driver pode se baixado no seguinte endereço: http://dev.mysql.com/downloads/connector/j/
A estrutura de diretórios do nosso módulo deve ser criada conforme exemplificada abaixo:
mkdir -p jboss-as-7.1.0.CR1/modules/com/mysql/main
O diretório “main”, conterá os arquivos mysql-connector-java-5.1.18-bin.jar e o module.xml.
Para copiar o driver execute:
cp mysql-connector-java-5.1.18-bin.jar /jboss-as-7.1.0.CR1/modules/com/mysql/main/
O Próximo passo, é criar o arquivo module.xm
vim jboss-as-7.1.0.CR1/modules/com/mysql/main/module.xml
Inserindo o conteúdo abaixo:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="com.mysql">
<resources>
<resource-root path="mysql-connector-java-5.1.18-bin.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
</dependencies>
</module>
Agora vamos fazer com o que o JBoss AS 7, reconheça o novo módulo de Data Source. Para isso devemos editar o arquivo standalone.xml, para isso execute:
vim jboss-as-7.1.0.CR1/standalone/configuration/standalone.xml
O “subsystem” <subsystem xmlns=”urn:jboss:domain:datasources:1.0″>, deve ser editado, e o conteúdo abaixo deve ser inserido:
<!--<datasources> -->
<datasource jndi-name="java:/MySQLDS" pool-name="MyPool" enabled="true" jta="true" use-java-context="true" use-ccm="true">
<connection-url>jdbc:mysql://localhost:3306/db_security</connection-url>
<driver>mysql</driver>
<security>
<user-name>usuario_database</user-name>
<password>senha_database</password>
</security>
<statement>
<prepared-statement-cache-size>100</prepared-statement-cache-size>
<share-prepared-statements/>
</statement>
</datasource>
<!--<drivers>-->
<driver name="mysql" module="com.mysql"/>
<!--</drivers>-->
<!--</datasources>-->
Reinicie o JBoss e o datasource para o MySQL estará disponível.
Você deverá ver algo pareçido com a mensagem abaixo:
15:33:51,221 INFO [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-3) JBAS010400: Bound data source [java:/MySQLDS]</em>
2 – Criando Domínio de Segurança Baseado em Banco de Dados com a Senha do Data Source Encriptada
A primeira coisa a ser feita é gerar a senha do banco de dados utilizando um algoritmo do Picketbox. Para isso execute os comandos abaixo:
cd $JBOSS_HOME$ java -cp modules/org/jboss/logging/main/jboss-logging-3.1.0.CR2.jar:modules/org/picketbox/main/picketbox-4.0.6.Beta2.jar org.picketbox.datasource.security.SecureIdentityLoginModule senha Encoded password: -21fe4fcab9086fdc
Agora edite o arquivo:
vim jboss-as-7.1.0.CR1/standalone/configuration/standalone.xml
Encontre o Subsystem “<subsystem xmlns=”urn:jboss:domain:security:1.0″>” e entre as tags <security-domains>
Insira o conteúdo abaixo.
<security-domain name="security-encrypted-ds" cache-type="default">
<authentication>
<login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
<module-option name="username" value="usuario_database"/>
<module-option name="password" value="-21fe4fcab9086fdc"/>
<module-option name="managedConnectionFactoryName" value="jboss.jca:service=LocalTxCM,name=MyPool"/>
</login-module>
</authentication>
</security-domain>
Edite novamente o “Subsystem” <subsystem xmlns=”urn:jboss:domain:datasources:1.0″>, dentro da tag <security> :
Remova:
<user-name>usuario_database</user-name> <password>senha_database</password>
E adicione o dominio de segurança que acabamos de configurar:
<security-domain>security-encrypted-ds</security-domain>
Pronto
, o nosso data source está funcionando com a senha encriptada, agora vamos criar um domínio de segurança, que utiliza o data source encriptado e armazena os roles e users em tabelas.
Vamos gerar a senha encriptada do usuário que irá acessar o nosso domínio de segurança, para isso crie uma classe Java, utilizando a estrutura abaixo:
As libs utilizadas são: modules/org/jboss/logging/main/jboss-logging-3.1.0.CR2.jar
modules/org/picketbox/main/picketbox-4.0.6.Beta2.jar
import org.jboss.security.auth.spi.Util;
public class Main {
public static Util util;
public static void main(String[] args) {
System.out.println(util.createPasswordHash("SHA-256", "BASE64", null, null, "senha"));
}
}
Retorno: t+lL5RPpboxFzSPRYideWhLr3pEApCXE683X+k3NiXw=
Crie as tabelas abaixo no db_security:
create table users (username varchar(32) not null primary key,password varchar(100) not null);
create table roles (username varchar(32) not null,rolename varchar(32) not null,primary key (username, rolename));
insert into users (username, password) values ("usuario", "t+lL5RPpboxFzSPRYideWhLr3pEApCXE683X+k3NiXw=");
insert into roles values ("usuario", "Admin");
Novamente no Subsystem “<subsystem xmlns=”urn:jboss:domain:security:1.0″>” e entre as tags <security-domains>
Insira o conteúdo abaixo:
<security-domain name="security-database" cache-type="default">
<authentication>
<login-module code="Database" flag="required">
<module-option name="dsJndiName" value="java:/MySQLDS"/>
<module-option name="principalsQuery" value="select password from users where username=?"/>
<module-option name="rolesQuery" value="select rolename, 'Roles' from roles where username=?"/>
<module-option name="hashAlgorithm" value="SHA-256"/>
<module-option name="hashEncoding" value="base64"/>
</login-module>
</authentication>
</security-domain>
Agora na aplicação Web, adicione o conteúdo abaixo no web.xml
<security-constraint> <web-resource-collection> <web-resource-name>HtmlAuth</web-resource-name> <description>Test Security Domains</description> <url-pattern>/*</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>Admin</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>My Test JBoss AS 7</realm-name> </login-config> <security-role> <role-name>Admin</role-name> </security-role>
Crie o arquivo jboss-web.xml, e adicione o conteúdo abaixo:
<jboss-web> <security-domain>java:/jaas/security-database</security-domain> </jboss-web>
Realize o deploy e acesse pelo browser de sua preferência, a aplicação deverá pedir o usuário e senha que estão armazenados no banco de dados.
Vou deixar os principais arquivos utilizado nesse post aqui para download.
Link: Arquivos
Abraços a todos












