java - 从 JAX-RS 响应 : '401: Unauthorized' for url 流式传输 pdf 文件

标签 java web-services jax-rs weblogic-10.x

我正在尝试获取 Java 代码中的文件作为流。 URI 正在返回一个 PDF 文件。下面是我的代码片段:

public void downloadToLocal() {

    try{
        Authenticator.setDefault(new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("test",
                        "test".toCharArray());
            }
        });
        URL url = new URL("http://***");

        /*String encodedAuthorizedUser = new String(com.sun.jersey.core.util.Base64.encode("***" + ":" + "***"));
        HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
        httpCon.setRequestProperty("Authorization", "Basic " + encodedAuthorizedUser);*/

        InputStream is = url.openStream();
        FileOutputStream fos = new FileOutputStream("C:\\db\\test.pdf");

        byte[] buffer = new byte[1024];
        int noOfBytes = 0;

        while ((noOfBytes = is.read(buffer)) != -1) {
            fos.write(buffer, 0, noOfBytes);
        }

        fos.close();
        is.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

下面是我遇到的异常:

java.io.FileNotFoundException: Response: '401: Unauthorized' for url: '*********'
    at weblogic.net.http.HttpURLConnection.getInputStream(HttpURLConnection.java:487)
    at weblogic.net.http.SOAPHttpURLConnection.getInputStream(SOAPHttpURLConnection.java:37)
    at java.net.URL.openStream(URL.java:1010)
    at com.bt.ngwfmt.framework.services.dlite.DliteServiceClient.downloadToLocal(DliteServiceClient.java:882)
    at com.bt.ngwfmt.framework.rest.DliteRestHandler.persistDCV(DliteRestHandler.java:167)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185)
    at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
    at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1542)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1473)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1419)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1409)
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:409)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:558)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:733)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:183)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3717)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:178)

来自 here我正在引用。我从那里尝试了两种方法。我发现了一个类似的问题 here还。但是无法获得跳过此密码身份验证所需的操作。当我在浏览器中点击 url 并手动提供用户名和密码时,这是有效的。

任何帮助将不胜感激。 :)

注意:我使用的是 weblogic 10.3.5。谢谢

最佳答案

它看起来像默认身份 validator 的 Weblogic 特定问题
尝试显式设置身份验证 header :

URLConnection conn = url.openConnection();
String creds = user + ":" + pass;
String encodedCreds = "Basic " + new String(new Base64().encode(creds.getBytes()));
conn.setRequestProperty ("Authorization", encodedCreds);
InputStream in = conn.getInputStream();

关于java - 从 JAX-RS 响应 : '401: Unauthorized' for url 流式传输 pdf 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39141962/

相关文章:

java - jax-rs 和服务器名称

java - 收到的数据比预期多

java - 二维字符串传递到 JTable

Java:通过给出数字 N 生成 true 和 false 的组合;

java - oAuth 2 实现 java

java - 如何使用curl测试Java RESTful Web服务 - PUT动词的问题

不同包中的java文件无法编译

windows - 在 Linux 上使用 SOAP 的 Web 服务服务器

python - 将外部文件加载到Web2Py Controller 方法时出错

rest - 是否可以缓存服务器对服务器 HTTP POST 请求的响应?