0

我编写了以下 servlet,它将输入转换为大写:

 public class TestServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        InputStream in=req.getInputStream();
        OutputStream out=resp.getOutputStream();
        byte array[]=new byte[1024];
        int nReads;
        while((nReads=in.read(array))!=-1)
            {
            for(int i=0;i<nReads;++i)
                {
                array[i]=(byte)Character.toUpperCase(array[i]);
                }
            out.write(array, 0, nReads);
            }
        out.flush();
        out.close();
        }
    }

它工作正常:

echo "aaaaaaaaaaaaaaaaaaaaaaaaaaa" |\
curl -d @- "http://localhost:8080/app/test"
AAAAAAAAAAAAAAAAAAAAAAAAAAAl

部署这样的 servlet 是否安全?这种 servlet 的缺陷是什么?例如,如何防止用户永远阻止我的 servlet 实例:

 cat  | curl -d @- "http://localhost:8080/app/test/x"
4

1 回答 1

0

不,您不能通过管道将流传输到 servlet。HTTP 并没有真正提供输入流。

您的命令有效,因为cat一旦完成输出数据就会返回。curl然后抓取所有数据并将其发送。但是,curl在完成获取数据之前不会发送任何内容。

当然,这样做的好处是它不会阻塞 servlet 的实例,因为阻塞发生在 curl 上,而不是 servlet 上。

于 2013-01-23T14:17:54.827 回答