集智平台API方式如何设置会话变量

会话变量是和用户个人信息相关的一些变量,比如用户名、岗位、部门、职位、角色等等,有了会话变量,就可以识别这个人的身份,知道这个人拥有哪些权限。如果用户要实现对报表数据权限的控制,不同的人查看报表得到不同的数据查询结果,就可以通过判断用户会话变量的中的值,动态生成过滤条件并将条件应用于sql中,从而达到数据安全性的控制。

报表的参数类型有普通参数、动态参数和会话变量。会话变量可以直接读取session中存储的信息。使用方式如下:

1.使用配置-》参数,添加会话变量类型的参数userName

 

2.为模拟获取系统中的session值,可在报表发布页面加入如下代码:

<%

String username=”user1″;

session.setAttribute(“userName”,username);

%>

利用session设置值的方法存储用户信息,keyuserNamevalueusername

再用html标签发布报表模板:

<report:html name=”report1″ reportFileName=”<%=report%>”

                            needLinkStyle=”no”

                            funcBarLocation=”"

                            width=”-1″

                            exceptionPage=”/reportJsp/myError2.jsp”

                   />

3.访问报表发布页面,在报填报表单元格中可以获得用户参数userName的值。

 

由上面的操作可知,如果用tag标签直接进行报表发布,报表会自动获取页面的session对象,得到session值并传递给参数,在报表中即可直接使用该参数对象。可是如果用户不用tag标签,用api的方式完成报表运算并展现,此时如何来设置会话变量呢?

原本用的方式如下:

ParamMetaData pmd = rd.getParamMetaData();  //从报表定义中取得参数元对象String paramOrMocrName = “”;

if(pmd != null){

  for(int i = 0, count = pmd.getParamCount(); i < count; i ++ ) {   //讲究优化的写法paramOrMocrName = pmd.getParam(i).getParamName();  //获取参数名

if(pmd.getParam(i).getParamType()==2){//如果为会话变量

cxt.setParamValue(paramOrMocrName, session.getAttribute(paramOrMocrName)); //设参数值

continue;

}

 

通过上面代码,利用contextsetParamValue方法设置会话变量参数值,该方式设置的值在报表中不能直接获取到。

下面介绍正确的方法:

<%

String username=”wm”;

session.setAttribute(“user”,username);

String reportFile = “F:\\reportHome\\webapps\\demo\\reportFiles\\getSession.raq”; 

ReportDefine rd = (ReportDefine)ReportUtils.read( reportFile );

Context cxt = new Context();  //构建报表引擎计算环境

//通过contextsetHttpSession可设置contextsession

cxt.setHttpSession(session);

Engine engine = new Engine(rd, cxt);  //构造报表引擎

IReport iReport = engine.calc();  //运算报表String htmlText = ReportUtils.toHTMLString(iReport,”report1″,request);  //生成html

out.print(htmlText);

%>

通过该方法设置的session,可以直接通过context传递给报表,在报表运算的时候被调用。此时报表展现结果如下: