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)