2013-07-29 33 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/希望這可以幫助你。