有时需要从其它系统中调用华丹WEB报表,而又需要进行用户权限验证。一种简便的方法是使用url进行用户信息传递,实现单点登录,集成华丹WEB报表平台。那么要如何实现呢?

1、在华丹快速开发平台应用根目录下添加一个代理JSP文件,如requestProxy.jsp,接受用户信息,通过后验证用户对请求参数进行重新封装调用。代码示例如下(需对加密部分进行相应修改):

<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@include file="/charisma/includes/jspHeader.jsp"%>

<%@page import="charisma.web.util.WebKeys"%>

<%@page import="charisma.sys.bean.SysUserInfo"%>

<%@page import="charisma.sys.bean.AppSession"%>

<%@page import="charisma.sys.exception.CharismaException"%>

<%@page import="charisma.sys.util.UserProxy"%>

<%@page import="charisma.sysmng.org.tblbean.ST_SYSUSER"%>

<%@page import="charisma.web.util.WebUtil"%>

<%@page import="charisma.sys.common.CryptHelper"%>

<%

//访问url形如http://192.168.1.2:8080/charisma/integrate/requestProxy.jsp?toUri=system.report.do&subSys=demo&repID=1&selCndID=classid&cnd_classid=A&..&userID=test&passwd=加密的密码串

//密码加密可采用des加密,并加入时间戳增强安全性

String userID = request.getParameter("userID");

SysUserInfo userInfo=(SysUserInfo)session.getAttribute(WebKeys.CUR_USER_INFO_KEY);

if(userInfo==null || !userInfo.getUserID().equals(userID))

{

boolean isValid = true;

String password = request.getParameter("passwd");

String desKey="88888888";//des

password=CryptHelper.desDecrypt(password,desKey);

//密码加密格式:13位时间戳|密码,时间戳在java中通过System.currentTimeMillis()取。也可以用其它方式,如加ip对密码加密。只要业务系统中的加密类与这里对应即可。

int pos=password.indexOf("|");

if(pos==-1)

throw new CharismaException(CharismaException.CLIENT_ERR,"密码串格式错误!");

if(System.currentTimeMillis()-Long.parseLong(password.substring(0,pos))>120000)//超过2分钟,该url失效

throw new CharismaException(CharismaException.CLIENT_ERR,"该访问地址超时失效!");

password=password.substring(pos+1);

//验证密码。

password=CryptHelper.md5Encrypt(password);

ST_SYSUSER sysUser = new UserProxy(WebUtil.createAppSession(request)).getSysUser(userID);

if(sysUser==null)

throw new CharismaException(CharismaException.CLIENT_ERR,"系统中不存在用户"+userID);

if(sysUser.PASSWD==null || sysUser.PASSWD.equals(""))

isValid=true;

else

isValid=sysUser.PASSWD.equals(password);

if(isValid)

{

userInfo=new SysUserInfo();

userInfo.setUserID(userID);

userInfo.setPasswd(password);

session.setAttribute(WebKeys.CUR_USER_INFO_KEY,userInfo); //向session中写用户信息,避免登录!

}

else

throw new CharismaException(CharismaException.CLIENT_ERR,"用户信息验证未通过安全验证,拒绝访问!");

}

String toUri = request.getParameter("toUri");

String urlQueryStr = request.getQueryString();

//去掉toUri参数,toUri参数要放在第一位

int paramsEnd = urlQueryStr.indexOf("&");

if(paramsEnd!=-1)

urlQueryStr = urlQueryStr.substring(paramsEnd+1);

//去掉password参数

int paramsStart = urlQueryStr.indexOf("&password");

if(paramsStart!=-1)

{

paramsEnd = urlQueryStr.indexOf("&",paramsStart+1);

if(paramsEnd!=-1)

urlQueryStr = urlQueryStr.substring(0,paramsStart)+urlQueryStr.substring(paramsEnd);

else

urlQueryStr = urlQueryStr.substring(0,paramsStart);

}

String toUrl = WebUtil.getContextRoot()+"/"+toUri+"?"+urlQueryStr;

response.sendRedirect(toUrl);

//getServletConfig().getServletContext().getRequestDispatcher("/"+toUri).forward(request,response);

%>

2、业务系统中访问华丹智能web报表快速开发平台中的资源时,均通过requestProxy.jsp来访问,并加上参数toUri,userID,password三个参数。

(1)toUri是要访问的资源,如报表system.report.do。

(2)userID是登录用户名。

(3)password是加密的密码,为了安全起见,可以加上时间戳与密码一块加密。

3、在requstProxy.jsp中验证用户合法性,并将访问地址转向。如访问报表demo.1的url是

http://192.168.1.2:8088/charisma/requestProxy.jsp?toUri=system.report.do&subSys=demo&repID=1&selCndIDs=classid&cnd_classid=A&isQuery=1&userID=admin&password=加密的密码

注意上面的toUri=system.report.do后面是&不是?。

通过requstProxy.jsp解析后的url就变成:system.report.do?subSys=demo&repID=1&selCndIDs=classid&cnd_classid=A&isQuery=1

4、除了传递加密密码的方式外,也可以采用向数据库表中写一随机串,并将这个随机串作为requstProxy.jsp的参数进行传递,这样在requstProxy.jsp中,取出这个参数值,并查询数据库,存在则认为是有效登录,同时立刻将该随机串记录删除,确保安全。