No exercício 3.27, recebemos o token do <Header>
do Envelope SOAP colocando o parâmetro com header=true
e, dentro do método, comparamos o token recebido com o token esperado.
@Stateless
@WebService(targetNamespace="http://caelum.com.br/estoquews/v1")
public class EstoqueWS {
//...
@WebMethod(operationName="ItensPeloCodigo")
@WebResult(name="ItemEstoque")
public List<ItemEstoque> getQuantidade(
@WebParam(name="codigo") List<String> codigos,
@WebParam(name="tokenUsuario", header=true) String token) {
if(token == null || !token.equals("TOKEN123")) {
throw new AutorizacaoException("Não autorizado.");
}
//...
}
}
Mas imagina só se TODO método tivesse que receber esse parâmetro e ter esse if
? Muito tosco!
Dá pra melhorar esse código usando um SOAPHandler do JAX-WS.
Precisamos criar uma classe que implementa a interface SOAPHandler
. Se o método handleMessage
retornar false ou alguma exceção for lançada, o request ao WebService é barrado.
Veja a classe Autorizador
acima:
- obtemos o
SOAPEnvelope
através do contexto - o envelope através do
SOAPHeader
- o token através do header.
Perceba na classe EstoqueWS
acima, que não temos mais o parâmetro nem o if e utilizamos a anotação @HandlerChain
apontando para o arquivo handlers.xml
.
@Stateless
@HandlerChain(file="handlers.xml")
@WebService(targetNamespace="http://caelum.com.br/estoquews/v1")
public class EstoqueWS {
//...
@WebMethod(operationName="ItensPeloCodigo")
@WebResult(name="ItemEstoque")
public List<ItemEstoque> getQuantidade(
@WebParam(name="codigo") List<String> codigos) {
//...
}
}
O arquivo handlers.xml
deve ficar no mesmo pacote do EstoqueWS
e aponta para a classe Autorizador
.