簡體   English   中英

JAX-WS WebService 客戶端 - “響應:'401:url 未經授權'”

[英]JAX-WS WebService Client - “Response: '401: Unauthorized' for url”

我正在嘗試用 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)

這是我的代碼片段(我還設置了默認身份驗證器):

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

對我來說,以下代碼很有幫助(例如):

...
ClassImplementingPort port = service.getPort();
((BindingProvider)port).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "unsername");
((BindingProvider)port).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "password");
...

這個答案取自https://coderanch.com/t/430458/java/JAX-WS-Authentication-javax-xml

這個問題也可以通過設置參數UseSunHttpHandler來解決
-DUseSunHttpHandler=true傳入 weblogic 啟動腳本

https://pravejay.wordpress.com/2012/09/21/weblogic-javax-xml-ws-webserviceexception-failed-to-access-the-wsdl-response-401-unauthorized/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM