Eine der gebräuchlichsten Methoden zur Authentifizierung in JAX-WS besteht darin, dass der Client „Benutzername“ und „Kennwort“ bereitstellt, diese im SOAP-Anforderungsheader angehängt und an den Server sendet, das SOAP-Dokument vom Server parsen und den bereitgestellten „Benutzernamen“ und „Kennwort“ abrufen. aus dem Anforderungsheader und Validierung aus der Datenbank oder einer anderen Methode.
In diesem Artikel zeigen wir Ihnen, wie Sie die obige Authentifizierung auf Anwendungsebene in JAX-WS ** implementieren.
Ideen …
Geben Sie auf der ** Web-Service-Client-Site einfach Ihren "Benutzernamen" und "Kennwort" in den Anforderungsheader ein.
Map<String, Object> req__ctx = ((BindingProvider)port).getRequestContext(); req__ctx.put(BindingProvider.ENDPOINT__ADDRESS__PROPERTY, WS__URL); Map<String, List<String>> headers = new HashMap<String, List<String>>(); headers.put("Username", Collections.singletonList("mkyong")); headers.put("Password", Collections.singletonList("password")); req__ctx.put(MessageContext.HTTP__REQUEST__HEADERS, headers);
Rufen Sie auf der ** Webservice-Server-Site die Parameter für den Anforderungsheader über "WebServiceContext" ab.
@Resource WebServiceContext wsctx; @Override public String method() { MessageContext mctx = wsctx.getMessageContext(); //get detail from request headers Map http__headers = (Map) mctx.get(MessageContext.HTTP__REQUEST__HEADERS); List userList = (List) http__headers.get("Username"); List passList = (List) http__headers.get("Password"); //...
Das ist alles, jetzt wird Ihre bereitgestellte JAX-WS-Authentifizierung auf Anwendungsebene unterstützt.
Authentifizierung mit JAX-WS-Beispiel
Sehen Sie ein vollständiges Beispiel.
1. WebService Server
Erstellen Sie ein einfaches JAX-WS-Hello-World-Beispiel für die Authentifizierung auf Anwendungsebene.
Datei: Hallo Welt.java
package com.mkyong.ws; import javax.jws.WebMethod; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import javax.jws.soap.SOAPBinding.Style; //Service Endpoint Interface @WebService @SOAPBinding(style = Style.RPC) public interface HelloWorld{ @WebMethod String getHelloWorldAsString(); }
Hallo Welt Impl.java
package com.mkyong.ws; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.jws.WebService; import javax.xml.ws.WebServiceContext; import javax.xml.ws.handler.MessageContext; //Service Implementation Bean @WebService(endpointInterface = "com.mkyong.ws.HelloWorld") public class HelloWorldImpl implements HelloWorld{ @Resource WebServiceContext wsctx; @Override public String getHelloWorldAsString() { MessageContext mctx = wsctx.getMessageContext(); //get detail from request headers Map http__headers = (Map) mctx.get(MessageContext.HTTP__REQUEST__HEADERS); List userList = (List) http__headers.get("Username"); List passList = (List) http__headers.get("Password"); String username = ""; String password = ""; if(userList!=null){ //get username username = userList.get(0).toString(); } if(passList!=null){ //get password password = passList.get(0).toString(); } //Should validate username and password with database if (username.equals("mkyong") && password.equals("password")){ return "Hello World JAX-WS - Valid User!"; }else{ return "Unknown User!"; } } }
2. EndPoint Publisher
Erstellen Sie einen Endpoint-Publisher, der unter dieser URL über dem Webdienst bereitgestellt werden soll:
" Http://localhost: 9999/ws/hello "
Datei: Hello World Publisher.java
package com.mkyong.endpoint; import javax.xml.ws.Endpoint; import com.mkyong.ws.HelloWorldImpl; //Endpoint publisher public class HelloWorldPublisher{ public static void main(String[]args) { Endpoint.publish("http://localhost:9999/ws/hello", new HelloWorldImpl()); } }
3. WebService Client
Erstellen Sie einen Web-Service-Client, um zur Authentifizierung "Benutzername" und "Kennwort" zu senden.
Datei: HelloWorldClient.java
package com.mkyong.client; import java.net.URL; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.namespace.QName; import javax.xml.ws.BindingProvider; import javax.xml.ws.Service; import javax.xml.ws.handler.MessageContext; import com.mkyong.ws.HelloWorld; public class HelloWorldClient{ private static final String WS__URL = "http://localhost:9999/ws/hello?wsdl"; public static void main(String[]args) throws Exception { URL url = new URL(WS__URL); QName qname = new QName("http://ws.mkyong.com/", "HelloWorldImplService"); Service service = Service.create(url, qname); HelloWorld hello = service.getPort(HelloWorld.class); /** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** UserName & Password ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** / Map<String, Object> req__ctx = ((BindingProvider)hello).getRequestContext(); req__ctx.put(BindingProvider.ENDPOINT__ADDRESS__PROPERTY, WS__URL); Map<String, List<String>> headers = new HashMap<String, List<String>>(); headers.put("Username", Collections.singletonList("mkyong")); headers.put("Password", Collections.singletonList("password")); req__ctx.put(MessageContext.HTTP__REQUEST__HEADERS, headers); /** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** / System.out.println(hello.getHelloWorldAsString()); } }
Ausgabe
Hello World JAX-WS - Valid User!
4. SOAP-Datenverkehr verfolgen
Zeigt von oben nach unten, wie der SOAP-Umschlag zwischen Client und Server fließt.
{leer} 1. Die Client-Sendeanforderung, der Benutzername „ mkyong “ und das Kennwort „ password “ sind im SOAP-Umschlag enthalten.
POST/ws/hello?wsdl HTTP/1.1 Password: password Username: mkyong SOAPAction: "" Accept: text/xml, multipart/related, text/html, image/gif, image/jpeg, ** ; q=.2, ** /** ; q=.2 Content-Type: text/xml; charset=utf-8 User-Agent: Java/1.6.0__13 Host: localhost:8888 Connection: keep-alive Content-Length: 178 <?xml version="1.0" ?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:getHelloWorldAsString xmlns:ns2="http://ws.mkyong.com/"/> </S:Body> </S:Envelope>
{leer} 2. Server sendet eine normale Antwort zurück.
HTTP/1.1 200 OK Transfer-encoding: chunked Content-type: text/xml; charset=utf-8 <?xml version="1.0" ?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:getHelloWorldAsStringResponse xmlns:ns2="http://ws.mkyong.com/"> <return>Hello World JAX-WS - Valid User!</return> </ns2:getHelloWorldAsStringResponse> </S:Body> </S:Envelope>
Erledigt.
Quellcode herunterladen
Download - JAX-WS-Application-Authentication-Example.zip (10KB)