Одним из распространенных способов обработки аутентификации в JAX-WS является то, что клиент предоставляет «имя пользователя» и «пароль», присоединяет их в заголовке запроса SOAP и отправляет на сервер, сервер анализирует документ SOAP и получает предоставленные «имя пользователя» и «пароль». из заголовка запроса и выполнить проверку из базы данных, или любым другим способом.
В этой статье мы покажем вам, как реализовать вышеупомянутую « аутентификацию на уровне приложения в JAX-WS ».
Идеи …
На сайте веб-клиента просто введите свое имя пользователя и пароль в заголовок запроса.
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);
На сайте
сервера веб-служб
получите параметры заголовка запроса через
WebServiceContext
.
@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"); //...
Вот и все, теперь ваш развернутый JAX-WS поддерживает аутентификацию на уровне приложений.
Аутентификация с примером JAX-WS
Смотрите полный пример.
1. Сервер WebService
Создайте простой пример JAX-WS hello world для обработки аутентификации на уровне приложения.
File: HelloWorld.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(); }
Hello World 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
Создайте издателя конечной точки для развертывания вышеуказанного веб-сервиса по этому URL:
« Http://локальный: 9999/WS/hello »
File: HelloWorldPublisher.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
Создайте клиент веб-службы для отправки имени пользователя и пароля для аутентификации.
File: 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()); } }
Выход
Hello World JAX-WS - Valid User!
4. Отслеживание трафика SOAP
Сверху вниз, показывая, как конверт SOAP проходит между клиентом и сервером.
{Пусто} 1. Запрос на отправку клиентом, имя пользователя « mkyong » и пароль « password » включены в конверт SOAP.
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>
{Пусто} 2. Сервер отправляет обратно нормальный ответ.
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>
Готово.
Скачать исходный код
Загрузить - ссылка://wp-content/uploads/2010/12/JAX-WS-Application-Authentication-Example.zip[JAX-WS-Application-Authentication-Example.zip](10 КБ)
ссылка://тег/аутентификация/[аутентификация]ссылка://тег/jax-ws/[jax-ws]ссылка://тег/безопасность/[безопасность]ссылка://тег/веб-сервисы/[веб-сервисы]