我有一个基于JSP,Spring,Hibernate构建的 Web 应用程序。现在我想整合一个论坛。
我已经阅读了jforum安装和配置指南,这些是我需要遵循的步骤才能将其集成到我的 Web 应用程序中吗?如果没有,请告诉我如何集成jforum。
我正在开发一个 Web 应用程序,其中必须集成论坛功能。Jforum 被选中进行整合。Jforum 是 Java 中的开源论坛实现。
我的应用程序是使用 mysql 的spring/JSF应用程序 Db.Jforum 具有单独的用户表和单独的身份验证机制。对于集成,它提供了单点登录设施和简单的配置。通过打开“单点登录”功能,Jforum上的登录和注册屏幕将被禁用。Jforum在会话中搜索记录的用户信息的特殊属性,如果用户不在其表中,它将自动创建一个。所有身份验证详细信息将由我的应用程序处理。我还想将Jforum表保存在同一个数据库中。
最初决定是在我的应用程序中保留Jforum代码还是将其作为单独的应用程序保留。 JForum有自己的前端,使用模板、不同的db配置文件和不同的风格来实现。Jforum管理还必须能够轻松访问我们的管理屏幕。
我决定将论坛代码分开,而不是让我们的应用程序代码变得笨拙。但是我在配置过程中遇到了很多问题。所以我决定将它的代码集成到同一个应用程序中。以下是我遵循的步骤。
从这里下载 jforum-2.1.8 zip
将目录重命名为JForum并将其部署(将其复制到 tomcat 的 webapp)最初作为单独的应用程序(这仅用于安装数据库。)
我在与 m 应用程序相同的数据库中安装了论坛表。如果您想将它们分开,请使用 sql 命令在 mysql 中创建所需的数据库:
创建数据库 db_name
运行tomcat并访问以下网址:
http://localhost:8080/JForum/install.jsp
输入以下内容:
数据库类型:Mysql
安装类型:全新安装
连接类型:JDBC - 不需要此默认值
数据源名称:
数据库服务器主机名:
数据库端口:3306
数据库名称:数据库名称 - 该数据库应该存在
数据库用户名:
数据库密码:
使用连接池:将其保留为默认值 -</p>
网站链接:这应该指向您的应用程序的主页。这是 jforum 中唯一返回我们应用程序的点。取决于此,jforum 上的“返回主页”链接将起作用。
Administrator Username : <jforum admin username>
– 确保此用户名与您的 App 超级管理员用户名相同 – 它有助于加载管理控制台。
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:
登录后,您必须将“<code>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 的用户表中插入一个新行,其中用户名 = 在会话中找到的一个,并且用户将被标记为已登录。
打开skillForum/WEB-INF/config/ SystemGlobals.properties
更改以下属性:
authentication.type = sso
sso.implementation = com.myapp.forum.MyAppSSO
我们需要整合 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>
在您的应用程序中创建一个指向 url 的链接:
http://yourApp/forums/list.page
深吸一口气,重启tomcat服务器。
现在您可以从您的应用程序访问 jforum。
您还可以使用 url 访问 jforum 管理控制台:
http://localhost:portno/admBase/login.page
(前提是您的超级管理员用户名和 jforum 管理员用户名相同并且在会话中)
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;
}