有时需要从其它系统中调用华丹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中,取出这个参数值,并查询数据库,存在则认为是有效登录,同时立刻将该随机串记录删除,确保安全。