探索企业级报表工具市场中新的竞争者的url接口
摘要
从web应用程序产生高质量的打印输出是非常困难的,因为浏览器对文档布局仅仅提供了有限的控制。在浏览器中调整页边距和精确定位文档元素已证明是不可能的。当要在页面预览或页面流程必须紧密控制时,必须使用一个基于服务器端的文档创建引擎。现在,有很多这样的技术和产品。一个解决方案应该提供一个好的报表开发效率,一个gui报表设计器,良好的伸缩性,性能卓越(特别是在并发显示pdf文档时)和有着吸引人的价格。在测试的数款产品中,我们对microsoft sql server报表服务(report services,以下简称rs)很满意。
rs可以方便地集成和部署到microsoft系统环境中,但是使它可以访问java web应用程序仍需要作很多工作。这篇文章提供了一些指导,方便用户把rs集成到java web应用程序中。
java web应用程序经常使用到ms sql server数据库。现在,ms sql server绑定了一个报表工具,报表服务(rs)。rs一年前面市后就吸引了很多开发人员的注意力。它是一个完美的报表工具:一个拥有脚本和可编程的所见即所得(wysiwyg)报表编辑器,一个传送引擎和一个功能强大的web服务接口。使用rs变得非常有意义,不仅从使用价值上考虑,而且与第三方产品比较,它减少了开发和部署的复杂性。这篇文章就是探索这种集成的应用。
rs可以被安装到sql server系统中,而不需要任何使用许可费用(目前发布的sql server 2000 企业版、标准版或开发版中均包含了rs)。rs要求在所安装的服务器上同时安装iis(inte.net information services)。报表开发的客户端是visual studio的一个插件,作为rs客户端安装程序的一个部件安装到开发环境中。最新的版本是1.0;而且,microsoft为rs已提供了service pack 1下载。rs作为一个上市不久的新产品,给开发者提供了与主流开发方式完全连贯的开发体验
版权声明:任何获得matrix授权的网站,转载时请务必保留以下作者信息和链接
作者:donner;papas;steven_guo(作者的blog:http://blog.matrix.org.cn/page/steven_guo)
原文:http://www.matrix.org.cn/resource/article/44/44375_sqlserver+report+services.html
关键字:sqlserver;report;services
注:在这篇文章中,假定任何报表均是为打印而创建,术语“报表”和“文档”被交替使用。
报表服务(rs)概述
本文中描述的解决方案可以满足大量用户去分别产生独立的文档;也就是说,报表针对特定请求独立产生。本文聚焦于生成特定需求报表,并且把报表通过http流传送到浏览器;没有涉及其他的处理方式。
web应用程序收集所有的用户输入需求后发送一个报表创建请求到rs,通过保存控件数据到数据库或传送参数来收集数据。最终结果以指定的格式随后显示在用户屏幕上。
这里有两种根本不同的方式去整合rs和web应用程序。
第一,用户可以直接访问报表服务器。因此,rs必须向外部提供服务。应用程序能被rs服务器连接或重定向到对应的报表上。
第二,rs可以被web应用程序包装。报表服务不能被直接访问。web应用程序转发请求到rs服务器,并转送报表流到用户。
让我们更进一步看看这些实现方式。
rs服务器直接面向用户
when users access the rs server directly, the application can simply link or redirect to the reports (see figure 1). while this scenario at first looks attractive because it is simple, it often results in an undesirable implication.
当用户直接访问rs服务器时,用户程序简易地连接或重定向到对应请求的报表(看图1)。这种应用场景初看起来非常有吸引力,因为部署非常简单,但是这种方式隐含着潜在的危险。
图1. 用户直接访问rs服务器
rs仅仅支持windows集成权限管理(以前被称作ntlm,或nt局域网管理器)。默认情况下,rs安装脚本配置iis以便应用windows集成权限管理。这意味着ie通过当前用户的windows信任状自动认证授权。但是,其他的浏览器可能不能实现这种自动授权方式。一旦启用基本认证,非ie浏览器将变换用户信任状(rs的一些特性不能与非ie浏览器协同工作,稍候有更多关于浏览器限制的信息)。无论使用何种认证形式,用户要么通过域账户、要么通过本地账户访问rs服务器。
因此,不使用windows域账户而认证大量用户直接访问方式是不切实际的。在这个例子中,web应用程序使用ibm tivoli访问管理器和ldap目录服务管理用户许可。我们很不情愿去针对这种集成方式开发一个定制的安全管理的拓展。这种方式里,这种扩展性在sql server标准版里是不可用的,需要更昂贵的sql server 企业版才能实现。
可以配置rs使用匿名访问,但是因为一个很明显的缘由,应该避免这种配置在可公共访问的服务器上实现。
就是因为关注外部直接认证用户的能力限制,所以直接访问方式针对我们的目标是缺少吸引力的。
使用java servlet 包装rs服务器
当用户不需要直接访问报表服务器时,可以使用一个服务账户。所有的请求通过这个账户来完成,不论是谁登录了web应用程序。一个java servlet管理用户的rs请求和转送数据返回到客户端,它不需要为每个请求适用独立的帐户去登录rs服务器。在这个场景中,web应用程序必须提供一个域名,即使在默认配置中也可以实行iis认证,而不管用户的浏览器类型。
图2.应用服务器封装了rs服务器
rs(如果iis 部署在rs服务器上)应该配置使用非标准端口,从而阻止外部用户直接调用。
因为应用程序可为超过10000的用户认证使用一个服务帐户,所以我们决定使用这种方式。
报表访问方式
谈到这点,我们已经讨论了rs调用,但没有谈及一个报表怎样被调用的细节。能通过三种方式访问报表:报表管理器,web服务借口和url接口。
报表管理器
rs的web管理接口叫作报表管理器。报表管理器(可定制)有着自身的外观,要求认证方式登录(使用匿名访问iis导致错误消息),尽管microsoft在文档中宣称可以通过其他浏览器登录,但还时不能.netscape7正常登录。
报表管理器可以访问rs的所有特性。用户可以使用它去上载和运行报表;但是,因为它的管理特性,在这方面它不是一个合适的工具,它不能很好的与web应用程序整合。
web服务接口
rs的web服务接口功能完整,它提供了所有rs的特性。报表管理器作为一个web服务的客户端使用这些服务接口。如果你愿意,你可以从java/apache axis客户端访问rs web服务接口。而且,在本文中,我们集中探讨这个url接口。
url接口
与通用api相比,通过url接口可以得到一个良好的访问性能。发送一个http请求道rs url,即可创建报表。查询字符串可以包含很多参数,比如报表名字和输出格式。报表服务器按指定格式发送响应返回给请求者。
例如,一个pdf报表仅仅包含一个二进制流,一个html报表包含两个分离的页面流和嵌入图片流。因为servlet传送html到用户浏览器时并不维护rs服务器中的session,所以在客户端用户不能看到嵌入图片,而是看到了从报表服务器返回的认证失败的错误消息。因此,servlet必须解析html流中对图片的引用,从图像流中通过另外一个servlet的url接口替换这些图片引用,从而可以模拟rs中用户请求的session。
url接口包装器servlets
本文的随后部分站是给你如何去实现一套servlets,这些servlets就像一个rs的url接口客户端。
reportrequest.java
reportrequest是一个主要的servlet,用来初始化报表请求和处理报表流。reportrequest servlet被设计成一个在j2ee架构系统和microsoft报表服务web服务器直接的调解器。可以通过inte.net访问,但出于安全考虑,报表服务器是不能被访问到的。
这个servlet的任务包括:认证访问报表服务器的请求,传送报表参数,返回报表服务器响应。
认证
通过使用java中authenticator类(ntlm要求java 1.4.2 或更高版本)来调用ntlm,reportreques认证iis访问。一个定制类调用扩展了 java.net.authenticator类的reportauthenticator类,实现对用户名和密码的加密转换。要指定用户域或域名,使用如下格式:
domain\username
或:
server\username
设置回调对象,reportrequest作如下调用:
authenticator.setdefault(new reportauthenticator());
repcon.setrequestproperty("user-agent", "mozilla/5.0");
string contenttype = reportcon.getcontenttype();
clientresponse.setcontenttype(contenttype);
clientresponse.setheader("content-disposition",
reportcon.getheaderfield("content-disposition"));
<img src="http://reportserver/reports?querystringxxxx">
<img src="http://proxy/getreportitem?cookie=cookiedata&querystringxxxx">
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器