捕获受会话保护的 JSF 页面的内容

问题描述 投票:0回答:4

我想捕获当前页面并将其发送到将其转换为 pdf 的应用程序。

这就是我正在使用的:

FacesContext facesContext=FacesContext.getCurrentInstance();


       HttpServletResponse response = (HttpServletResponse)
facesContext.getExternalContext().getResponse();
       HttpServletRequest request = (HttpServletRequest) facesContext.getExternalContext().getRequest();
//        RequestPrinter.debugString();
       response.reset();
    // download a pdf file
       response.setContentType("application/pdf");
        response.setHeader("Content-Disposition","attachment;filename="+new Date().toString()+".pdf");
         prince.setVerbose(true);
        prince.setLog(logFile);

            try{


                //getPath() to the page the user is currently on
                URL pagePath=new URL(this.getPath());
                URLConnection urlConnection = pagePath.openConnection();

                urlConnection.setDoOutput(true);

                int length = urlConnection.getContentLength();

                //Lets use inputStream
                BufferedInputStream bis=new BufferedInputStream(urlConnection.getInputStream());
                response.setContentLength(length);
                //this.getPageUsingJSoup().data().getBytes();
                //call prince and pass params for inputstream  outputStream

                prince.convert(bis,response.getOutputStream());
                urlConnection.getInputStream().close();

            }catch(MalformedURLException mu){

                mu.printStackTrace();
            }
            catch(IOException ioe){
            ioe.printStackTrace();
            }

   facesContext.responseComplete();

由于网站需要认证,生成的pdf就是登录错误页面。

有没有办法捕获使用当前用户会话的页面内容?

提前谢谢您。

session jsf
4个回答
3
投票

只需在与当前请求相同的 HTTP 会话中请求该页面即可。如果您的 Web 应用程序支持 URL 重写(默认情况下),则只需将会话 ID 附加为

jsessionid
路径片段:

String sessionId = ((HttpSession) externalContext.getSession()).getId();
InputStream input = new URL("http://localhost:8080/context/page.jsf;jsessionid=" + sessionId).openStream();
// ...

或者,如果您的 Web 应用程序不接受 URL 重写,但仅接受 Cookie,则按照通常的方式将其设置为请求 Cookie:

URLConnection connection = new URL("http://localhost:8080/context/page.jsf").openConnection();
connection.setRequestProperty("Cookie", "JSESSIONID=" + sessionId);
InputStream input = connection.getInputStream();
// ...

请注意,我删除了

setDoOutput()
,因为您似乎对执行 POST 请求不感兴趣。


0
投票

我不知道如何使用当前用户的会话捕获页面的内容,但我可以建议另一种方法 - 您可以将 pdf 转换逻辑移至 Selenium 测试用例内,并使用测试用例进行导航和登录进入需要认证的页面。自动tc登录后,您可以调用您的pdf转换逻辑...?


0
投票

是的,当然有。您正在发送此内容,因此您已拥有它。您应该存储内容对象。如果没有,请检查您的字节流。内容应该在那里;)


0
投票

有几个网站允许您将整个页面转换为 pdf 并将其另存为 .pdf 文件。尝试该网站http://pdfcrowd.com/希望这对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.