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
SOAPEnvelopeatravé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.