2013-07-29 53 views
1

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

这是我在用的:

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是登录电子错误页面。

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

预先感谢您。

回答

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(); 
// ... 

或者,如果你的webapp不接受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

Hi @BalusC,我们的webapp支持URL重写。我尝试了你的第一个建议,但我仍然得到错误登录页面。该Web应用程序使用Seam身份验证和王子(我用来打印PDF的应用程序)是我的Windows机器上的安装。有没有办法通过登录或将新的urlconnection绑定到已验证的会话。谢谢 –

+1

我不熟悉Seam身份验证,所以我不能详细介绍,但理论上很可能需要额外的请求Cookie。我会监视您的普通网页浏览器(按Chrome/IE10/Firebug中的F12,并检查“网络”/“网络”部分)和网络服务器之间的HTTP流量,以查看请求标头中是否没有其他Cookie。如果是这样,那么你应该在你的程序化请求中模拟相同的cookie。 – BalusC

+0

,在浏览器上(清除缓存并再次登录后),我只有一个jsessionid cookie并且会话存储为空。在tomcat管理器中,Active HttpSessions信息下,活动会话具有列名:会话ID,猜测区域,猜测用户名,创建时间,上次访问时间,使用时间,非活动时间和TTL。 –

0

我不知道如何使用当前用户的会话捕获页面的内容,但我可以建议另一种方式来实现它 - 您可以将Selenium测试用例中的pdf转换逻辑移动到测试用例中导航并登录到需要验证的页面。自动tc登录后,你可以打电话给你的PDF转换逻辑...?

0

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

+0

谢谢@Evgheni和Stimpson猫。我更喜欢捕获页面的内容。 Stimpson,你能否告诉我如何访问内容。printPDF()方法与用于呈现页面的托管bean位于不同的托管bean中。 –

+0

对不起。我对EJB没有太多的经验。也许我错了,我监督你正在处理这个糟糕的事情。我不确定,也许托管Bean受容器保护?我越想越想越幸运,我从来没有用过EJB;) –

0

有几个网站,它允许您将整个页面转换为pdf并保存为.pdf文件。试用网站http://pdfcrowd.com/希望这可以帮助你。