2017-12-15 16 views
1

Javaアプリケーション(FileNet P8のイベントアクションハンドラ)からコンテンツナビゲータのPluginServiceにアクセスしようとしています。アプリケーションはJAXRSログオンサービスを使用してContent Navigatorサーバからsecurity_tokenを受信します。しかし、私がPluginServiceを呼び出そうとすると、私のログインが切れたという応答が得られます。外部アプリケーションからコンテンツナビゲータにログイン

このコードブロックで説明したように、私は、セキュリティトークンを取得することができるよ:

URL logonUrl = new URL("http://icn-host:9081/jaxrs/logon" 
    + "?userid=user" 
    + "&password=password" 
    + "&desktop=admin" 
    + "&contextPath=%2Fnavigator"); 
HttpURLConnection logonConnection = (HttpURLConnection)logonUrl.openConnection(); 
logonConnection.setRequestMethod("POST"); 
logonConnection.setRequestProperty("Content-Type", 
    "application/x-www-form-urlencoded"); 
logonConnection.setDoOutput(true); 
InputStream logonResponse = logonConnection.getInputStream(); 
String responseText = IOUtils.toString(logonResponse, "UTF-8") 
    .replaceFirst("^\\{}&&", ""); 
JSONObject responseJson = JSONObject.parse(responseText); 
return (String)responseJson.get("security_token"); 

しかし、私は別の要求をしようとするとき、私はエラーレスポンスを得る:

URL requestUrl = new URL("http://icn-host:9081/plugin.do" 
    + "?plugin=myPlugin&action=myPluginService&myRequestProps=foobar"); 
HttpURLConnection requestConnection = 
    (HttpURLConnection)requestUrl.openConnection(); 
requestConnection.setRequestMethod("GET"); 
String securityToken = getSecurityToken(); // calls above code 
requestConnection.setRequestProperty("security_token", securityToken); 
equestConnection.setDoOutput(true); 
InputStream responseStream = requestConnection.getInputStream(); 
String responseText = IOUtils.toString(responseStream, "UTF-8") 
    .replaceFirst("^\\{}&&", ""); 
log.info("response was: " + responseText); 

私はいつも次の応答を得ます:

{ 
    "messagesEncoded":true, 
    "errors": [ 
    { 
     "adminResponse":null, 
     "moreInformation":null, 
     "explanation":"Your session expired because of inactivity.", 
     "number":"1003", 
     "userResponse":"Log in again.", 
     "text":"Your session expired." 
    } 
    ] 
} 

私はまた、クッキーを設定しようとしましたが、成功しませんでした。

java.net.CookieManager cookieManager = new java.net.CookieManager(); 
Map<String, List<String>> headerFields = logonConnection.getHeaderFields(); 
List<String> cookiesHeader = headerFields.get("Set-Cookie"); 
if (cookiesHeader != null) { 
    for (String cookie : cookiesHeader) { 
    cookieManager.getCookieStore().add(null, HttpCookie.parse(cookie).get(0)); 
    } 
} 

// ... 

StringBuilder cookieHeader = new StringBuilder(); 
List<HttpCookie> cookies = cookieManager.getCookieStore().getCookies(); 

for (int i = 0; i < cookies.size(); i++) { 
    if (i > 0) { 
    cookieHeader.append(";"); 
    } 

    HttpCookie cookie = cookies.get(i); 
    log.info("Cookie " + i + ": " + cookie.toString()); 
    cookieHeader.append(cookie.toString()); 
} 

requestConnection.setRequestProperty("Cookie", cookieHeader.toString()); 

私はコンテンツNavigatorウィンドウでのXMLHttpRequestを使用して要求を複製しようとしましたが、期待どおりに動作します:

var xhr = new XMLHttpRequest(); 
xhr.open("GET", "plugin.do" + 
    "?plugin=myPlugin" + 
    "&action=myPluginService" + 
    "&myRequestProps=foobar"); 
xhr.setRequestHeader("security_token", ecm.model.Request._security_token); 
xhr.send(); 

答えて

2

私は自動化していたところ、私は数ヶ月前に、クライアントのために同様の課題がありましたプラグインのインストールとCIの設定の適用プロセス

私は、セッションが「有効」になるためにログインした後、最初のapiコールとしてデスクトップを取得することが重要であることを発見しました。

最初にjaxrs/logon、次にjaxrs/getDesktopと入力すると、サービスが呼び出されます。

ちょっとした傍点:コンテナ管理の認証を後で行う予定がある場合、プロセスは異なります。 jaxrs/logonは機能しません。代わりに、jaxrs/getDesktopがsecurity_tokenを配信します。

しかし、少し話してください:ICNサービスとしてのイベントアクションから両方を使用できる共有ライブラリを使用する方が良い解決策ではないでしょうか?

+0

内容:

私の最終的なコードは次のようになります。それらの間に共有ライブラリを置くことは可能ですか? –

+0

確かに。 ["共有ライブラリ"(https://www.ibm.com/support/knowledgecenter/en/SSAW57_8.5.5/com.ibm.websphere.nd.doc/ae/tcws_sharedlib_create.html)を使用すると、ユーティリティ.jarをFilenetEngine.earとNavigator.earの両方のクラスローダーに追加します。 –

0

共有ライブラリ(Ivoの答えを参照)を使用することは間違いなく最良のアプローチです。jaxrs/getDesktopは私にとってはうまく機能しませんでした。代わりに、Maven Assembly Pluginを使用して、新しいバージョンのorg.apache.httpcomponentsの依存関係を組み込み、リクエストをHttpClientで呼び出します。ナビゲーターとのFileNetが別々のWebSphereインスタンスにインストールされている

CloseableHttpClient httpClient = HttpClients.custom() 
    .setDefaultCookieStore(cookieStore) 
    .setDefaultRequestConfig(requestConfig) 
    .build(); 
HttpUriRequest logonRequest = RequestBuilder.post() 
    .setUri("http://icn-host:9081/navigator/jarxrs/logon") 
    .addParameter("desktop", "admin") 
    .addParameter("contextPath", "/navigator") 
    .addParameter("userid", "icnadmin") 
    .addParameter("password", "password") 
    .build(); 
CloseableHttpResponse logonResponse = httpClient.execute(logonRequest); 
HttpEntity responseEntity = logonResponse.getEntity(); 
String responseText = EntityUtils.toString(responseEntity) 
    .replaceFirst("^\\{}&&", ""); 
JSONObject responseJson = JSONObject.parse(responseText); 
String securityToken = (String) responseJson.get("security_token"); 
HttpUriRequest request = RequestBuilder.get() 
    .setUri("http://icn-host:9081/navigator/plugin.do") 
    .addParameter("plugin", "myPlugin") 
    .addParameter("action", "myPluginService") 
    .addParameter("myRequestProps", "foobar") 
    .addHeader("security_token", securityToken) 
    .build(); 
HttpClientContext context = HttpClientContext.create(); 
CookieStore cookieStore = new BasicCookieStore(); 
context.setCookieStore(cookieStore); 
CloseableHttpResponse response = httpClient.execute(request, context); 
関連する問題