我有一个简单的Web服务WSDL。使用wsimport我生成了java包装器。我已经在“MyService”类中实现了生成的接口。然后我发布了这个带有Java6内置功能的web服务:
MyService myService = new MyService(); Endpoint endpoint = Endpoint.publish("http://localhost:80/servicetest/services/MyServiceINSoap", myService);
当我让这段代码运行时,一切都很完美 - 我可以使用soapclient连接到服务并且可以执行这些方法。
现在我希望javavm的内置web服务器使用基本身份验证 - 因此客户端必须提供用户ID和密码。我该如何做到这一点?这可能吗?或者我需要一个应用服务器(tomcat,jboss,等等......)?
我搜索了一段时间,但只找到了托管在应用服务器中的webservice解决方案。
非常感谢提前!
erwrock
答案 0 :(得分:0)
在这里找到解决方案:
https://today.java.net/pub/a/today/2007/07/03/jax-ws-web-services-without-ee-containers.html
经过数小时的反复试验后,最终谷歌中的搜索词:)
答案 1 :(得分:0)
当我找到你的答案时,我很放心,因为我搜索了几个小时的解决方案。但是当我试图关注你的链接时,我注意到该页面不再可用。幸运的是,我在Wayback Machine(https://archive.org/web/)的帮助下找到了旧版本。虽然,这篇文章很棒我在使用基本身份验证在客户端工作时遇到了一些问题。最后,我在java.net.Authenticator的帮助下完成了它。以下是我希望对其他人有用的代码片段。
服务器:
javax.xml.ws.Endpoint serverEndpoint = Endpoint.create(new MyService());
com.sun.net.httpserver.HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
com.sun.net.httpserver.HttpContext httpContext = server.createContext("/myservice");
server.start();
AuthenticatorServer authenticatorServer = new AuthenticatorServer("myRealm", "myName", "myPwd");
httpContext.setAuthenticator(authenticatorServer);
serverEndpoint.publish(httpContext);
AuthenticatorServer是:
private static class AuthenticatorServer extends com.sun.net.httpserver.BasicAuthenticator {
private final String user;
private final String pwd;
public AuthenticatorServer(String realm, String user, String pwd) {
super(realm);
this.user = user;
this.pwd = pwd;
}
@Override
public boolean checkCredentials(String userNameInput, String passwordInput) {
return StringUtils.equals(user, userNameInput) && StringUtils.equals(pwd, passwordInput);
}
}
在客户端:
AuthenticatorClient authenticatorClient = new AuthenticatorClient("myName", "myPwd");
Authenticator.setDefault(authenticatorClient);
javax.xml.namespace.QName qName = new QName(namespaceURI, WS_SERVICE_NAME);
java.net.URL wsdlAddress = new URL(namespaceURI + WS_SERVICE_NAME + "?wsdl");
MyService service =(Service.create(wsdlAddress, qName)).getPort(MyService.class);
AuthenticatorClient在哪里:
private static class AuthenticatorClient extends java.net.Authenticator {
private final String user;
private final String pwd;
public AuthenticatorClient(String user, String pwd) {
this.user = user;
this.pwd = pwd;
}
@Override
public PasswordAuthentication getPasswordAuthentication() {
return (new PasswordAuthentication(user, pwd == null ? null : pwd.toCharArray()));
}
}