TSS 常见问题(FAQ)

Q:系统安全配置有哪些?

TSS增加不同的使用场景,可配置不同的安全级别,共7级,通常建议配置在6级以上。安全级别 security.level 配置在application.properties里,打包时设定安全级别值。除此之外,还有白名单、密码定期修改、登录出错达到10次锁定密码等

1、安全级别 >=4 fuckXSS 开启防XSS注入攻击的过滤;(Admin除外,以便在线维护record、门户组件里脚本)
2、安全级别 >= 4,访问报表服务(json或jsonp或下载导出)需要对报表有浏览权限。 安全级别 < 4则可以匿名访问。
   安全级别高的情形下,如需让某个报表服务可被匿名访问,则将报表服务的浏览权限授权给匿名角色。
   安全级别 = 6,数据录入的所有接口(包括附件操作)开启行级数据权限检查;
   安全级别 = 7,所有远程接口访问都要进行签名及验签,适合外部系统访问场景( < 7 支持直接秘钥uToken访问,适合内部系统间访问场景)
3、/auth/... 的服务如果需要被匿名访问,tssJS.ajax request里设置header.anonymous = true
4、API白名单:设置含特定关键字的服务是否可以匿名访问
5、IP白名单:跨域访问时,有防盗链机制,例外需加到IP白名单
6、登录验证超过10次出错,锁定账号10分钟
   密码强制定期修改 & 密码强度安全检查,如果密码不安全(强度低或已过期等),则要求修改为安全密码后方可继续访问
注:强制用户修改密码间隔天数。默认180天,通过系统参数:passwd.cyclelife 设置

Q:数据源异常,导致查询缓慢?

数据源异常,致使落到异常数据源的查询缓慢排队,进而超过QueryCahce的等待阈值MAX_QUERY_REQUEST,致使其它数据源的查询异常,解决办法如下:

1、在【性能监控】里找出正在执行的报表,进行针对性处理
2、在【数据源】里调整连接池的大小,控制其最大并发查询量
3、在【缓存管理】里把异常的数据源连接池状态设为“停用”

注:在【数据源】里调整保存某个数据源后,如果它在缓存管理里是停用的,将会自动启用

Q:某些个报表查询异常缓慢,拖累系统

停用报表,并在其查询条件里加上 and 0=1, 使其立即失效。

Q:并发大时系统卡顿,需检查哪些地方?

数据类连接池、apache连接数、tomcat配置、机器负载情况

Q:系统性能优化、稳定性控制措施有哪些??

1、应用服务器分布式部署,无限复制;
2、查导分离:通常导出比较费时和消耗内存,可以把导出请求单独发送到一台独立的机器;
3、数据缓存:默认对查询数据结果缓存3分钟,能消除10%到50%不等相同(同一接口&相同参数)请求;
4、QueryCache:对查询过程(请求正处于执行状态)进行缓存,对后来的同一报表&相同查询条件
  的查询请求,将不再发起DB查询,而是进入等待状态。等第一次的查询执行完成,后续的查询直接取缓存里的数据。
  防止用户重复点击查询(以及频繁且耗时的查询),造成性能瓶颈。
5、控制等待状态的线程数:QueryCache的等待队列和HTTPProxy的转发请求队列,都会占用线程,
   如果执行缓慢,会知道线程耗尽,系统奔溃。具体参考 QueryCacheInterceptor 和 Filter5HTTPProxy

Q:宕机事件整理?

2016-08-26 10:52:43 雅典娜库DB链接释放非常慢且使用中连接数逐渐上升,查看10分钟Cache(命中率高的离谱),发现部分QC_Cache项命中次数很高,
  据此猜测:报表SQL执行慢 且 访问频繁 ==> QC_Cache池线程无法释放 ==> 线程耗尽、系统崩溃
  解决办法:QC_cache的等待线程数,超过阈值则返回提示。

企业域相关

Q:实现域下用户分级管理?

把所有【$企业域】及所有子组编辑权限开给部门主管,部门主管可以管理自己所在组及子组的人员
1、部门主管可以创建部门人员,编辑、停用、启用人员
2、在子组间移动人员
3、如需管理人员的角色,开发者需要先把相应角色的管理权限开给部门主管

Q:如何自定义登陆页?

TSS允许不同的实例自定义自己的登录页,也支持为每个不用的访问域名配置不同的登陆页,从而实现不同的企业域有自己的登陆页

1、白名单加: /customize_login,login_e8.html
2、系统参数加:自定义登陆页 = customize_login  {"e8.boudata.com": "login_e8.html", "cx.boudata.com": "login_cx.html"}

注:自定义登录页后,login.html将会自动跳转过去,需要注册企业域的话需要加上参数reg=1,eg:http://localhost:9000/tss/login.html?reg=1


数据报表常见问题

Q:写数据报表的SQL脚本需要注意的地方?

1、record的表字段和report的查询字段code一律用小写
2、SQL如果分成多行书写,当想要注释掉中间某一行时候,不能用"--"来注释,这样发到后台执行时,
   会把改行后面的记录全部注释掉。可以用 /* ... */来注释,或直接删除改行
3、配置的参数个数需和SQL中接收的参数个数一致,类型也要一致

var web_server_url = ""; 
if( location.protocol === 'file:' ) {  // 判断是否在本地打开HTML页面
  web_server_url = "http://10.6.122.68:8080";
}

Q:数据服务的缓存类型有哪些?

1、默认情况下,执行相同【查询条件 + 用户所在域】的查询结果会被缓存3分钟。
2、按用户缓存(查询条件一样,用户也要一样,用于sql里含数据行权限过滤的数据查询服务): 
  /tss/data/json/123?uCache=true  或 {'label':'按用户缓存','type':'hidden','name':'uCache','defaultValue':'true'} 
3、始终不缓存
  /tss/data/json/123?noCache=true 或 {'label':'是否缓存','type':'hidden','name':'noCache','defaultValue':'true'} 

注:按用户缓存适用用于查询脚本里加了用户信息(session里的账号、组织、角色等信息,比如${userCode}),这类情形必须使用uCache或noCache

Q:报表【查询】和【导出】如何分隔到不同的机器?

在param里配置一个参数【report_export_url】,值为tomcat地址,比如:【http://10.12.101.9:8080】,则所有导出数据请求都被引导至这个服务地址。前提是:导出用服务器安全级别 <=2, 或通过需要白名单和uToken来配合完成。

Q:有查询条件的报表如何直接使用默认查询条件打开?

在report_portlet.html,如果所有必填参数都已有值,则自己打开报表,无需弹出查询条件框;在reporter.html,一律先弹查询条件框。

Q:如何实现JS跨域调用数据服务?

1、tssJS.JSONP.getJSON(
      "http://10.9.45.68:8084/tss/data/jsonp/725",
      {"param1": 60061, "param3": "2016-05-25", "param4": "2016-05-26"},
      function (data) { alert(data); }
    );
2、使用普通ajax,首先client要加入server的ip白名单中.
   另:经测试jQuery.ajax请求可以跨域调用成功,tssJS.ajax不行.
      jQuery.ajax({
          url: "http://172.18.24.145:9000/tss/data/json/388",
          type: "POST",
          crossDomain: true,
          dataType: "json",
          success: function (data) {
              alert(data);
          }
      });
注:jsonp的地址是/tss/data/jsonp, 比ajax调用/tss/data/json 多一个【 p 】

Q:数据服务单次获取数据的上限是10万行,如果超过10万行,该如何获取?

  params.pagesize = 100*10000; // 100万
  tssJS.getJSON( '/tss/data/json/' + reportId, params,
      function(data) {
        callback(data);
      }
  );

Q:TSS 各个实例的数据服务如何互访?

1、在appServer.xml里配置各个实例彼此的地址信息,如
< server code="BI"  name="BI"  ...... baseURL="http://10.10.12.67:8082/tss"/>     
< server code="BI2" name="BI-JOB" ...... baseURL="http://10.10.12.66/tss"/>
2、$.getJSON("/tss/data/json/xxx?appCode=BI", {...}, function(result) { ... } );

注:如果目标应用的安全等级 >=4,则需携带令牌uToken或签名uSign

Q:数据莫名异常,查询出来的记录数和数据库里就是对不上(已等待3分钟以上)

检查3分钟cache是否有异常,cleaner没有定时自动clean。是的话【清空并初始化】3分钟cache,或者直接【重启应用】。


数据录入表

Q:录入表【例:tx_order】开放给匿名访问步骤?

1、录入表【tx_order】的浏览权限授予匿名角色
2、/xdata/json/tx_order 加入地址白名单, 相应html页面地址也加入地址白名单
3、/xdata/json/tx_order?anonymous=true
注:开放匿名访问了则无法在限制数据的域

JAVA二次开发

Q:创建了新的package(不在com.boubei下),里面有Service和Action,需要调整哪些XML配置文件?

找到下面三个XML文件,把里面: base-package="com.boubei" 修改成 : base-package="com.boubei,新建的package"
1、src/main/resources/META-INF/spring-framework.xml,
2、src/main/resources/META-INF/spring-mvc.xml
3、src/test/resources/META-INF/spring-test.xml。

名词解释

Q:“给角色授权”和“授予角色”的区别是什么?

1、给角色授权,是把资源列出来,按需授权给当前选中的角色;在角色授权界面里操作;
2、授予角色,是把角色列出来,按需把当前选中资源的权限授给某些角色;在各个资源管理界面里操作。

Q:什么是资源,有哪些分类?

"私人资源":是属于某一个用户所有的资源,只有用户本人才能操作,其他用户不能操作。
    例如用户的个人信息、订单、收货地址等等。
"角色资源":与私人资源不同,角色资源范畴更大,一个角色可以对应多个人,也就是一群人。
    如果给某角色分配了权限,那么只有身为该角色的用户才能拥有这些权限。
    例如系统资源只能够管理员操作,一般用户不能操作。
"公共资源":所有人无论角色都能够访问并操作的资源。  

Q:什么是资源权限?

"资源权限",就是资源与操作的一套组合,例如"增加用户"是一种权限,"删除用户"是一种权限。
角色与用户的关系:一个角色对应一群用户,一个用户也可以扮演多个角色,所以它们是多对多的关系。
角色与权限的关系:一个角色拥有一堆权限,一个权限也能属于多个角色,所以它们多对多的关系。
权限与用户的关系:由于一个用户可以扮演多个角色,一个角色拥有多个权限,所以用户与权限是间接的多对多关系。

需要注意两种特别情况:
1、私人资源与用户的关系,一种私人资源的权限只能属于一个用户,所以这种情况下,用户和权限是一(用户)对多(权限)的关系。
2、超级管理员的角色,这个角色是神一般的存在,能无视一切阻碍,对所有资源拥有绝对权限,甭管你是私人资源还是角色资源。

Q:Freemarker中可以使用的全局变量有哪些?

名称类型值示例描述
userCode String BD0000 用户账号,SQL脚本引用示例: applier = '${userCode}'
userName String 金石 用户名称
userRoles List [12,19] 用户拥有的角色ID列表; userRoleNames同
_userRoles String 12,19 逗号分隔的字符串; _userRoleNames同
{角色名称} String 财务主管 比如判断是否拥有角色“财务主管”,写法为:<#if 财务主管??>...<#if>
role_{角色ID} Long role_12 比如判断是否拥有角色“财务主管”ID,写法为:<#if role_12??>...<#if>
userGroup String 浙江分公司 用户所在组 = GROUP_LAST_NAME
userGroupId Long 102 用户所在组ID = GROUP_LAST_ID
GROUP_LEVEL int 3 用户所属组层级
GROUP_{X}_ID Long GROUP_2_ID = 102 X ∈ [1, GROUP_ GROUP_LEVEL],第X级组ID
GROUP_{X}_NAME String GROUP_2_NAME = 财务部 X ∈ [1, GROUP_ GROUP_LEVEL],第X级组名
DOMAIN String 卜数科技 用户所属域
USERS_OF_DOAMIN String 'BD0000','BD0001' 逗号分隔,用户所属域下的用户账号集
USERIDS_OF_DOAMIN String 12,13 逗号分隔,用户所属域下的用户ID集
USERS_OF_GROUP String 'BD0000','BD0001' 逗号分隔,用户所属组下的用户账号集;查询数据表时可直接加 ${filterByGroup},对数据进行按组过滤
USERIDS_OF_GROUP String 12,13 逗号分隔,用户所属组下的用户ID集
USERS_OF_GROUP_DEEP String 'BD0000','BD0001' 逗号分隔,用户所处组(含子组)下的用户账号集;查询数据表时可直接加 ${filterByGroupDeep},对数据进行按组(含子组)过滤
USERIDS_OF_GROUP_DEEP String 12,13 逗号分隔,用户所处组(含子组)下的用户ID集
注:变量通常来自session(在***AfterLoginCustomizer里加入Session)或param里配置的变量。可通过以下地址检测:http://localhost:9000/tss/si/ui/{变量名}

小程序开发

Q:新建小程序项目注意以下步骤

1、添加 servicewechat.com 到TSS的IP白名单【系统参数】,否则访问TSS服务时会报404.html(refer= https://servicewechat.com/.....)
2、添加 appId 和 appSecret 到系统参数。

获得帮助:boubei@163.com  TSS社区: http://bbs.boubei.com ,QQ群:162875668