1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Transferir atributos de um Handler Soap para uma Classe

Possuo um Jax-WS Handler Soap que faz a verificação de um login e senha, e caso seja valido esses dados permite o consumo do webservice, o problema é que essa validaçao ocorre no handler e o handler libera ou não o acesso ao web service, só que agora preciso passar essas informações do handler para o webservice, alguem sabe como?

segue o handler:

public class TokenHandler implements SOAPHandler<SOAPMessageContext> {

    @Override
    public boolean handleMessage(SOAPMessageContext context) {
        System.out.println("Server : handleMessage()......");

        Boolean isRequest = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

        if(!isRequest){

            try{
                SOAPMessage soapMsg = context.getMessage();
                SOAPEnvelope soapEnv = soapMsg.getSOAPPart().getEnvelope();
                SOAPHeader soapHeader = soapEnv.getHeader();

                //se não possuir header, será adicionado.
                if (soapHeader == null){
                    soapHeader = soapEnv.addHeader();
                    //throw exception
                    generateSOAPErrMessage(soapMsg, "No SOAP header.");
                }

                //Recebe todos os Header Elementos, incluindo o username e password
                Iterator<Node> it = soapHeader.extractHeaderElements(SOAPConstants.URI_SOAP_ACTOR_NEXT);

                //se não possuir os actors next's onde serão setados o username e o password, throws exception
                if (it == null || !it.hasNext()){
                    generateSOAPErrMessage(soapMsg, "No header block for next actor.");
                }

                String userName = null;
                String password = null;

                //aqui é feito o parse dos actors setados no header
                while (it.hasNext()) { 
                    Node node = it.next();
                    if (node != null && node.getNodeName().equals("userName")) 
                        userName = node.getValue(); 
                    if (node != null && node.getNodeName().equals("password")) 
                        password = node.getValue();
                } 

                //se possuir os actors mais os values dos nodes forem nulos, throws exception
                if (userName == null || password == null) { 
                    generateSOAPErrMessage(soapMsg, "Sem usuário ou senha."); 
                }

                //verifica se o token da aplicação é valido, caso contrario, throws exception
                if(!isTokenValido(userName, password)){
                    generateSOAPErrMessage(soapMsg, "Usuário ou senha errado, acesso negado.");
                }

            }catch(SOAPException e){
                System.err.println(e);
            }
        }


        //continue other handler chain
        return true;
    }

    @Override
    public boolean handleFault(SOAPMessageContext context) {
        return true;
    }

    @Override
    public void close(MessageContext context) {

    }

    @Override
    public Set<QName> getHeaders() {
        return null;
    }

    private void generateSOAPErrMessage(SOAPMessage msg, String reason) {
        try {
            SOAPBody soapBody = msg.getSOAPPart().getEnvelope().getBody();
            SOAPFault soapFault = soapBody.addFault();
            soapFault.setFaultString(reason);
            throw new SOAPFaultException(soapFault); 
        }
        catch(SOAPException e) { 
            //tratar log
        }
    }

    public boolean isTokenValido(String usuario, String senha) {

        try {
            //Aqui faço a validação do token e quero adicionar 
                        //esse token para disponibilizar para uma outra classe

        } catch(Exception e) {
            e.printStackTrace();
        }

        return true;
    }

}

e quero que a seguinte classe possa ter acesso ao login e senha:

@Stateless
@WebService
@HandlerChain(file=HandlerUtil.HANDLER_CHAIN_PATH)
public class ClienteService {

//atributos
//preciso ter acesso ao login e senha nessa classe.

    @Resource
    WebServiceContext wsContext;

    public ClienteService() {

    }

    //outros metodos    

}
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags soap jaxws java webservices ou faça a sua própria pergunta.