[英]Correct way for responding resources from http server
我有這個 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>
我寫了一個簡單的java Http服務器。 該服務器處理請求,從資源文件夾加載index.html
並響應客戶端(瀏覽器)。 客戶端看到index.html
但沒有資源(圖像、CSS、js)。 因為瀏覽器加載index.html
嘗試加載包含在此頁面中的所有資源。 而是服務器中的資源。 我用/assets/
這樣的路徑寫了一個新的處理程序,並嘗試像這樣替換index.html
所有資源鏈接:
<img src="someimage.jpg" width="104" height="142">
到
<img src="/assets/someimage.jpg" width="104" height="142">
在/assets/
處理程序中,我剪切了 URI 的第一部分( /assets/
)並嘗試從 URI 的第二部分( someimage.jpg
)加載資源;
它有效,但我無法加載 CSS。 因為我替換了pageAsString.replace("src=\\"", "/assets/");
但是在href="css/example.css"
也許我做錯了什么,這種方法不好? 如何將 index.html 返回給客戶端並提供從服務器加載資源的能力?
根據您的問題制作了快速的單班項目。 使 IMG 和 SCRIPT 標簽起作用:
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.js 可以像
alert("I'm from inner file!");
console.log("I'm from inner file!");
圖像是任何 jpg 圖像
項目結構(對我們來說有 src 和 assets 文件夾):
運行 main 方法並轉到http://localhost:8080/main
一切都應該正常工作。
注意Java 代碼中的一件事您應該更改 - 文件系統中的路徑。
PS基於http://www.microhowto.info/howto/serve_web_pages_using_an_embedded_http_server_in_java.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.