【问题标题】:simple jax-ws-webservice with basic authentication具有基本身份验证的简单 jax-ws-webservice
【发布时间】:2014-06-26 11:22:37
【问题描述】:

我有一个用于 Web 服务的简单 WSDL。使用 wsimport 我生成了 java 包装器。我已经在“MyService”类中实现了生成的接口。然后我用 Java6 的内置特性发布这个 web 服务:

我的服务我的服务 = 新的我的服务(); 端点端点 = Endpoint.publish("http://localhost:80/servicetest/services/MyServiceINSoap", myService);

当我让这段代码运行时,一切都很完美——我能够使用soapclient连接到服务并可以执行这些方法。

现在我希望 javavm 的内置网络服务器使用基本身份验证 - 所以客户端必须提供用户 ID 和密码。我该如何做到这一点?这可能吗?还是我需要一个应用服务器(tomcat、jboss 等等……)?

我已经搜索了一段时间,但只找到了托管在应用程序服务器中的网络服务解决方案。

非常感谢!

厄运

【问题讨论】:

  • 当您说“基本身份验证”时,您指的是 web.xml 中定义的 HTTP BASIC 身份验证类型,还是简单的用户名/密码对中的基本身份验证类型?
  • HTTP 基本身份验证。我使用 jre 的内置网络服务器 - 因此没有 web.xml。但是我找到了这个网站:today.java.net/pub/a/today/2007/07/03/… 回答了我的问题并且它有效。

标签: java web-services jax-ws basic-authentication


【解决方案1】:

当我找到您的答案时,我松了一口气,因为我花了几个小时寻找解决方案。但是当我尝试点击您的链接时,我注意到该页面不再可用。幸运的是,我在 Wayback Machine (https://archive.org/web/) 的帮助下找到了旧版本。虽然这篇文章很棒,但我在让基本身份验证在客户端工作时遇到了一些问题。最后,我在 java.net.Authenticator 的帮助下完成了它。这是sn-ps的代码,希望对其他人有用。

服务器:

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()));
    }

}

【讨论】:

    【解决方案2】:

    在这里找到了解决方案:

    https://today.java.net/pub/a/today/2007/07/03/jax-ws-web-services-without-ee-containers.html

    经过数小时的反复试验,终于在 google 中找到了正确的搜索词 :)

    【讨论】:

      猜你喜欢
      • 2019-05-09
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-24
      相关资源
      最近更新 更多