MSw*_*zey 7 java jboss web-services sharepoint-2010 http-status-code-401
在Eclipse IDE中测试时,我的代码成功运行.
我使用生成的Copy.wsdl通过Web服务连接到MS SharePoint 2010
当我在JBoss服务器上部署我的代码(运行Adobe LifeCycle)时,我的代码收到401错误.
错误:
Caused by: org.jboss.ws.WSException: Invalid HTTP server response [401] - Unauthorized
at org.jboss.ws.core.soap.SOAPMessageUnMarshallerHTTP.read(SOAPMessageUnMarshallerHTTP.java:75)
at org.jboss.remoting.transport.http.HTTPClientInvoker.readResponse(HTTPClientInvoker.java:608)
at org.jboss.remoting.transport.http.HTTPClientInvoker.useHttpURLConnection(HTTPClientInvoker.java:402)
at org.jboss.remoting.transport.http.HTTPClientInvoker.makeInvocation(HTTPClientInvoker.java:253)
... 156 more
Run Code Online (Sandbox Code Playgroud)
现在,如果我故意通过IDE使用错误的登录,我会收到此错误:
com.sun.xml.internal.ws.client.ClientTransportException: The server sent HTTP status code 401: Unauthorized
Run Code Online (Sandbox Code Playgroud)
更新:
所以经过更多的研究后发现J2EE支持,缺乏,NTLM就是原因.我已经尝试了几种无法解决的解决方案.
码:
protected void initialize(String username, String password) throws Exception {
System.out.println("initialize()...");
java.net.CookieManager cm = new java.net.CookieManager();
java.net.CookieHandler.setDefault(cm);
Authenticator.setDefault(new SharepointAuthenticator(username, password));
}
Run Code Online (Sandbox Code Playgroud)
认证
public class SharepointAuthenticator extends Authenticator {
private String username = "";
private String password = "";
public SharepointAuthenticator(String username, String password) {
this.username = username;
this.password = password;
System.out.println("Initializing Authentication");
}
@Override
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password.toCharArray());
}
}
Run Code Online (Sandbox Code Playgroud)
获取SOAP
protected CopySoap getCopySoap(String username, String password, String wsdl, String endpoint) throws Exception {
System.out.println("Creating a CopySoap instance...");
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
Copy service = new Copy(new URL(wsdl), new QName("http://schemas.microsoft.com/sharepoint/soap/", "Copy"));
System.out.println("CopySoap 2");
CopySoap copySoap = service.getCopySoap();
System.out.println(endpoint + "\n" + wsdl);
BindingProvider bp = (BindingProvider) copySoap;
bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, username);
bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, password);
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpoint);
return copySoap;
}
Run Code Online (Sandbox Code Playgroud)
调用上传文件:
// make the call to upload
port.copyIntoItems("null", destinationUrlCollection, metadata, byteArray, longHolder, resultHolder);
Run Code Online (Sandbox Code Playgroud)
我正在使用CXF框架来创建端口。它将处理所有类型的身份验证。它也在 JBoss 中工作。
实施起来很简单。添加 CXF 依赖项并使用以下代码创建端口。
示例代码:
IncallingHandlerImpl.java
public class InvocationHandlerImpl implements InvocationHandler
{
CopySoap port;
public InvocationHandlerImpl(CopySoap copySoap) {
port = copySoap;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(port, args);
}
}
Run Code Online (Sandbox Code Playgroud)
TrustingX509TrustManager.java
public class TrustingX509TrustManager implements X509TrustManager
{
/**
* @see javax.net.ssl.X509TrustManager#getAcceptedIssuers()
*/
@Override
public X509Certificate[] getAcceptedIssuers() {
// return null will let jsse accept all certificates!
return null;
}
/**
* @see javax.net.ssl.X509TrustManager#checkClientTrusted(X509Certificate[],String authType)
*/
@Override
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
/**
* @see javax.net.ssl.X509TrustManager#checkServerTrusted(X509Certificate[],String authType)
*/
@Override
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}
Run Code Online (Sandbox Code Playgroud)
SPCopyDriver.java
public class SPCopyDriver
{
public static void main(String[] args) {
JaxWsProxyFactoryBean proxyFactory = new JaxWsProxyFactoryBean();
proxyFactory.setServiceClass(CopySoap.class);
proxyFactory.setUsername("domain\\username");
proxyFactory.setPassword("password");
proxyFactory.setAddress("https://<<IP>>/_vti_bin/Copy.asmx");
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setAutoRedirect(true);
httpClientPolicy.setAllowChunking(false);
Object port = proxyFactory.create();
Client client = ClientProxy.getClient(port);
HTTPConduit httpConduit = (HTTPConduit) client.getConduit();
httpConduit.setClient(httpClientPolicy);
TLSClientParameters tls = new TLSClientParameters();
tls.setDisableCNCheck(true);
tls.setTrustManagers(new TrustManager[] { new TrustingX509TrustManager() });
httpConduit.setTlsClientParameters(tls);
port = Proxy.newProxyInstance(SPCopyDriver.class.getClassLoader(), new Class[] { CopySoap.class }, new InvocationHandlerImpl((CopySoap) port));
CopySoap copySoap = (CopySoap) port;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
844 次 |
| 最近记录: |