2010-05-01 5 views
2

Je suis relativement nouveau dans l'écriture de services Web. Je travaille sur un service SOAP en utilisant JAXWS. J'aimerais pouvoir demander aux utilisateurs de se connecter et, dans mon service, savoir quel utilisateur émet une commande. En d'autres termes, ayez une certaine manipulation de session. L'une des façons dont j'ai vu cela est d'utiliser des cookies et d'accéder à la couche HTTP de mon service Web. Cependant, cela dépend de l'utilisation de HTTP comme couche de transport (je suis conscient que HTTP est presque toujours la couche de transport mais je suis un puriste).JAXWS et sessions

Y a-t-il une meilleure approche qui empêche la couche de service d'ignorer la couche de transport? Est-ce que je peux y arriver avec des filtres de servlet? Je voudrais que la réponse soit aussi agnostique que possible.

Répondre

5

Je travaille sur un service SOAP en utilisant JAXWS. J'aimerais pouvoir demander aux utilisateurs de se connecter et, dans mon service, savoir quel utilisateur émet une commande. En d'autres termes, ayez une certaine manipulation de session.

services Web conventionnels sont apatrides dans la nature, il n'y a pas la gestion des sessions dans les services Web (qui a par rien dire à voir avec l'identification de l'appelant).

Si vous souhaitez que vos utilisateurs à authentifier pour appeler un service, l'approche traditionnelle consiste à:

  1. Expose un service Web « d'authentification » (authentifications utilisateur) qui retourne un jeton d'authentification.
  2. Demandez aux utilisateurs d'appeler cette authentification en premier.
  3. Demandez aux utilisateurs de transmettre le jeton dans un en-tête personnalisé lors d'appels ultérieurs de services Web «professionnels».

Du côté du serveur:

  1. Rejeter un appel qui ne contient pas un jeton valide.
  2. jetons Invalider après un certain temps d'inactivité

Vous pouvez mettre en œuvre une solution personnalisée pour cette approche (ce qui est une solution hautement interopérable). Ou vous pouvez utiliser WS-Security/UsernameTokens qui fournit quelque chose de similaire à la sortie de la boîte. WS-Security est une norme (Metro l'implémente), elle n'est pas spécifique au «framework».

+0

Réponse exceptionnelle. Merci beaucoup. – Pace

1

Comme vous le mentionnez, les filtres de servlet peuvent constituer la base de la solution. Utilisez un filtre pour stocker les détails de la session en cours (par exemple, le contexte de la session Carte) dans un stockage threadLocal. Ceci est implémenté en tant que votre classe d'application, tout comme agnostique de transport. Votre service utilise simplement une méthode statique pour récupérer le contexte actuel, sans savoir d'où il vient.

E.g.

class ServiceSessionContext 
{ 
    static ThreadLocal<Map> local = new ThreadLocal<Map>(); 

    // context set by the transport layer, e.g. servlet filter 
    static public void setContext(Map map) 
    { 
     local.put(map); 
    } 

    // called when request is complete 
    static public void clearContext() 
    { 
     local.put(null); 
    } 

    // context fetched by the service 
    static public Map getContext() 
    { 
     return local.get(); 
    } 
}  
+0

Merci, je pense que je peux utiliser ce modèle pour passer le jeton mentionné ci-dessus dans ma couche de service. – Pace