站内搜索
发表回复
收藏 

关于论坛与网站整合注册问题的思路与建议  ~ 精华 

关于论坛与网站整合注册问题的思路与建议

在使用EasyJForum的网站中,一个比较常见的问题是要将论坛与网站的用户进行整合,即统一注册与登录的问题,为了方便大家完成这个任务,从以后的版本起,我们会将用户处理的类 UserDAO.java 的代码包含在安装程序包中,大家可以研读这个类代码,然后结合自己的实际进行整合。

 

此外,对于用户整合的问题,我们有如下思考和建议:

 

1、如果只是与论坛共享用户的话,你只需要将你自己的用户表与论坛的用户表进行同步就可以了,就是将两个表中的相同信息字段进行同步更新,你可以直接对两边的用户表使用JDBC进行操作,或者使用数据库触发器进行同步(这可能是最简单的方法)。EasyJForum 对用户密码采用的是 MD5 加密两次(前后台各一次)。

 

2、如果需要论坛与网站共享 session 的话(就是共享登录),则需要处理跨 context 的 session 问题。如果能够采用技术手段实现不同的 context 共享 session,那当然最好,但这样做的难度比较大,所以我们建议的一般做法是在从网站到论坛互相跳转时实现自动登录,以从网站跳转到论坛为例,你可以修改 login.jsp 文件和 perform.jsp 文件,传递网站的 userID 参数过来(实际可以考虑传递sessionid,然后从session中获取userID,否则会不安全),然后在 perform.jsp 文件处理 "lgn" 动作的地方执行如下类的 doQuickLogin 方法即可:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.hongshee.ejforum.common.AppContext;
import com.hongshee.ejforum.common.CacheManager;

public class MyUserDAO extends EntityDAO 
{
    private static MyUserDAO _dao = null;

    private MyUserDAO()
    {}

    public static MyUserDAO getInstance()
    {
        if (_dao == null)
        {
            _dao = new MyUserDAO();
        }
        return _dao;
    } 
    
    public UserInfo doQuickLogin(String loginUser, String contextName,
                                 HttpServletRequest request) throws Exception
    {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        UserInfo userinfo = null;
        try
        {
            conn = dbManager.getConnection();
            pstmt = conn.prepareStatement(adapter.User_QuickLogin);
            pstmt.setString(1, loginUser);
            rs = pstmt.executeQuery();
            if (rs.next())
            {
             if (isUserLoginedInContextName)  // You must implement it by yourself, Cross Context must be set "true" in web server
                {
        UserInfo userinfo = new UserInfo();
         userinfo.userID = userID;
         userinfo.nickname = rs.getString("nickname");
         userinfo.posts = rs.getInt("posts");
         userinfo.unreadSMs = rs.getInt("unreadSMs");
         userinfo.credits = rs.getInt("credits");
         userinfo.groupID = rs.getString("groupID").charAt(0);
         userinfo.lastVisited = rs.getString("lastVisited");
         userinfo.state = rs.getString("state").charAt(0);

         if (userinfo.groupID <= '9')
         {
             String moderators = CacheManager.getInstance().getModerators();
             if (moderators.indexOf("," + userinfo.userID.toLowerCase() + ",") >= 0)
                 userinfo.groupID = 'M';
         }
                    userinfo.remoteIP = PageUtils.getRemoteAddr(request);

                    // Re-construct session
                    HttpSession sess = request.getSession();
                    // sess.setMaxInactiveInterval(1200);  //1200s, 20 minutes
                    sess.setAttribute("userinfo", userinfo);
                    sess.setAttribute("token", String.valueOf(System.currentTimeMillis())); // 用于安全退出
    
                    Set<HttpSession> sessions = AppContext.getInstance().getSessions();
                    sessions.add(sess);
                        
                    ArrayList<Object> paramList = new ArrayList<Object>();
                    paramList.add(loginUser);
                    this.execUpdateSql(adapter.User_ModLastVisited, paramList, conn);
                }
            }
            return userinfo;
        }
        finally
        {
            dbManager.closeResultSet(rs);
            dbManager.closePStatement(pstmt);
            dbManager.closeConnection(conn);
        }
    }
}    

这段代码的逻辑是这样的:如果某用户在另外一个Context中已经登录,则在论坛中直接创建登录session,其中 isUserLoginedInContextName 需要大家自己实现。

 

大家还有什么问题或者整合成功的经验,可以在这里拿出来供大家分享,谢谢支持!


附件是 2.3 版本的用户处理类源代码,请参考。


附件

您所在的用户组无法下载或查看附件
本论坛开发者 QQ:980766123
我是用这样跳转的,但是有点问题
目录结构:
newobject
        WEB-INF
        ejforum
                WEB-INF
                perform.jsp
        index.jsp
也就是把ejform当作子目录放到我的工程下
在index.jsp的登陆里form定义
<%
String checkFlag = request.getParameter("checkFlag");
if(checkFlag == null || checkFlag.trim() == "") {
    response.sendRedirect("bbs/forward.jsp");
}
%>
<form onsubmit="checkfield(this); return false;" action="bbs/perform.jsp?act=lgn" method="post">
  <input id="fromPath" name="fromPath" type="hidden" value="ejforum/forward.jsp"/>
然后在ejforum里新建forward.jsp
代码如下:
<%@ page contentType="text/html;charset=gbk"%>
<%@ page import="com.hongshee.ejforum.data.UserDAO.UserInfo"%>
<%@ page import="com.hongshee.ejforum.util.PageUtils"%>
<%
    UserInfo userinfo = null;
    userinfo = PageUtils.getSessionUser(request);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<HTML xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>正在进入-请稍候</title>
<script type="text/JavaScript">
    function submitForm() {
        document.subForm.submit();
    }
</script>
</head>
<body>
  <table>
    <tr>
      <td>正在进入-请稍候
      </td>
    </tr>
  </table>
  <form id="subForm" name="subForm" method="post" action="../index.jsp">
<%
if(userinfo==null || userinfo.userID == null || userinfo.userID.trim()=="") {
%>
    <input type="text" id="userID" name="userID" value="" />
<%
} else {
%>
    <input type="text" id="userID" name="userID" value="<%= userinfo.userID %>" />
<%
}
%>
    <input type="text" id="checkFlag" name="checkFlag" value="1" />
    <input type="submit" />
  </form>
</body>
</html>
但是这个有问题,如果是第一次登陆,成功
但是如果注销了,主页依然能获得userID?
不解
还是不很明白你要做什么?你的意思是说注销不成功?
你把 ejforum 放在 newobject 下面不知是什么用意?这样将两个 context 这样混合在一起可能是没有意义的。
黑夜给了我黑色的眼睛,我却用它寻找光明。QQ: 980766123
目录放到哪儿是其次吧
我的context是这样写的
<Context path="" docBase="newproject" debug="0" reloadable="true"/>
<Context path="/ejforum" docBase="ejforum" debug="0" reloadable="true"/>
我是在两个运用之间用request传值

在ejforum里新建jsp,参见二楼forward.jsp
这样登陆了,能够返回来正确的userID

但是,如果注销了的话
ejforum的主页是注销的状态
但是newproject里面还能够取到userID

想法是这样的
8.JPG

步骤:
1,首先进入页面
  checkFlag为空
  进入ejforum的forward.jsp
  读取Session里面userID为空
  返回userID,checkFlag
1.JPG

2,这个时候ejforum也没有登陆
2.JPG

3,用admin登陆
3.JPG

4,forward.jsp返回Session里面的userID
4.JPG
5,这个时候ejforum也同时登陆了
5.JPG

6,在ejforum里退出,可以看到ejforum里已经被注销
6.JPG

7,但是,无论怎么刷新,只要不关闭页面,newproject就能够取到userID
7.JPG
浏览器缓存没有更新的问题,建议你还是按照我们的建议思路来做。
黑夜给了我黑色的眼睛,我却用它寻找光明。QQ: 980766123

我想下载代码

我需要代码啊!可是下载不下来!

hao

feichanghao a heheh
我要这个东西
这个论坛不错,不过为什么作者不把所有的源码都公布出来呢?
一点点反编译看很不爽呀
而亲切最不爽的一点反编译的源码中基本没有注释 看起来很麻烦呀
发表回复
查看积分策略说明

快速回复主题

标题  (可选)
内容

恢复自动保存的数据