2010-03-31 72 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