2014-03-19 122 views
0

我正嘗試使用wink-client v1.4與Sharepoint RESTful Web服務進行通信。我創建了一個簡單的Java SE Maven項目,可以使用BasicAuthSecurityHandler在Windows上執行此任務。但是,這個相同的項目在Mac OS X上不起作用。我在Mac上收到401 HTTP狀態碼。從Windows運行時,Wink以某種方式使用我的NTLM憑據。我在兩個平臺上都使用JDK 7。如何在Apache Wink客戶端上使用NTLM身份驗證

如何在Apache Wink客戶端上使用NTLM身份驗證?

public String getSharepointInfo() { 
    spUser = "user"; 
    spPassword = "password"; 
    spUri = "https://someSharepointURL/"; 

    ClientConfig clientConfig = new ClientConfig(); 

    Application app = new Application() { 
     public Set<Class<?>> getClasses() { 
      Set<Class<?>> classes = new HashSet<Class<?>>(); 
      classes.add(WinkMOXyJsonProvider.class); 
      return classes; 
     } 
    }; 
    clientConfig.applications(app); 
    BasicAuthSecurityHandler basicAuthSecurityHandler = new BasicAuthSecurityHandler(); 
    basicAuthSecurityHandler.setUserName(spUser); 
    basicAuthSecurityHandler.setPassword(spPassword); 
    clientConfig.handlers(basicAuthSecurityHandler); 
    RestClient client = new RestClient(clientConfig); 
    Resource resource = client.resource(spUri); 

    ClientResponse response = resource.accept("*/*").get(); 

    String blah = response.getEntity(String.class); 
    System.out.println("The response is " + blah); 
    return blah.toString(); 
} 
+0

我已經得到了一個GET請求,在OS X上使用Apache HttpClient v4.0.1進行NTLM身份驗證。我遵循以下鏈接: http://zhangyelei.blogspot.com/2014/03/httpclient-version-conflict -on-was.html。這是至關重要的第一步,因爲在WAS v8.0和v8.5中使用了HttpClient版本。要覆蓋該版本,您必須採取荒謬的措施,例如隔離共享庫。對我來說,這可能是不可行的。 現在,我只需要弄清楚如何在Apache Wink中使用Apache HttpClient v4.0.1。 –

回答

0

我已經想通了。

我的最終目標是創建一個簡單的測試案例,以便將其移植到WebSphere Application Server V8.0。 Apache Wink客戶端無法自行處理NTLM身份驗證。您必須使用單獨的Http客戶端來處理NTLM身份驗證。我選擇了Apache Http Cient v4.0.1,因爲那個bug版本是打包在WAS v8.0中的。重寫提供的版本也是一個巨大的痛苦。這就是爲什麼我沒有選擇更新版本的Apache HttpClient。

所以,這裏是你如何讓Apache的HTTP客戶端V4.0.1處理NTLM身份驗證: 使用下面的依賴關係......

<dependency> 
     <groupId>jcifs</groupId> 
     <artifactId>jcifs</artifactId> 
     <version>1.3.17</version> 
     <type>jar</type> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.wink</groupId> 
     <artifactId>wink-client</artifactId> 
     <version>1.4</version> 
    </dependency> 

我使用com.ibm.ws.prereq.jaxrs。 jar包含在WAS v8.0中以獲得Apache Http Client v4.0.1。這是安裝在我的Maven倉庫中的,我將它指定爲獲取Http Client v4.0.1的依賴項。

請按照步驟here。現在

,眨眼進場:

public int attemptWinkHttpClienGET() { 
    ClientResponse response = null; 
    try { 
     String spUri = "https://some-sharepoint-url/listdata.svc/"; 

     StringBuilder sb = new StringBuilder(); 
     sb.append(spUri).append("UserInformationList").toString(); 

     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     httpClient.getAuthSchemes().register("ntlm",new JCIFSNTLMSchemeFactory()); 
     CredentialsProvider credsProvider = new BasicCredentialsProvider(); 
     NTCredentials ntcred = new NTCredentials("username_here", "password_here", InetAddress.getLocalHost().getHostName(), "domain_here"); 
     credsProvider.setCredentials(new AuthScope("base_url_here_sans_https://", 443, AuthScope.ANY_REALM, "NTLM"), ntcred); 
     httpClient.setCredentialsProvider(credsProvider); 

     org.apache.wink.client.ClientConfig httpClientConfig = new org.apache.wink.client.ApacheHttpClientConfig(httpClient); 
     Application app = new Application() { 
      public Set<Class<?>> getClasses() { 
       Set<Class<?>> classes = new HashSet<Class<?>>(); 
       classes.add(WinkMOXyJsonProvider.class); 
       return classes; 
      } 
     }; 
     httpClientConfig.applications(app); 
     RestClient client = new RestClient(httpClientConfig); 
     Resource resource = client.resource(sb.toString()); 
     response = resource.accept(MediaType.APPLICATION_JSON_TYPE).get(); 
     UserInformationListResponse blah = response.getEntity(UserInformationListResponse.class); 
     Results[] results = blah.getD().getResults(); 
     for (Results result : results) { 
      System.out.println("User Name: " + result.getFirstName() + " " + result.getLastName()); 
     } 
     System.out.println("The response is " + response.getStatusCode()); 
     response.consumeContent(); 
    } catch (UnknownHostException ex) { 
     Logger.getLogger(HttpTest.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    return response.getStatusCode(); 
} 

現在,最後一位。我使用MOXy作爲我的JAXB實現。即使我在應用程序變量中註冊,我也遇到了一些問題。我看到一些傑克遜相關的錯誤。 Apache HttpClient v4.0.1顯然使用Jackons作爲默認值。這是我爲克服這個問題所做的。

添加以下的依賴關係:

<dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-moxy</artifactId> 
     <version>2.0</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-annotations</artifactId> 
     <version>2.4.0-rc2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-jaxrs</artifactId> 
     <version>1.9.13</version> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-xc</artifactId> 
     <version>1.9.13</version> 
    </dependency> 

這裏的WinkMOXyJsonProvider.java

import javax.ws.rs.Consumes; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.ext.Provider; 
import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider; 

@Provider 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public class WinkMOXyJsonProvider extends MOXyJsonProvider { 

} 

我觀察到的字符串結果從SharePoint返回,然後創建一堆MOXY POJO的模仿JSON對象分層結構。

相關問題