15

私はジャージーを使用して、いくつかの残りのサービスをホストするHttpServerFactory単純な埋め込みを作成しています。HttpServer小さくて素早く軽量なものが必要でした。同じサーバー インスタンス内で小さな静的 html ページをホストする必要があります。サーバーに静的ハンドラーを追加する簡単な方法はありますか? 使用できる定義済みのハンドラーはありますか? かなり一般的なタスクのように思えますが、コードが既に存在する場合、コードを書き直すのは嫌です。

server = HttpServerFactory.create(url);
server.setExecutor(Executors.newCachedThreadPool());
server.createContext("/staticcontent", new HttpHandler() {
    @Override
    public void handle(HttpExchange arg0) throws IOException {
        //What goes here?
    }
});
server.start();
4

2 に答える 2

9

これで問題は解決しますが、../../../ を要求することで誰でもツリーをたどることができます。./wwwroot を任意の有効な Java ファイルパスに変更できます。

static class MyHandler implements HttpHandler {
    public void handle(HttpExchange t) throws IOException {
        String root = "./wwwroot";
        URI uri = t.getRequestURI();
        System.out.println("looking for: "+ root + uri.getPath());
        String path = uri.getPath();
        File file = new File(root + path).getCanonicalFile();

        if (!file.isFile()) {
          // Object does not exist or is not a file: reject with 404 error.
          String response = "404 (Not Found)\n";
          t.sendResponseHeaders(404, response.length());
          OutputStream os = t.getResponseBody();
          os.write(response.getBytes());
          os.close();
        } else {
          // Object exists and is a file: accept with response code 200.
          String mime = "text/html";
          if(path.substring(path.length()-3).equals(".js")) mime = "application/javascript";
          if(path.substring(path.length()-3).equals("css")) mime = "text/css";            

          Headers h = t.getResponseHeaders();
          h.set("Content-Type", mime);
          t.sendResponseHeaders(200, 0);              

          OutputStream os = t.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();
        }  
    }
}
于 2013-07-24T13:01:38.467 に答える