java - Java 中的 Crystal Report DB 身份验证

标签 java jdbc crystal-reports authentication

我在使用 Eclipse 的 Crystal Report 中遇到问题。

我正在使用 servlet 通过将查看器对象写入响应来呈现 Crystal 报表查看器,如下所示:

public class ReportViewer extends HttpServlet {

    @SuppressWarnings("deprecation")
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        try {
            String reportName = "WEB-INF/includes/reports/"+request.getParameter("ReportName");
            ReportClientDocument clientDoc = (ReportClientDocument) request.getSession().getAttribute(reportName);

            if (clientDoc == null) {
                // Report can be opened from the relative location specified in the CRConfig.xml, or the report location
                // tag can be removed to open the reports as Java resources or using an absolute path
                // (absolute path not recommended for Web applications).

             clientDoc = new ReportClientDocument();

                // Open report
                clientDoc.open(reportName, OpenReportOptions._discardSavedData);
                // Store the report document in session
                ConnectionInfo info = new ConnectionInfo();
                info.setUserName("sa");
                info.setPassword("sa");
                Tables t =  clientDoc.getDatabaseController().getDatabase().getTables();
                for (com.crystaldecisions.sdk.occa.report.data.ITable table : t) {
                    IConnectionInfo Ic = table.getConnectionInfo();
                    Ic.setPassword("sa");
                    Ic.setUserName("sa");
                    table.setConnectionInfo(Ic);                    
                }
                request.getSession().setAttribute(reportName, clientDoc);

            }



                    // Create the CrystalReportViewer object
                    CrystalReportViewer crystalReportPageViewer = new CrystalReportViewer();

                    //  set the reportsource property of the viewer
                    IReportSource reportSource = clientDoc.getReportSource();               
                    crystalReportPageViewer.setReportSource(reportSource);

                    // set viewer attributes
                    crystalReportPageViewer.setOwnPage(true);
                    crystalReportPageViewer.setOwnForm(true);

                    // Apply the viewer preference attributes



                    // Process the report
                    crystalReportPageViewer.processHttpRequest(request, response, request.getSession(false).getServletContext(), null); 


        } catch (ReportSDKExceptionBase e) {
            System.out.println(e);
        } 
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        doGet(request, response);
    }
}

当我尝试请求此 servlet 时,它会将我重定向到 jdbc 登录页面,然后返回到此 servlet。我需要通过在某处进行硬编码来避免 jdbc 登录步骤。请帮助我,我们将不胜感激每一条评论。

最佳答案

你在 https://wiki.sdn.sap.com/wiki/display/BOBJ/Crystal%20Reports%20Java%20%20SDK%20Samples 查看过维基了吗?

有一个 JSP 示例您也许可以使用:

    <%@ page import="com.crystaldecisions.sdk.occa.report.application.OpenReportOptions,
                 com.crystaldecisions.sdk.occa.report.application.ReportClientDocument,
                 com.crystaldecisions.sdk.occa.report.exportoptions.ReportExportFormat,
                 java.io.ByteArrayInputStream,
                 java.util.Calendar"
%><%
String reportPath;
String db_username;
String db_password;
ReportClientDocument reportClientDocument;
ByteArrayInputStream byteArrayInputStream;
byte[] byteArray;
int bytesRead;

reportPath  = request.getParameter("report_path");
db_username = request.getParameter("db_username");
db_password = request.getParameter("db_password");

/*
 * Instantiate ReportClientDocument and specify the Java Print Engine as the report processor.
 * Open a rpt file.
 */

reportClientDocument = new ReportClientDocument();
reportClientDocument.setReportAppServer(ReportClientDocument.inprocConnectionString);
reportClientDocument.open(reportPath, OpenReportOptions._openAsReadOnly);


/*
 * Set the database logon for all connections in main report.
 */

reportClientDocument.getDatabaseController().logon(db_username, db_password);


/*
 * Retrieve PDF format of report and stream out to web browser.
 */

byteArrayInputStream = (ByteArrayInputStream) reportClientDocument
        .getPrintOutputController().export(ReportExportFormat.PDF);

response.reset();

response.setHeader("Content-disposition", "inline;filename=crreport.pdf");
response.setContentType("application/pdf");

byteArray = new byte[1024];
while((bytesRead = byteArrayInputStream.read(byteArray)) != -1) {
    response.getOutputStream().write(byteArray, 0, bytesRead);  
}

response.getOutputStream().flush();
response.getOutputStream().close();

reportClientDocument.close();

%>

关于java - Java 中的 Crystal Report DB 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/874073/

相关文章:

java - mysql-connector 阻塞不再存在的连接。 Tomcat 卡住

java - 将Java连接到MySQL数据库

java - 我们如何才能在 json 中隐含

java - 将 JasperReport jrxml 加载到 JFrame

java - 使用 keytab 文件连接到 Impala 的 jdbc URL

crystal-reports - 如何限制 Crystal 报表中的导出格式

c# - 内部连接多个表

C# - 从对象模板化打印

javascript - 如何处理JSP文件中的@RequestParam?

java.lang.Throwable : ReferenceError: event is not defined