Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使HttpURLConnection加载带有图像的网页_Java_Servlets_Httpurlconnection - Fatal编程技术网

Java 使HttpURLConnection加载带有图像的网页

Java 使HttpURLConnection加载带有图像的网页,java,servlets,httpurlconnection,Java,Servlets,Httpurlconnection,目前,我使用HttpURLConnection加载远程网页并向我的客户端显示(使用InputStream到HttpResponse的outputStream传输),它正确加载html但跳过图像,如何修复 谢谢您必须为每张图像单独提出请求。这也是浏览器所做的。您必须为每个图像单独提出请求。浏览器也会这样做。您需要以这种方式操作HTML,以便内联网域上的所有资源URL都可以代理。例如,HTML中的以下所有资源引用 应该以这种方式在HTML中进行更改,以便它们通过代理servlet,例如 在这

目前,我使用HttpURLConnection加载远程网页并向我的客户端显示(使用InputStream到HttpResponse的outputStream传输),它正确加载html但跳过图像,如何修复


谢谢

您必须为每张图像单独提出请求。这也是浏览器所做的。

您必须为每个图像单独提出请求。浏览器也会这样做。

您需要以这种方式操作HTML,以便内联网域上的所有资源URL都可以代理。例如,HTML中的以下所有资源引用


应该以这种方式在HTML中进行更改,以便它们通过代理servlet,例如


在这方面,类似HTML的解析器非常有用。您可以在代理servlet中执行以下操作,我假设它映射在
/proxy/*
的URL模式上

String intranetURL = "http://intranet.com";
String internetURL = "http://example.com/proxy";

if (request.getRequestURI().endsWith(".html")) { // A HTML page is requested.
    Document document = Jsoup.connect(intranetURL + request.getPathInfo()).get();

    for (Element element : document.select("[href]")) {
        element.attr("href", element.absUrl("href").replaceFirst(intranetURL, internetURL));
    }

    for (Element element : document.select("[src]")) {
        element.attr("src", element.absUrl("src").replaceFirst(intranetURL, internetURL));
    }

    response.setContentType("text/html;charset=UTF-8");
    response.setCharacterEncoding("UTF-8");
    resposne.getWriter().write(document.html());
}
else { // Other resources like images, etc.
    URLConnection connection = new URL(intranetURL + request.getPathInfo()).openConnection();

    for (Map.Entry<String, List<String>> header : connection.getHeaderFields().entrySet()) {
        for (String value : header.getValue()) {
            response.addHeader(header.getKey(), value);
        }
    }

    InputStream input = connection.getInputStream();
    OutputStream output = response.getOutputStream();
    // Now just copy input to output.
}
String intranetURL=”http://intranet.com";
字符串internetURL=”http://example.com/proxy";
如果(request.getRequestURI().endsWith(“.html”){//请求一个html页面。
Document Document=Jsoup.connect(intranetURL+request.getPathInfo()).get();
对于(元素:document.select(“[href]”){
element.attr(“href”,element.absUrl(“href”).replaceFirst(intranetURL,internetURL));
}
对于(元素:document.select(“[src]”){
element.attr(“src”,element.absUrl(“src”).replaceFirst(intranetURL,internetURL));
}
setContentType(“text/html;charset=UTF-8”);
响应。setCharacterEncoding(“UTF-8”);
resposne.getWriter().write(document.html());
}
else{//其他资源,如图像等。
URLConnection connection=newURL(intranetURL+request.getPathInfo()).openConnection();
for(Map.Entry头:connection.getHeaderFields().entrySet()){
for(字符串值:header.getValue()){
response.addHeader(header.getKey(),value);
}
}
InputStream输入=连接。getInputStream();
OutputStream output=response.getOutputStream();
//现在只需将输入复制到输出。
}

您需要以这种方式操作HTML,以便intranet域上的所有资源URL也都被代理。例如,HTML中的以下所有资源引用


应该以这种方式在HTML中进行更改,以便它们通过代理servlet,例如


在这方面,类似HTML的解析器非常有用。您可以在代理servlet中执行以下操作,我假设它映射在
/proxy/*
的URL模式上

String intranetURL = "http://intranet.com";
String internetURL = "http://example.com/proxy";

if (request.getRequestURI().endsWith(".html")) { // A HTML page is requested.
    Document document = Jsoup.connect(intranetURL + request.getPathInfo()).get();

    for (Element element : document.select("[href]")) {
        element.attr("href", element.absUrl("href").replaceFirst(intranetURL, internetURL));
    }

    for (Element element : document.select("[src]")) {
        element.attr("src", element.absUrl("src").replaceFirst(intranetURL, internetURL));
    }

    response.setContentType("text/html;charset=UTF-8");
    response.setCharacterEncoding("UTF-8");
    resposne.getWriter().write(document.html());
}
else { // Other resources like images, etc.
    URLConnection connection = new URL(intranetURL + request.getPathInfo()).openConnection();

    for (Map.Entry<String, List<String>> header : connection.getHeaderFields().entrySet()) {
        for (String value : header.getValue()) {
            response.addHeader(header.getKey(), value);
        }
    }

    InputStream input = connection.getInputStream();
    OutputStream output = response.getOutputStream();
    // Now just copy input to output.
}
String intranetURL=”http://intranet.com";
字符串internetURL=”http://example.com/proxy";
如果(request.getRequestURI().endsWith(“.html”){//请求一个html页面。
Document Document=Jsoup.connect(intranetURL+request.getPathInfo()).get();
对于(元素:document.select(“[href]”){
element.attr(“href”,element.absUrl(“href”).replaceFirst(intranetURL,internetURL));
}
对于(元素:document.select(“[src]”){
element.attr(“src”,element.absUrl(“src”).replaceFirst(intranetURL,internetURL));
}
setContentType(“text/html;charset=UTF-8”);
响应。setCharacterEncoding(“UTF-8”);
resposne.getWriter().write(document.html());
}
else{//其他资源,如图像等。
URLConnection connection=newURL(intranetURL+request.getPathInfo()).openConnection();
for(Map.Entry头:connection.getHeaderFields().entrySet()){
for(字符串值:header.getValue()){
response.addHeader(header.getKey(),value);
}
}
InputStream输入=连接。getInputStream();
OutputStream output=response.getOutputStream();
//现在只需将输入复制到输出。
}

Bozho,这对他没有帮助(我指的是图像)。。。因为图像源也必须被重定向。我认为HtmlUnit可以从网页中提取图像URL,并允许您对每个URL发出新的请求。这很清楚,但据我所知,OP希望客户端能够请求它们。为了做到这一点,他们必须解析html并对所述图像发出专门的请求。这不是一项容易的任务。我不确定如果这些请求必须来自客户端,它有多有用。对不起,我没有看到他代表客户端加载页面的场景。波佐,这对他没有帮助(我是说图片)。。。因为图像源也必须被重定向。我认为HtmlUnit可以从网页中提取图像URL,并允许您对每个URL发出新的请求。这很清楚,但据我所知,OP希望客户端能够请求它们。为了做到这一点,他们必须解析html并对所述图像发出专门的请求。这不是一项容易的任务。我不确定如果这些请求必须来自客户端,它会有多有用。抱歉,我没有看到他代表客户端加载页面的场景。是的,这真的很有意义。。。这是维德,没有工具,使这出箱子是的,这是真正有意义的。。。也就是说,没有现成的工具来实现这一点