我有一个基于JSP、Spring、Hibernate的web应用程序。现在我想整合一个论坛。
我已经阅读了jforum安装和配置指南,这些是我将其集成到web应用程序所需要遵循的步骤吗?如果没有,请让我知道如何集成jforum。
我正在开发一个web应用程序,其中必须集成论坛功能。选择Jforum进行整合。Jforum是Java中的一个开源论坛实现。
我的应用程序是一个spring/JSF应用程序,使用mysql-Db。Jforum有单独的用户表和单独的身份验证机制。为了集成,它提供了单一登录功能和简单的配置。打开"单点登录"功能,Jforum上的登录和注册屏幕将被禁用。Jforum在会话中搜索记录的用户信息的特殊属性,如果用户不在其表中,它将自动创建一个。所有身份验证详细信息将由我的应用程序处理。我还想把Jforum表放在同一个数据库中。
最初的决定是将Jforum代码保留在我的应用程序中,还是将其作为一个单独的应用程序JForum有自己的前端,使用模板、不同的数据库配置文件和不同的风格来实现Jforum管理也必须能够方便地访问我们的管理屏幕。
我决定将论坛代码分开,不要让我们的应用程序代码变得笨拙。但我在配置过程中遇到了很多问题。所以我决定将代码集成到同一个应用程序中。以下是我为此所遵循的步骤。
-
从这里下载jforum-2.1.8 zip
-
将目录重命名为JForum,并将其部署(复制到tomcat的webapp)为一个单独的应用程序(这只是为了安装数据库。)
-
我在和m应用程序相同的数据库中安装了论坛表。如果您想将它们分开,请使用sql命令在mysql中创建所需的数据库:
创建数据库db_name
-
运行tomcat并访问以下网址:
http://localhost:8080/JForum/install.jsp
输入以下内容:
DataBaseType:Mysql
安装类型:新安装
连接类型:JDBC–保留此默认值不需要
数据源名称:
数据库服务器主机名:
数据库端口:3306
数据库名称:数据库名称–此数据库应存在
数据库用户名:
数据库密码:
使用连接池:将其保留为默认值–
网站链接:这应该指向您的应用程序主页。这是jforum中返回到我们的应用程序的唯一一点。根据这一点,jforum上的"返回主页"链接将起作用。
Administrator Username : <jforum admin username>
–确保此用户名与您的应用程序超级管理员用户名相同–这有助于加载管理控制台。
Administrator Password : <jforum admin password>
单击"下一步"开始安装。表格将在技能大师数据库中创建。
您现在可以访问jforum:
http://someip:8080/skillForum/forums/list.page
现在已经安装了数据库表。这很奇怪…但我做上述步骤只是为了安装数据库表。现在我要在我的应用程序中加入jforum代码。这让我对论坛有了更多的控制权。
现在停止tomcat。
将所有jar从已部署的
jforum/web-inf/lib
复制到yourApp/WEB-INF/lib目录
将配置目录从已部署的
jforum/web-inf/config
复制到您的WEB-INF/ directory
(数据库设置将在Webroot/WEB-INF/config/database/mysql/mysql.properties
文件中)将
jforum/template
目录复制到Webroot目录中。实现SSO:
登录后,您必须将"myAppUser
"(或您希望的任何其他)会话属性设置为已登录的用户名。
在应用程序中创建一个单独的SSO类。
package com.myapp.forum;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
public class MyAppSSO implements SSO{
public String authenticateUser(RequestContext request) {
String user = (String)request.getSessionContext().getAttribute(“myAppUser”);
return user;
}
public boolean isSessionValid(UserSession userSession, RequestContext request) {
if(request.getSessionContext().getAttribute(“myAppUser”) != null)
{
return true;
}else{
return false;
}
}
}
当您第一次访问Jforum页面以获得登录用户时,将调用authenticateUser方法,Jforum将调用isSessionValid来频繁检查会话。
会话属性设置在这里很重要。当SSO打开,并且该会话第一次访问Jforum的任何页面时,将调用authenticateUser()
方法来检查登录的用户。如果返回null,则该用户将被视为"匿名者"。如果它返回用户名,将根据jforum_users表的用户名进行验证。如果不存在用户名,那么将在jforum的用户表中插入一个新行,其中username=one在会话中找到,用户将被标记为已登录。
打开skillForum/WEB-INF/config/ SystemGlobals.properties
更改以下属性:
authentication.type = sso
sso.implementation = com.myapp.forum.MyAppSSO
- Web.xml更改:
我们需要集成web.xml文件。
确保在web.xml文件的适当位置有以下内容:
<filter>
<filter-name>clickstream-jforum</filter-name>
<filter-class>
net.jforum.util.legacy.clickstream.ClickstreamFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>clickstream-jforum</filter-name>
<url-pattern>*.page123</url-pattern>
</filter-mapping>
<listener>
<listener-class>net.jforum.ForumSessionListener</listener-class>
</listener>
<!– ******* –>
<servlet>
<servlet-name>jforum</servlet-name>
<servlet-class>net.jforum.JForum</servlet-class>
<init-param>
<param-name>development</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>jforum</servlet-name>
<url-pattern>*.page</url-pattern>
</servlet-mapping>
在你的应用程序中创建一个指向网址的链接:
http://yourApp/forums/list.page
- 取消部署旧的Jforum应用程序
深吸一口气,重新启动tomcat服务器。
现在,您可以从应用程序访问jforum。
您也可以使用url:访问jforum管理控制台
http://localhost:portno/admBase/login.page
(前提是你有超级管理员用户名和jforum管理员用户名相同,并且在会话中)
Jforum与web应用程序的集成
SSO身份验证对用户名有效,但这些验证会在论坛上显示给访问者。一个小技巧是创建另一个版本的SSOUtils.java并修改方法userExists():
public boolean userExists(String username)
{
this.username = username;
this.dao = DataAccessDriver.getInstance().newUserDAO();
this.user = this.dao.findByEmail(username); // yes - username is actually email
this.exists = this.user != null;
return this.exists;
}
这将允许随机显示用户名,但对电子邮件地址进行身份验证。您可能需要调整上述MyAppSSO类,如下所示:
public String authenticateUser(RequestContext request) {
String user = (String)request.getSessionContext().getAttribute("appUser");
String email = (String)request.getSessionContext().getAttribute("appEmail");
// we are exchanging email/user values - but its correct.
request.getSessionContext().setAttribute("email", user);
return email;
}