Zugriff auf SOAP-message-header in die angeforderte Methode

EDIT : Nachricht gelöscht und den code Hinzugefügt

Entwickle ich eine jax-ws-basierte web-service mit grundlegenden Java-client.

Verwende ich SOAP-Handler, um den Benutzer zu authentifizieren. Auf der client-Seite, das hinzufügen der Benutzer-id und das token an die SOAP-header und ein weiterer auf der server-Seite, die diese Informationen und die Authentifizierung der Benutzer mit der Datenbank.

Client-Seite (vereinfacht) :

import static modules.auth.AuthClient.userID;
import static modules.auth.AuthClient.token;

public boolean handleMessage(SOAPMessageContext context) {

    //Getting SOAP headers
    SOAPMessage soapMsg = context.getMessage();
    SOAPEnvelope soapEnv = soapMsg.getSOAPPart().getEnvelope();
    SOAPHeader soapHeader = soapEnv.getHeader();

    QName qname;
    SOAPHeaderElement soapHeaderElement;

    //Add userID in SOAP header
    qname = new QName("****","UserID");
    soapHeaderElement = soapHeader.addHeaderElement(qname);
    soapHeaderElement.setActor(SOAPConstants.URI_SOAP_ACTOR_NEXT);
    soapHeaderElement.addTextNode(userID);

    //Add token in SOAP header
    qname = new QName("****","Token");
    soapHeaderElement = soapHeader.addHeaderElement(qname);
    soapHeaderElement.setActor(SOAPConstants.URI_SOAP_ACTOR_NEXT);
    soapHeaderElement.addTextNode(token);

    soapMsg.saveChanges();

    return true;
}

Server-Seite (vereinfacht) :

public boolean handleMessage(SOAPMessageContext context) {  
    Boolean isRequest = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

    if (!isRequest) {
        //Getting SOAP headers
        SOAPMessage soapMsg = context.getMessage();
        SOAPEnvelope soapEnv = soapMsg.getSOAPPart().getEnvelope();
        SOAPHeader soapHeader = soapEnv.getHeader();

        Iterator it = soapHeader.extractHeaderElements(SOAPConstants.URI_SOAP_ACTOR_NEXT);

        Node userIDNode = (Node) it.next();
        String userID = (userIDNode == null) ? null : userIDNode.getValue();

        Node tokenNode = (Node) it.next();
        String token = (tokenNode == null) ? null : tokenNode.getValue();

        //Return if the user is connected
        User u = AuthWS.validToken(userID, token);

        //Here I have my user but I don't know how to get it in my requested method
    }
    return true;
}

Zur Verwaltung der Benutzer-Rechte möchte ich den Zugriff auf meine user direkt in die angeforderte Methode.

Beispiel der Methode, die angefordert werden können :

public Project getProject(@WebParam(name = "name") String name) throws WebServiceFailure, EntityNotFoundException {

    //Here I would like to verify the user's rights

    try {
        PreparedStatement ps = DBConnect.getStatement("SELECT name FROM projects WHERE name = '" + name + "'");
        ResultSet res = ps.executeQuery();
        if(res.next()){
            Project p = new Project(res.getString("name"));
            ps.close();
            return p;
        } else {
            ps.close();
            throw new EntityNotFoundException("Can't find the project '"+name+"'");
        }
    } catch (SQLException ex) {
        throw new WebServiceFailure(ex.getMessage());
    }
}

Vielen Dank

in Ihrer SOAP-handler, können Sie das servlet Anfrage Objekt aus der SOAPMessageContext. Sie können dann Ihre userID mithilfe request.setAttribute().
Diese Art von Frage ist on-topic, aber Sie müssen um genauer zu sein über das, was Sie versuchen zu tun und was haben Sie versucht, das hat nicht funktioniert für Sie. Welche Art von Umgebung ist Ihr service läuft? Was sind die Eingaben für "die angeforderte Methode"?
bitte fügen Sie den code, die Sie bisher

InformationsquelleAutor Gfaramaz | 2013-08-30

Schreibe einen Kommentar