从 servlet 访问 FileNet 内容引擎

Posted

技术标签:

【中文标题】从 servlet 访问 FileNet 内容引擎【英文标题】:Access FileNet Content Engine from servlet 【发布时间】:2019-04-19 17:42:23 【问题描述】:

我正在尝试从 servlet 访问 IBM FileNet P8 V5 数据存储,并且需要帮助以正确配置 WebSphere。

我在带有 IBM WebSphere 的 RedHat 7 服务器上全新安装了 FN P8。

我尝试了https://www.ibm.com/support/knowledgecenter/en/SSNW2F_5.0.0/com.ibm.p8.ce.dev.ce.doc/ss_ecl_cews.htm上给出的示例代码

它在普通的 Java 类中运行良好;连接到服务器并检索数据存储名称。

我将代码复制到了一个 servlet,但得到了错误: " com.filenet.api.exception.EngineRuntimeException: FNRCS0005E: SECURITY_INVALID_CREDENTIALS: 不允许访问内容引擎,因为内容引擎 API 库或 Web 服务接口 (WSI) 侦听器找不到所需的安全上下文信息。预期的凭据是在安全上下文中找不到”

按照教程,我需要设置运行时环境。这就是我坚持的地方。我尝试通过 JVM 设置中的 WebSphere 控制台添加 jaas.conf.WebSphere,但显然没有正确执行。

package server;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Iterator;
import javax.security.auth.Subject;
import com.filenet.api.collection.ObjectStoreSet;
import com.filenet.api.core.Connection;
import com.filenet.api.core.Domain;
import com.filenet.api.core.Factory;
import com.filenet.api.core.ObjectStore;
import com.filenet.api.util.UserContext;

/**
 * Servlet implementation class FNTest
 * Ref: https://www.ibm.com/support/knowledgecenter/en/SSNW2F_5.0.0/com.ibm.p8.ce.dev.ce.doc/ss_ecl_cews.htm
 */
//@WebServlet(description = "Test for connection to Filenet", urlPatterns =  "/FNTest" )
@WebServlet("/FNTest")
public class FNTest extends HttpServlet 
    private static final long serialVersionUID = 2L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public FNTest() 
        super();
        // TODO Auto-generated constructor stub
    

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>Filenet Function Test</title></head>");
        out.println("<body>");
        out.println("<h1>Filenet Function Test</h1>");
        out.println("<p>Request server at " + request.getServletPath() + ".</p><hr>");
        out.println("<p>Connecting to Filenet...</p>");
        // Connect to Filenet
        // Set connection parameters; substitute for the placeholders.
        String uri = "http://filenet.myserver.com:9080/wsi/FNCEWS40MTOM/";
        String username = "P8Admin";
        String password = "P8Password";

        // Make connection.   
        Connection conn = Factory.Connection.getConnection(uri);
        Subject subject = UserContext.createSubject(conn, username, password, null);
        UserContext.get().pushSubject(subject);

        try
        
           // Get default domain.
           Domain domain = Factory.Domain.fetchInstance(conn, null, null);
           System.out.println("Domain: " + domain.get_Name());

           // Get object stores for domain.
           ObjectStoreSet osSet = domain.get_ObjectStores();
           ObjectStore store;
           Iterator osIter = osSet.iterator();

           while (osIter.hasNext()) 
           
              store = (ObjectStore) osIter.next();
              System.out.println("Object store: " + store.get_Name());
           
           System.out.println("Connection to Content Engine successful");
        
        finally
        
           UserContext.get().popSubject();
        

        out.println("<p>Completed</p>");
        out.println("</body></html>");
    

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        // TODO Auto-generated method stub
        doGet(request, response);
    


带有 servlet 的应用程序安装在同一台服务器上。

【问题讨论】:

我看到你的 jaas 节为 null,这意味着它将 FileNetP8 作为默认节。当您使用 WSI 端点进行连接时,请尝试使用 FileNetP8WSI 而不是 null。这似乎是一个类似的问题:***.com/questions/15404357/… 在另一篇文章中,我添加了 Java->Process Definition->JVM->JVM Args:-DFileNet.WSI.AutoDetectLTPAToken=true -Dcom.filenet.authentication.token.userid=sso:ltpa。该程序开始运行,直到我注意到第二天它再次给出了同样的错误。进一步的检查表明,如果我在另一个选项卡中登录到 Navigator 或 ACCE,我的 servlet 就会开始工作。显然走错了路。我之前曾尝试使用 FileNetP8 节(根据您的链接,这是默认设置)。让我们试试 FileNetP8WSI ... 使用 FileNetP8WSI 有效!在隐身窗口和其他浏览器中尝试过。谢谢!您为什么不将此作为解决方案发布,以便对其进行标记? 还发布了官方遮阳篷,因此可以接受 【参考方案1】:

我看到您的 jaas 节为 null,这意味着它将 FileNetP8 作为默认节。当您使用 WSI 端点连接时,请尝试使用 FileNetP8WSI 而不是 null。

Subject subject = UserContext.createSubject(conn, username, password, "FileNetP8WSI");

如果您提供 null,它将使用“FileNetP8”,这是用于 IIOP 连接的 jaas 节

【讨论】:

以上是关于从 servlet 访问 FileNet 内容引擎的主要内容,如果未能解决你的问题,请参考以下文章

在 FileNet 内容引擎中仅使用日期查询 DateTime 字段

FileNet 内容引擎 - 物理路径的数据库表

在 Filenet 中获取和更新工作流数据

如何从 FileNet 数据库中提取文档

如何将 Filenet 文档的内容从 word 文档更新为 pdf..?

使用 FileNet Java API 获取其他用户的访问权限