Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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 从http服务器响应资源的正确方法_Java_Html_Css_Resources_Httpserver - Fatal编程技术网

Java 从http服务器响应资源的正确方法

Java 从http服务器响应资源的正确方法,java,html,css,resources,httpserver,Java,Html,Css,Resources,Httpserver,我有一个index.html页面: <html> <head> <title>My Site</title> <link rel="stylesheet" type="text/css" href="css/example.css" /> </head> <body> <h2>Hello world</h2> <p

我有一个index.html页面:

   <html>
    <head>
     <title>My Site</title>
     <link rel="stylesheet" type="text/css" href="css/example.css" />
    </head>
    <body>
     <h2>Hello world</h2>
     <p>Image:</p>
     <img src="someimage.jpg" alt="W3Schools.com" width="104" height="142">
    </body>
   </html>


之后,在
/assets/
处理程序中,我剪切URI的第一部分(
/assets/
),并尝试从资源加载URI的第二部分(
someimage.jpg

它可以工作,但我无法加载CSS。因为我替换了
pageAsString.replace(“src=\”,“/assets/”);
但是CSS在
href=“CSS/example.CSS”


可能我做错了什么,而这种方法不好?我如何才能将index.html返回到客户端,并提供从服务器加载资源的能力?

根据您的问题制作了快速单类项目。制作IMG和脚本标记:

package test.server;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

import java.io.*;
import java.net.InetSocketAddress;
import java.net.URI;

public class MyHandler implements HttpHandler {
    public void handle(HttpExchange t) throws IOException, IOException {
        InputStream is = t.getRequestBody();

        InputStreamReader isReader = new InputStreamReader(is);
        BufferedReader reader = new BufferedReader(isReader);
        StringBuffer sb = new StringBuffer();
        String str;
        while((str = reader.readLine())!= null){
            sb.append(str);
        }

        String response = "<html>\n" +
                "\n" +
                "<head>\n" +
                "    <title>My Site</title>\n" +
                "    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/example.css\" />\n" +
                "</head>\n" +
                "\n" +
                "<body>\n" +
                "    <h2>Hello world</h2>\n" +
                "    <p>Image:</p>\n" +
                "    <img src=\"/assets/cat.jpg\" alt=\"W3Schools.com\" width=\"104\" height=\"142\">\n" +
                "    <script src=\"/assets/alert.js\"></script>\n" +
                "</body>\n" +
                "\n" +
                "</html>";

        t.sendResponseHeaders(200, response.length());
        OutputStream os = t.getResponseBody();
        os.write(response.getBytes());
        os.close();
    }

    public static void main(String[] args) {

        InetSocketAddress cd = new InetSocketAddress(8080);
        HttpServer server = null;
        try {
            server = HttpServer.create(cd, 8080);
        } catch (IOException e) {
            e.printStackTrace();
        }

        server.createContext("/main", new MyHandler());

        server.createContext("/assets/", new HttpHandler() {
            @Override
            public void handle(HttpExchange httpExchange) throws IOException {
                String root = "!!! YOUR SITE ROOT IN FILE SYSTEM !!!";
                URI uri = httpExchange.getRequestURI();
                File file = new File(root + uri.getPath()).getCanonicalFile();
                if (!file.getPath().startsWith(root)) {
                    // Suspected path traversal attack: reject with 403 error.
                    String response = "403 (Forbidden)\n";
                    httpExchange.sendResponseHeaders(403, response.length());
                    OutputStream os = httpExchange.getResponseBody();
                    os.write(response.getBytes());
                    os.close();
                } else if (!file.isFile()) {
                    // Object does not exist or is not a file: reject with 404 error.
                    String response = "404 (Not Found)\n";
                    httpExchange.sendResponseHeaders(404, response.length());
                    OutputStream os = httpExchange.getResponseBody();
                    os.write(response.getBytes());
                    os.close();
                } else {
                    // Object exists and is a file: accept with response code 200.
                    httpExchange.sendResponseHeaders(200, 0);
                    OutputStream os = httpExchange.getResponseBody();
                    FileInputStream fs = new FileInputStream(file);
                    final byte[] buffer = new byte[0x10000];
                    int count = 0;
                    while ((count = fs.read(buffer)) >= 0) {
                        os.write(buffer,0,count);
                    }
                    fs.close();
                    os.close();
                }
            }
        });
        server.setExecutor(null); // creates a default executor
        server.start();
    }
}
图像是任何jpg图像

项目结构(我们有src和资产文件夹):

运行main方法并转到

一切都应该正常

注意在java代码中,您应该更改一件事—文件系统中的路径


PS基于

您使用哪种服务器?@Den Doeson
<img src="/assets/someimage.jpg" width="104" height="142">
package test.server;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

import java.io.*;
import java.net.InetSocketAddress;
import java.net.URI;

public class MyHandler implements HttpHandler {
    public void handle(HttpExchange t) throws IOException, IOException {
        InputStream is = t.getRequestBody();

        InputStreamReader isReader = new InputStreamReader(is);
        BufferedReader reader = new BufferedReader(isReader);
        StringBuffer sb = new StringBuffer();
        String str;
        while((str = reader.readLine())!= null){
            sb.append(str);
        }

        String response = "<html>\n" +
                "\n" +
                "<head>\n" +
                "    <title>My Site</title>\n" +
                "    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/example.css\" />\n" +
                "</head>\n" +
                "\n" +
                "<body>\n" +
                "    <h2>Hello world</h2>\n" +
                "    <p>Image:</p>\n" +
                "    <img src=\"/assets/cat.jpg\" alt=\"W3Schools.com\" width=\"104\" height=\"142\">\n" +
                "    <script src=\"/assets/alert.js\"></script>\n" +
                "</body>\n" +
                "\n" +
                "</html>";

        t.sendResponseHeaders(200, response.length());
        OutputStream os = t.getResponseBody();
        os.write(response.getBytes());
        os.close();
    }

    public static void main(String[] args) {

        InetSocketAddress cd = new InetSocketAddress(8080);
        HttpServer server = null;
        try {
            server = HttpServer.create(cd, 8080);
        } catch (IOException e) {
            e.printStackTrace();
        }

        server.createContext("/main", new MyHandler());

        server.createContext("/assets/", new HttpHandler() {
            @Override
            public void handle(HttpExchange httpExchange) throws IOException {
                String root = "!!! YOUR SITE ROOT IN FILE SYSTEM !!!";
                URI uri = httpExchange.getRequestURI();
                File file = new File(root + uri.getPath()).getCanonicalFile();
                if (!file.getPath().startsWith(root)) {
                    // Suspected path traversal attack: reject with 403 error.
                    String response = "403 (Forbidden)\n";
                    httpExchange.sendResponseHeaders(403, response.length());
                    OutputStream os = httpExchange.getResponseBody();
                    os.write(response.getBytes());
                    os.close();
                } else if (!file.isFile()) {
                    // Object does not exist or is not a file: reject with 404 error.
                    String response = "404 (Not Found)\n";
                    httpExchange.sendResponseHeaders(404, response.length());
                    OutputStream os = httpExchange.getResponseBody();
                    os.write(response.getBytes());
                    os.close();
                } else {
                    // Object exists and is a file: accept with response code 200.
                    httpExchange.sendResponseHeaders(200, 0);
                    OutputStream os = httpExchange.getResponseBody();
                    FileInputStream fs = new FileInputStream(file);
                    final byte[] buffer = new byte[0x10000];
                    int count = 0;
                    while ((count = fs.read(buffer)) >= 0) {
                        os.write(buffer,0,count);
                    }
                    fs.close();
                    os.close();
                }
            }
        });
        server.setExecutor(null); // creates a default executor
        server.start();
    }
}
alert("I'm from inner file!");
console.log("I'm from inner file!");