java每小时保存http发布请求

时间:2015-12-14 14:09:28

标签: java http

我正在尝试使用简单的http服务器在aws上设置服务器并保存每个http post请求标头&有效载荷。

它在本地工作。

通过ssh连接到ec2服务器之后的步骤:

  • javac Server.java
  • sudo nohup java Server

它将标题保存到日志文件而不是有效负载,并且它不会返回204响应。

Server.java

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.URLDecoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Executors;

public class Server {

    private static final int PORT = 80;
    private static final String FILE_PATH = "/home/ec2-user/logs/";
    private static final String UTF8 = "UTF-8";
    private static final String DELIMITER = "|||";
    private static final String LINE_BREAK = "\n";
    private static final String FILE_PREFIX = "dd_MM_YYYY_HH";
    private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(FILE_PREFIX);
    private static final String FILE_TYPE = ".txt";

    public static void main(String[] args) {
        try {
            HttpServer server = HttpServer.create(new InetSocketAddress(PORT), 0);
            server.createContext("/", new HttpHandler() {
                @Override
                public void handle(HttpExchange t) throws IOException {
                    System.out.println("Req\t" + t.getRemoteAddress());
                    InputStream initialStream = t.getRequestBody();
                    byte[] buffer = new byte[initialStream.available()];
                    initialStream.read(buffer);
                    File targetFile = new File(FILE_PATH + simpleDateFormat.format(new Date()) + FILE_TYPE);
                    OutputStream outStream = new FileOutputStream(targetFile, true);
                    String prefix = LINE_BREAK + t.getRequestHeaders().entrySet().toString() + LINE_BREAK + System.currentTimeMillis() + DELIMITER;
                    outStream.write(prefix.getBytes());
                    Map<String, String> queryPairs = new HashMap<>();
                    String params = new String(buffer);
                    String[] pairs = params.split("&");
                    for (String pair : pairs) {
                        int idx = pair.indexOf("=");
                        String key = pair.substring(0, idx);
                        String val = pair.substring(idx + 1);
                        String decodedKey = URLDecoder.decode(key, UTF8);
                        String decodeVal = URLDecoder.decode(val, UTF8);
                        queryPairs.put(decodedKey, decodeVal);
                    }
                    outStream.write(queryPairs.toString().getBytes());
                    t.sendResponseHeaders(204, -1);
                    t.close();
                }
            });
            server.setExecutor(Executors.newCachedThreadPool());
            server.start();
        } catch (Exception e) {
            System.out.println("Exception: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

考虑对handle方法的这些更改。作为一个起点,有两件事情发生了变化:

  • 它会读取完整输入并将其复制到您的文件中(initialStream.available()可能不完全正确)

  • 捕获,记录并重新抛出IOExceptions(毕竟你没有看到你的204)

考虑将输出重定向到文件中,以便稍后检查服务器上发生的事情:

sudo nohup java Server > server.log 2> server.err &

如果您更详细地描述了所需的目标文件结构,我们可以在那里找到一些东西。

            @Override
            public void handle(HttpExchange t) throws IOException {
                try {
                    System.out.println("Req\t" + t.getRemoteAddress());
                    InputStream initialStream = t.getRequestBody();
                    File targetFile = new File(FILE_PATH + simpleDateFormat.format(new Date()) + FILE_TYPE);
                    OutputStream outStream = new FileOutputStream(targetFile, true);
                    // This will copy ENTIRE input stream into your target file
                    IOUtils.copy(initialStream, outStream);
                    outStream.close();

                    t.sendResponseHeaders(204, -1);
                    t.close();
                } catch(IOException e) {
                    e.printStackTrace();
                    throw e;
                }
            }