DisCuz论坛与J2EE网站集成

来源:百度文库 编辑:神马文学网 时间:2024/04/19 02:16:56

DisCuz论坛与网站集成

 

参考文件 http://www.discuz.net/usersguide/advanced_passport.htm#title

 

1)  以admin(admin,admin)身份登陆bbs 点击系统设置 à 扩展设置à 通行证设置

2)  在通行证设置中应用程序URL地址填写网站的地址(http://localhost:8080/mall/

3)  通行证私有密匙(1234567890)

4)  应用程序注册地址(member/regist.shtml)

5)  应用程序登陆地址(member/welcome.shtml)

6)  应用程序推出地址(member/logoff.shtml)

7)  保存退出

 

在Constants中设置参数

//用于discuz登陆验证和通行证

   

public static String DISCUZKEY="1234567890"; //通行密匙   

public static String DZURL="http://localhost:82/discuz/";可改

 

再suning.properties中

web.url=http://localhost:8080/mall/

bbs.url=http://localhost:82/discuz/

 

在网站的登陆程序(在com.arvato.suning.member.web.action.loginAction)中添加

 

查找当前数据库如果参数正确,且用户存在则登陆bbs

 

//设置登陆时所需的参数username,password,time,email是必填的具体的内容见参考文件

//member为会员的模型

       String info = "username=" + member.getNickname() + "&password="

                                          + member.getPassword() + "&time="

                                          + DiscuzPassport.time() + "&email=" + member.getEmail();

 

// Constants.DISCUZKEY是admin在discuz中设置的通行证私有密匙

 

String auth = DiscuzPassport.passport_encrypt(info,

                                          Constants.DISCUZKEY);

 

//disforward为forward的参数 在地址栏中可以得到forward的内容

       String discuzforward = disforward;

 

       String verify = DiscuzPassport.md5("login" + auth

                                          + discuzforward + Constants.DISCUZKEY);

 

       //auth和discuzford一定要经过

 

       auth=URLEncoder.encode(auth, "UTF-8");

                           

       discuzforward=URLEncoder.encode(discuzforward, "UTF-8");

      

//登陆discuz的路径 action ,auth,forward,verifty是必需的不能少,如果错了报Illegal request等错误,祥见参考文件               

       String disurl = PropertiesMgt.getPropertiesKey(Constants.PROPERTIES_FILE_PATH, "bbs.url")+"api/passport.php?action=login&auth=" + auth

                                          + "&forward=" + discuzforward + "&verify=" + verify;

      

 

       //跳转到设置好的路径,注意redirect一定为true

       request.setAttribute("disurl", disurl);

 

       forward = new ActionForward(disurl);

 

       forward.setRedirect(true);

 

       return forward;

 

在网站的注销程序(com.arvato.suning.member.web.action.LoginOffAction)中

 

Member memberModel = (Member) request.getSession().getAttribute(Constants.SESSION_MEMBER_MODEL);

request.getSession().removeAttribute(Constants.SESSION_MEMBER_MODEL);

 

//得到如果注销discuz后跳转的路径             

String discuzforward = request.getParameter("forward");

//得到配置文件中网站所在的ip及路径

String weburl = PropertiesMgt.getPropertiesKey(Constants.PROPERTIES_FILE_PATH, "web.url"); 

//得到配置文件中discuz所在的ip及路径

 

String discuzurl = PropertiesMgt.getPropertiesKey(Constants.PROPERTIES_FILE_PATH, "bbs.url"); 

 

//如果得到了forward则可以设定discuzforward的跳转路径                 

if (discuzforward != null && !discuzforward.equals("")){

                   

discuzforward = weburl+"/member/welcome.shtml";

 

    //verify为discuz注销时需要的通行证包括(logout:action的动作,discuzforward:跳转的路径,Constants. DISCUZKEY admin设置在 discuz的通行证私有密匙);

       

String verify = DiscuzPassport.md5("logout" + discuzforward+ Constants.DISCUZKEY);

 

//disurl为调用discuz注销的实际路径需要 action,forward,discuz路径

String disurl = discuzurl+"api/passport.php?action=logout&auth=&forward="

                            + discuzforward + "&verify=" + verify;

 

return new ActionForward(disurl, true);

}

else{

    return mapping.findForward(Constants.SUCCESS_KEY);

}

 

 

 

package com.arvato.suning.util;

import java.io.IOException;

import java.security.MessageDigest;

import java.util.Date;

import java.util.Random;

import sun.misc.BASE64Decoder;

import sun.misc.BASE64Encoder;

public class DiscuzPassport {

      

       /**

        * 通行证编码

        *

        * @param txt

        * @param key

        * @return

        */

       public static String passport_encrypt(String txt, String key) {

              Random random = new Random();

              int dd = random.nextInt(32000);

              String encryptKey = md5(String.valueOf(dd));

              byte[] keybyte = encryptKey.getBytes();

              byte[] txtbyte = txt.getBytes();

              int ctr = 0;

              int j = 0;

              byte[] tmp = new byte[2 * txtbyte.length];

              for (int i = 0; i < txt.length(); i++) {

                     ctr = ctr == keybyte.length ? 0 : ctr;

                     tmp[j++] = keybyte[ctr];

                     tmp[j++] = xor(txtbyte[i], keybyte[ctr++]);

 

              }

              return new BASE64Encoder().encode(passport_key(tmp, key));