java - JAX-WS Web 服务客户端 - "Response: ' 401 : Unauthorized' for url"

标签 java web-services authentication wsdl jax-ws

我正在尝试用 Java 实例化一个 Web 服务客户端,它的 url 由用户名和密码保护。实例化时抛出WebServiceException;这是堆栈跟踪:

javax.xml.ws.WebServiceException: java.io.FileNotFoundException: Response: '401: Unauthorized' for url: WSDLURL
at com.sun.xml.ws.wsdl.WSDLContext.<init>(WSDLContext.java:68)
at com.sun.xml.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:207)
at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:165)
at com.sun.xml.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:49)
at weblogic.wsee.jaxws.spi.WLSProvider.createServiceDelegate(WLSProvider.java:18)
at javax.xml.ws.Service.<init>(Service.java:57)
at org.openuri.ServiceUtilityWS.<init>(ServiceUtilityWS.java:36)
at it.cartasi.pb.giustificatomotivo.util.Util.sendEmail(Util.java:110)
at it.cartasi.pb.giustificatomotivo.action.ConfermaAction.execute(ConfermaAction.java:36)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:226)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:124)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
at it.cartasi.pb.giustificatomotivo.filter.SessionFilter.doFilter(SessionFilter.java:68)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3402)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(Unknown Source)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2140)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2046)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1398)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:200)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:172)
java.io.FileNotFoundException: Response: '401: Unauthorized' for url: WSDLURL
    at weblogic.net.http.HttpURLConnection.getInputStream(HttpURLConnection.java:467)
    at weblogic.net.http.SOAPHttpURLConnection.getInputStream(SOAPHttpURLConnection.java:36)
    at java.net.URL.openStream(URL.java:1007)
    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.createReader(RuntimeWSDLParser.java:666)
    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parseWSDL(RuntimeWSDLParser.java:152)
    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:99)
    at com.sun.xml.ws.wsdl.WSDLContext.<init>(WSDLContext.java:65)
    at com.sun.xml.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:207)
    at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:165)
    at com.sun.xml.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:49)
    at weblogic.wsee.jaxws.spi.WLSProvider.createServiceDelegate(WLSProvider.java:18)
    at javax.xml.ws.Service.<init>(Service.java:57)
    at org.openuri.ServiceUtilityWS.<init>(ServiceUtilityWS.java:36)
    at it.cartasi.pb.giustificatomotivo.util.Util.sendEmail(Util.java:110)
    at it.cartasi.pb.giustificatomotivo.action.ConfermaAction.execute(ConfermaAction.java:36)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:226)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:124)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283)
    at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
    at it.cartasi.pb.giustificatomotivo.filter.SessionFilter.doFilter(SessionFilter.java:68)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3402)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(Unknown Source)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2140)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2046)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1398)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:200)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:172)

这是我的代码片段(我还设置了默认身份 validator ):

Authenticator.setDefault(new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            char[] charArray = password.toCharArray();
            System.out.println(user);
            System.out.println(charArray);
            return new PasswordAuthentication(
                    user,
                    charArray);
        }
    });

    try {
        ws = new ServiceUtilityWS(new URL(wsdlUrl), new QName("ServiceUtilityWSSoap"));  // Exception thrown here
    } catch (MalformedURLException e) {
    }

我可以使用这些凭据通过浏览器访问它。有谁知道为什么会这样?

注意:

该应用程序部署在 Weblogic 10 上。如果我从 main 运行该代码,则不会抛出异常。

最佳答案

由于其 URLStreamHandler,这是一个 Weblogic 10 问题。 我通过执行以下操作解决了它:

  • 像这样实例化 WSDL Url:

    URLStreamHandler handler = new sun.net.www.protocol.http.Handler(); //standard http handler
    URL url = null;
    try {
        url = new URL(null, wsdlUrl, handler); //forced this http handler here
        ws = ServiceUtilityWS.create(url, qName);
    } catch (MalformedURLException e) {
    }
    
  • 解决该问题后,我在服务操作调用上遇到了类似的异常。为了解决这个问题,我向 SOAP 消息链添加了一个自定义处理程序:

         Binding aBinding = bindingProvider.getBinding();
         List<Handler> handlerChain = aBinding.getHandlerChain();
         handlerChain.add(new SOAPHandler<SOAPMessageContext>() {
    
           public Set<QName> getHeaders() {
             return new TreeSet<QName>();
           }
    
           public boolean handleMessage(SOAPMessageContext context) {
            final Boolean outInd = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
    
            if (outInd.booleanValue()) {
                try {
    
                    context.put(BindingProvider.USERNAME_PROPERTY, user);
                    context.put(BindingProvider.PASSWORD_PROPERTY, password);
    
                } catch (final Exception e) {
                    return false;
                }
            }
    
            return true;
        }
    

关于java - JAX-WS Web 服务客户端 - "Response: ' 401 : Unauthorized' for url",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37392442/

相关文章:

android - 注册表单 : inserting data into MySQL using Android 4. 0

spring-boot - 使用 Oauth2 在 Spring Security 中手动身份验证不会在整个 session 期间保留 SecurityContext

PHP通过电子邮件进行用户身份验证

java - 如何编译Android库?

java - 对这些数据建模的 Grooviest 方法是什么?

java - WSDL 复杂 CVC 错误

web-services - 使用WSClient调用外部SOAP Web服务时出错

ajax - 将跨域 AJAX/XDomainRequest 发布到 Web 服务

java - Android Google map 仅绘制一个标记,但不是全部

java - 如何访问从另一个类中的文本文件导入的 map ?