欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用友NC6x单点登录实现——跳转到浏览器或Uclient

程序员文章站 2022-03-08 08:33:01
...

一、实现方案说明

1、主要步骤:

      外部系统实现单点登录NC6x,在外部系统进行登录验证,直接通过用户名访问NC,主要有下面几个步骤:

        (1)使用用户名注册,获取***Key,请求url格式:

                      http://host:port/service/ssoRegServlet?userCode=usercode

                  通过用户名参数请求该url,nc服务端会返回ssoKey值,请求参数还可以跟其他参数,如下:

                        userCode:指定用户编码,该参数必须提供,不能省略;

                        ssoKey:指定用户登录信息的键值,并在登录时提供该值,要求唯一,如果没有提供该值,NC会生成一个ssoKey并在返回的Servlet流中输出该值。

                        busiCenter:指定用户所属的帐套编码,该值可以忽略。如果忽略,并且在多个帐套中都存在userCode用户,那么会让终端用户选择帐套。

                        groupCode:指定登录的集团编码,该值可以忽略。

                        langCode:指定登录的雨中,可以忽略,默认为中文。

         (2)单点登录NC系统访问url基本格式为:

                      登录IE端:

                      http://host:port/login.jsp?ssoKey=key

                      登录UClient端:

                      Uclient://start/http://host:port/?ssoKey=key&uid=usercode

                   其中:url中的key就是第1步中获得的ssoKey值

          (3)配置外部单点登录nc的信任ip:

                    配置文件位置:&{NCHOME}\ierp\sf\ssoConfig.xml

                   <string></string>标签中添加信任ip

<?xml version="1.0" encoding="UTF-8"?><SSOConfig>
	<regTimeOut>200</regTimeOut>
	<authenticator classname="nc.sso.bs.DefaultSSOAuthenticator">
		<listParam key="IPAddress">
		<string>172.20.5.111</string>
		<string>172.20.1.11</string>
		<string>127.0.0.1</string>
</listParam>	
	</authenticator>
</SSOConfig>
           (4)替换文件和增加文件

                     替换 ${nchome}\webapps\nc_web\login.jsp

                     替换${nchome}\webapps\nc_web\WEB-INF\jsp\ncapplet.jsp

                     增加${nchome}\webapps\nc_web\loginnc.jsp, 如果单点登录要求外部系统只通过用户名一次握手登录需要增加该文件,如果外部系统两次握手登录NC,则通

                             过longin.jsp和ssoRegServlet即可实现登录逻辑,无需增加loginnc.jsp

     主要逻辑图如下:

            用友NC6x单点登录实现——跳转到浏览器或Uclient

    

          文件下载:

                login.jsp        

                ncapplet.jsp  

                loginnc.jsp     


<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@ page import="java.net.HttpURLConnection,java.net.URL,java.net.MalformedURLException,java.io.IOException,java.io.BufferedReader,java.io.InputStreamReader"%>

<script language="JavaScript">
var scheme = "<%=request.getScheme()%>"; //传输协议
var servername = "<%=request.getServerName()%>"; //NC主机地址
var serverport = "<%=request.getServerPort()%>"; //NC主机端口
var usercode = "<%=request.getHeader("oam_remote_user")%>";//当前登录用户 NC中需存在该编码
var ncurloo= "Uclient://start/" + scheme + "://" + servername + ":" + serverport ;
var ncurl = scheme + "://" + servername + ":" + serverport ;
var xmlHttp;
var key;	

window.onload = getMHsskey;
//创建ajax异步请求对象
function createXMLHttpRequest(){   
	var code = usercode;
     if(window.ActiveXObject){   
      	xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");   
     }else if(window.XMLHttpRequest){   
      	xmlHttp=new XMLHttpRequest();   
     }   
   }
//在NC中注册单点登录所使用的sskey***
function doRequestUsingGET(usercode){  	 
    createXMLHttpRequest();   
	//如果存在多个账套,应该加上以下代码&busiCenter=3 3指的就是账套编码
	var queryString=ncurl+"/service/ssoRegServlet?userCode="+usercode+"&busiCenter=002";	
    xmlHttp.onreadystatechange = handleStateChange;   	
    xmlHttp.open("GET",queryString,false);  	
    xmlHttp.send(null);	
}
//将得到的NC***赋值到变量key,用于单点登录NC系统使用
function handleStateChange(){ 	
    if(xmlHttp.readyState==4){   
      if(xmlHttp.status==200){          
       	key=xmlHttp.responseText;
      }else{
		//key=xmlHttp.responseText;
	  }
    }   
 }
 //单点登录NC系统的方法
function openNC(){
//获取ssokey的值
	doRequestUsingGET(usercode);
	
	var url = ncurloo+"/?ssoKey="+key+"&uid="+usercode;	
	location.href = url;
}
 //访问门户网站的验证码地址。得到验证码   
function getMHsskey(){
        if (null != usercode) { // 已登录OAM
            //做登录处理
           setTimeout(openNC,100);
        } else {
            // 用户未登录
           //setTimeout(openNC,100);
        }
}
</script>
<html>
<body>
</body>
</html>