0

对不起,我的英语不好。我在 GAE + GWT 中使用 iText .. 我制作了一个示例应用程序,它在谷歌中运行!但我对 URL 的令牌有疑问。

我有这个 RPC 服务,它在字节数组中创建文档并将其写入 HttpSession,然后在客户端 onSuccess 块中我调用一个 Servlet,它将 PDF 发送给客户端。这String token = "258958395ai53"是客户端找到 PDF 的令牌,但在此示例中,y 将令牌设为静态,因此我需要随机创建令牌并确保令牌不会重复。这是解码代码。

RPC 服务:

public String getPdf() {
    Document document = new Document();
    String token = "258958395ai53";
    // generate test PDF
    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfWriter.getInstance(document, baos);
        document.open();
        document.add(new Paragraph("¡HOLA PUTO MUNDO!"));
        document.close();
        byte[] pdf = baos.toByteArray();
        HttpServletRequest request = this.getThreadLocalRequest();
        HttpSession session = request.getSession();
        session.setAttribute(token, pdf);

    } catch (Exception e) {

        System.out.println("ReportServlet::generatePDF::Exception "
                + e.getMessage());
    }

    return token;
}

小服务程序:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

        // create output stream from byte array in session
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        String token = request.getParameter("token");
        byte[] pdf = (byte[]) request.getSession().getAttribute(token);
        baos.write(pdf);

        // setting some response headers
        response.setHeader("Expires", "0");
        response.setHeader("Cache-Control", "must-revalidate, post-check=0,pre-check=0");
        response.setHeader("Pragma", "public");

        response.setContentType("application/pdf");

        // content length is needed for MSIE
        response.setContentLength(baos.size());

        // write ByteArrayOutputStream to ServletOutputStream
        ServletOutputStream out = response.getOutputStream();
        baos.writeTo(out);
        out.flush();
        out.close();
}

成功:

                public void onSuccess(String lista) {
                    String token =  lista;
                    //Window.open("hello?token="+ token, "_blank","menubar=yes,location=yes,resizable=yes,scrollbars=yes,status=yes");
                    Dialog d = new Dialog();
                    d.setWidth(500);
                    d.setHeight(700);
                    d.setUrl(GWT.getModuleBaseURL()+"hello?token="+token);
                    d.show();
                }
            }); 

任何想法?.. 可以查看我的示例http://pdfprueba2.appspot.com/

4

1 回答 1

0

您可以使用随机生成器。有更高级的随机生成器可用,例如 SecureRandom(请参阅此处它是如何工作的)。最重要的是,您可以组合多个唯一元素来创建一个超级唯一键。本文概述了创建此类事物时使用的一些方法。

考虑到您添加的复杂性越多,所需的资源/时间就越多。

于 2012-06-08T22:34:46.493 回答