2010-03-31 37 views
1

我開發了通過HTTPS運行的Intranet應用程序的打印機制。使用javascript和jQuery,我在頁面中創建一個iframe並用所有應該打印的動態數據填充它。當父窗口已通過身份驗證時,iFrame抑制https身份驗證彈出框

iframe的源代碼是/MyController/Print,它只是返回一個空白虛擬頁面。然後將其替換爲動態內容。我這樣做是爲了避免在打印輸出時將頁面位置設置爲「about:blank」,並獲得一些關於某些安全內容的彈出窗口,以及一些不安全的內容。

這在本地運行良好,但是一旦它在https服務器上,我在嘗試創建iframe時就會獲得域身份驗證彈出窗口。這是要求我的用戶名和密碼(即使主要應用程序從未做過 - 它使用內部網絡來識別用戶)。

是否有某種方法來抑制用戶/通過彈出?

回答

0

在這種情況下使用iframe通常會產生x域安全問題。

這個問題是根據Same Origin Policy

發生。因此對於這個問題建議的解決方法將是你使用

<style media="print"> 
    css properties to modify the page for print 
</style> 
+0

謝謝...這正是我想避免的。我的另一個選擇是將src定義爲「javascript:false;」這是有效的。我只是希望在打印輸出中使用更友好的網址。任何其他想法? – macca1 2010-03-31 19:57:27

+0

雖然這在技術上不能回答這個問題,但我會去「沒有明確的答案」。此外,您的迴應激發了我以不同的方式對打印功能進行編碼,其中包括用於打印的CSS。所以即使我不能像我想要的那樣100%地工作,這很好。謝謝! – macca1 2010-04-01 22:50:05

0

這實際上是從另一個職位,但我真的很喜歡這個方案。

你可以設置你的動作控制器來編寫可打印數據爲PDF

public FileStreamResult Print(int id) 


{ 
    var model = _CustomRepository.Get(id); 
    this.ConvertToPDF = true; 
    return View("HtmlView"); 
} 

public override OnResultExecuting(ResultExecutingContext context) 
{ 
     if (this.ConvertToPDF) 
     { 
      this.PDFStream = new MemoryStream(); 
      context.HttpContext.Response.Filter = new PDFStreamFilter(this.PDFStream); 
     } 
} 

public override OnResultExecuted(ResultExecutedContext context) 
{ 
     if (this.ConvertToPDF) 
     { 
      context.HttpContext.Response.Clear(); 
      this.PDFStream.Seek(0, SeekOrigin.Begin); 
      Stream byteStream = _PrintService.PrintToPDF(this.PDFStream); 
      StreamReader reader = new StreamReader(byteStream); 
      context.HttpContext.Response.AddHeader("content-dispostion", 
       "attachemnt; filename=report.pdf"); 
      context.HttpContext.Response.AddHeader("content-type", 
       "application/pdf"); 
      context.HttpContext.Response.Write(reader.ReadToEnd()); 
     } 
} 

我假設你使用的是.NET MVC。我希望我沒有錯

+0

這真的很酷。雖然它不適用於我現在正在做的事情,但我可能會在未來回到這一點。謝謝! – macca1 2010-04-01 22:49:12