皕杰报表访问控制Filter的演示例子2019-04-17
皕杰报表集成的服务器的时候分为只集成报表环境和皕杰平台两个方式,如果只集成报表环境的时候怎么给这个报表环境添加上登录权限验证。
1. 写fiter类,示例:
package bios.report.dev.examples.filters;
/**
*报表访问控制Filter的演示例子
* @author Bijetsoft.com
*/
public class ReportAccessFilter implements Filter {
/**
* session中的用户ID属性名
*/
private static final String USER_ID = "USER_ID";
/**
*功能点ID,查看报表
*/
private static final int FUNCTION_VIEW = 1;
/**
*功能点ID,导出Excel
*/
private static final int FUNCTION_XLS = 2;
/**
*功能点ID,导出pdf
*/
private static final int FUNCTION_PDF = 3;
/**
*功能点ID,导出word
*/
private static final int FUNCTION_DOC = 4;
/**
*功能点ID,打印报表
*/
private static final int FUNCTION_PRINT = 5;
/**
*请求编码
*/
private static String encode = "GBK";
public ReportAccessFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req =(HttpServletRequest)request;
req.setCharacterEncoding(encode);
String errorMsg = null;
String userId = (String)req.getSession().getAttribute(USER_ID); //获取用户ID,判断是否为登录用户
if(userId == null)
errorMsg = "您无权访问报表系统,请先登录!";
else {
String rpt = req.getParameter("rpt");
if (isReportExist(rpt)) { //判断报表参数是否合法,指定的报表是否存在
//判断用户是否有权对报表进行访问、导出、打印等操作
String output = req.getParameter("emitter");
if((output == null || "tohtml".equalsIgnoreCase(output)) && !hasRight(userId, rpt, FUNCTION_VIEW))
errorMsg = "您无权查看该报表!";
else if("toxls".equalsIgnoreCase(output) && !hasRight(userId, rpt, FUNCTION_XLS))
errorMsg = "您无权进行导出Excel操作!";
else if("topdf".equalsIgnoreCase(output) && !hasRight(userId, rpt, FUNCTION_PDF))
errorMsg = "您无权进行导出PDF操作!";
else if("todoc".equalsIgnoreCase(output) && !hasRight(userId, rpt, FUNCTION_DOC))
errorMsg = "您无权进行导出Word操作!";
else if("print".equalsIgnoreCase(output) && !hasRight(userId, rpt, FUNCTION_PRINT))
errorMsg = "您无权进行打印操作!";
} else {
errorMsg = "指定报表不存在!";
}
}
//无权访问或权限验证出错时,输入提示信息
if(errorMsg != null){
response.setContentType("text/html;charset=" + encode);
StringBuffer html = new StringBuffer();
html.append("〈table width='250' valign='center'
align='center'><tr>〈td width='100%' align='center'>");
html.append("<b>").append(errorMsg).append("〈/b>");
html.append(";lt;/td>〈/tr>〈/table>");
response.getWriter().write(html.toString());
return;
}
chain.doFilter(request, response);
}
/**
*判断传入的rpt参数是否合法,指定的报表是否存在
* @param rpt请求的rpt参数
* @return
*/
protected boolean isReportExist(String rpt){
//TODO可自定义实现该方法
return true;
}
/**
*判断用户是否有权对某张报表进行指定操作
* @param userId用户ID
* @param rpt报表
* @param function功能点
* @return
*/
protected boolean hasRight(String userId, String rpt, int function) {
//TODO需根据系统权限分配,自定义实现该方法
return true;
}
public void init(FilterConfig fConfig) throws ServletException {
//TODO
}
}
2. 将这个fiter类打成jar包复制到皕杰报表web环境/web-inf/lib下
3. 打开皕杰报表web环境/web-inf/下的web.xml,添加fiter
<filter>
<〈filter-name>reportFilter</filter-name>
<filter-class>bios.report.dev.examples.filters.ReportAccessFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>reportFilter</filter-name>
<url-pattern>/ReportEmitter</url-pattern>
</filter-mapping>
4. 一个简单登录验证fiter就创建好了。