皕杰技术社区

 找回密码
 立即加入

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 925|回复: 4

皕杰报表访问控制Filter示例

[复制链接]
发表于 2019-4-17 16:17:58 | 显示全部楼层 |阅读模式
皕杰报表集成的服务器的时候分为只集成报表环境和皕杰平台两个方式,如果只集成报表环境的时候怎么给这个报表环境添加上登录权限验证。
1.写登录权限验证fiter类,示例:
  1. package bios.report.dev.examples.filters;
  2. /**
  3. * 报表访问控制Filter的演示例子
  4. * @author Bijetsoft.com
  5. */
  6. public class ReportAccessFilter implements Filter {
  7.         /**
  8.          * session中的用户ID属性名
  9.          */
  10.         private static final String USER_ID = "USER_ID";        
  11.         /**
  12.          * 功能点ID,查看报表
  13.          */
  14.         private static final int FUNCTION_VIEW = 1;
  15.         /**
  16.          * 功能点ID,导出Excel
  17.          */
  18.         private static final int FUNCTION_XLS = 2;
  19.         /**
  20.          * 功能点ID,导出pdf
  21.          */
  22.         private static final int FUNCTION_PDF = 3;
  23.    
复制代码
 楼主| 发表于 2019-4-17 16:20:07 | 显示全部楼层
  1. /**
  2.          * 功能点ID,打印报表
  3.          */
  4.         private static final int FUNCTION_PRINT = 5;       
  5.         /**
  6.          * 请求编码
  7.          */
  8.         private static String encode = "GBK";
  9.     public ReportAccessFilter() {
  10.     }
  11.         public void destroy() {
  12.         }
  13.         public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  14.                 HttpServletRequest req =(HttpServletRequest)request;
  15.                 req.setCharacterEncoding(encode);
  16.                 String errorMsg = null;
  17.                 String userId = (String)req.getSession().getAttribute(USER_ID); //获取用户ID,判断是否为登录用户
  18.                 if(userId == null)
  19.                         errorMsg = "您无权访问报表系统,请先登录!";
  20.                 else {
  21.                         String rpt = req.getParameter("rpt");
  22.                         if (isReportExist(rpt)) { //判断报表参数是否合法,指定的报表是否存在
  23.                                 //判断用户是否有权对报表进行访问、导出、打印等操作
  24.                                 String output = req.getParameter("emitter");

复制代码


回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-17 16:21:09 | 显示全部楼层
  1. if((output == null || "tohtml".equalsIgnoreCase(output)) && !hasRight(userId, rpt, FUNCTION_VIEW))
  2.                                         errorMsg = "您无权查看该报表!";
  3.                                 else if("toxls".equalsIgnoreCase(output) && !hasRight(userId, rpt, FUNCTION_XLS))
  4.                                         errorMsg = "您无权进行导出Excel操作!";
  5.                                 else if("topdf".equalsIgnoreCase(output) && !hasRight(userId, rpt, FUNCTION_PDF))
  6.                                         errorMsg = "您无权进行导出PDF操作!";
  7.                                 else if("todoc".equalsIgnoreCase(output) && !hasRight(userId, rpt, FUNCTION_DOC))
  8.                                         errorMsg = "您无权进行导出Word操作!";
  9.                                 else if("print".equalsIgnoreCase(output) && !hasRight(userId, rpt, FUNCTION_PRINT))
  10.                                         errorMsg = "您无权进行打印操作!";       
  11.                         } else {
  12.                                 errorMsg = "指定报表不存在!";
  13.                         }
  14.                 }
  15.                 //无权访问或权限验证出错时,输入提示信息
  16.                 if(errorMsg != null){
  17.                         response.setContentType("text/html;charset=" + encode);
  18.                         StringBuffer html = new StringBuffer();

复制代码


回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-17 16:21:57 | 显示全部楼层
  1. html.append("<table width='250' valign='center' align='center'><tr><td width='100%' align='center'>");
  2.                         html.append("<b>").append(errorMsg).append("</b>");
  3.                         html.append("</td></tr></table>");
  4.                         response.getWriter().write(html.toString());
  5.                         return;
  6.                 }
  7.                 chain.doFilter(request, response);
  8.         }
  9.         /**
  10.          * 判断传入的rpt参数是否合法,指定的报表是否存在
  11.          * @param rpt 请求的rpt参数
  12.          * @return
  13.          */
  14.         protected boolean isReportExist(String rpt){
  15.                 //TODO 可自定义实现该方法
  16.                 return true;
  17.         }
  18.         /**
  19.          * 判断用户是否有权对某张报表进行指定操作
  20.          * @param userId 用户ID
  21.          * @param rpt 报表
  22.          * @param function 功能点
  23.          * @return
  24.          */
  25.         protected boolean hasRight(String userId, String rpt, int function) {
  26.                 //TODO 需根据系统权限分配,自定义实现该方法
  27.                 return true;
  28.         }
  29.         public void init(FilterConfig fConfig) throws ServletException {
  30.                 //TODO
  31.         }
  32. }
复制代码


回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-17 16:27:56 | 显示全部楼层
2.将这个fiter类打成jar包复制到皕杰报表web环境/web-inf/lib下
3.打开皕杰报表web环境/web-inf/下的web.xml,添加fiter
  1. <filter>
  2.                 <filter-name>reportFilter</filter-name>
  3.                 <filter-class>bios.report.dev.examples.filters.ReportAccessFilter</filter-class>
  4.         </filter>
  5.         <filter-mapping>
  6.                 <filter-name>reportFilter</filter-name>
  7.                 <url-pattern>/ReportEmitter</url-pattern>
  8.         </filter-mapping>
复制代码


4.一个简单登录验证fiter就创建好了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

本版积分规则

QQ|小黑屋|手机版|皕杰软件 ( 京ICP备14050931号 )

GMT+8, 2024-12-27 08:38 , Processed in 1.096338 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表