问题描述
项目准备整合 discuz, 因此下了个 discuz x2. 整合使用的是 http://code.google.com/p/discuz-ucenter-api-for-java/ 这儿的代码,一切都配好了运行 Jsp_demo.jsp 也显示登陆成功。问题来了:按照我的理解,和 UCenter 登陆通信完后应该可以在响应中输出一个 iframe 或者 script 链到 discuz,里面会发送一个请求到 discuz,discuz 会返还 cookie 的设置,实现跨域登陆,不过这一个 script 该如何构建?按照 http://www.iteye.com/topic/895086 的例子,应该输出类似<script type="text/javascript" src="http://192.168.1.109/bbs/api/uc.php?time=1295926163&code=c8d08KSlEZlDk4tTsjChzRYzZp2EpUierc%2FS3NLnFUviig8HvTnDNymm080JxI8Byl%2F1TW%2FveKQRlR14Io9pvR9eMD1F%2FAH3l1tuzWt3Rw9MQLrK5Lz0q8eMn5%2BAae92YBwwNlWiFWHyfyh%2FzUNC%2FA3HFnEgdX%2F61IwV" reload="1"></script><script type="text/javascript" src="http://www.***.com/api/uc.php?time=1295926163&code=8a5b92lMQgq2AOw7mnIr3hlDJz5NGbKYnePP7987khS40SJquzXL2BYDiBSrTVYGb5XkZw18tc0w4ICeueEL91lLCqC7gMFopnhecbXtMZekpb0%2FRcb7P0eLWmNhlCKF5yb6zbBuT4SyAs8eJ9rBwasUCcohh5Ch475M" reload="1"></script> 的字符串,不过这个字符串该如何构造?另外如果整合的话 discuz 是否有地方统一配置登陆和注册链接,避免自己去修改 discuz 代码? 问题补充:mcgjhn 写道
解决方案
呵呵。。Client e = new Client();1、String result = e.uc_user_login(account, password);返回的的确是如下格式xml文件、抱歉!上面说的太抽了。<?xml version="1.0" encoding="ISO-8859-1"?><root> <item id="0"><![CDATA[259]]></item> <item id="1"><![CDATA[username]]></item> <item id="2"><![CDATA[username]]></item> <item id="3"><![CDATA[email]]></item> <item id="4"><![CDATA[0]]></item></root>但这是必须得,;;discuz提供了一个Client工具类(里面包含了一些解析工具类)、因为你要将result这串xml文件中的有用数据取出来LinkedList<String> rs = XMLHelper.uc_unserialize(result);并放入一个LinkedList<String>的集合中、类似:[uid, username, username, email, 0]、然后从这个集合中取出用户的id,int uid = Integer.parseInt(rs.get(0));、然后获取同步登陆脚步,就是所谓的js脚步,String synLoginScript = e.uc_user_synlogin(login);呵呵,,public String synLogin(String account,String password) throws Exception {Client e = new Client();String result = e.uc_user_login(account, password);//登录LinkedList<String> rs = XMLHelper.uc_unserialize(result);//解析xmlint login = Integer.parseInt(rs.get(0));//取用户idif(login==-1 || login==-2){//自定义判断return null;}return e.uc_user_synlogin(login);//取脚步并返回}
解决方案二:
2、discuz登陆时不会发请求到我的应用来、除非手动配置(这个麻烦且不爽)。 从这个问题上、是否想实现双向同步?有2中情况如下:一、在我的应用登陆(应用向discuz同步:单向同步) 在我的应用登陆时同步登陆discuz并成功执行discuz返回的同步脚本、此刻进入discuz就无需再次登陆了,因为执行了同步脚本。二、在discuz或我的应用登陆(双向同步): 因discuz同步基本基于cookie、所以简单的从cookie入手。 单项同步无非就是去discuz写几个cookie而已、cookie如果写成功、那么进入discuz就无需登陆了、呵呵,既然如此,就双向同步[1,2]【1(我的应用向discuz同步):在我的应用登陆时同步登陆discuz并成功执行discuz返回的同步脚本写cookie,2(discuz向我的应用同步):在discuz登陆时也可以写cookie、在我的应用中取出来就行了】 。。呵呵。。
解决方案三:
网站整合discuz还是挺简单的。。根本不用修改discuz的代码。1、web与forum最好在同一根域名下、这样写cookie才能共享。2、这串字符串是一个同步脚本、不需要自己构造、Ucenter会构造。这串字符串是在你请求同步登陆、或退出成功的时侯Ucenter构造返回给你,你在页面执行这段js脚本即可、这段js脚本目的就是发送一个请求到discuz的某个页面写几个cookie而已、没什么作用。如果写cookie成功、进入论坛自然就不用再登录一次了,,否则进入论坛还是要登录一次的,,,呵呵呵呵,,,3、记着在论坛的根目录下的config.inc.php文件中配置cookie的作用域...4、在Ucenter中有可能需要2个应用并开启同步功能(2个应用可以是一样的)、才能同步成功,