设为首页 收藏本站
查看: 998|回复: 0

[经验分享] Java访问基于NTLM协议的SharePoint List Web服务的示例!

[复制链接]

尚未签到

发表于 2015-9-28 11:02:15 | 显示全部楼层 |阅读模式
       最近发现Java的HttpClient从4.1版本以后就开始支持NTLM协议了,之前版本是不支持NTLM协议的(但可以通过开源的JCIFS library实现)。由于项目中其他系统(Java)需要调用基于NTLM协议的SharePoint List Web服务,之前是用了一个开源的Http组件JCIFS library实现模拟身份认证的,具体网址如下:http://jcifs.samba.org/src/,这样就可以正常访问SharePoint的列表服务了。
DSC0000.jpg
      本文主要介绍一种代码更为简洁,使用更为简便的基于最新版本HttpClient 4.2.5,该组件下载网址如下:http://hc.apache.org/downloads.cgi, DSC0001.jpg
      如Java程序需要访问SharePoint的自定义列表服务,在浏览器中查看此列表的XML如下图:
   DSC0002.jpg
  需要注意的是此XML的编码方式是采用UTF-8格式的,如采用Dom4j中解析此XML还需要进行特殊的处理,确保文件头是UTF-8格式的,默认并不是此格式,完整的Java示例代码如下:



import java.io.*;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.NTCredentials;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import java.util.Iterator;
import org.dom4j.Document;  
import org.dom4j.Element;  
import org.dom4j.io.SAXReader;  

public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
DefaultHttpClient httpclient = new DefaultHttpClient();
NTCredentials creds = new NTCredentials("UsrName", "PassWord", "my", "contosouat");
httpclient.getCredentialsProvider().setCredentials(AuthScope.ANY, creds);
HttpHost target = new HttpHost("portal.contoso.uat", 80, "http");
// Make sure the same context is used to execute logically related requests
HttpContext localContext = new BasicHttpContext();
// Execute a cheap method first. This will trigger NTLM authentication
HttpGet httpget = new HttpGet("http://portal.contoso.uat/sites/cockpit/_vti_bin/listdata.svc/自定义列表");
//httpget.setHeader("accept", "application/json");
HttpResponse response1 = null;
try {
response1 = httpclient.execute(target, httpget, localContext);
//System.out.print(response1.toString());
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
            e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
            e.printStackTrace();
}
HttpEntity entity1 = response1.getEntity();
try {
delFile("c:/自定义列表.xml");
saveFile("c:/自定义列表.xml",EntityUtils.toString(entity1),false);
SAXReader reader = new SAXReader();
try
{

Document document = reader.read(new File("c:/自定义列表.xml"));


Element rootElm = document.getRootElement();
// 枚举根节点下所有子节点      
for (Iterator ie = rootElm.elementIterator(); ie.hasNext();)
{        
Element element = (Element) ie.next();      
if(element.getName()=="entry")
{
for (Iterator ic = element.elementIterator(); ic.hasNext();)
{      
Element Celement = (Element) ic.next();
if(Celement.getName()=="content")
{
for (Iterator ip = Celement.elementIterator(); ip.hasNext();)
{      
Element Pelement = (Element) ip.next();
for (Iterator ix = Pelement.elementIterator(); ix.hasNext();)
{      
Element Xelement = (Element) ix.next();
if(Xelement.getName()=="人员名称" || Xelement.getName()=="应发工资")
{
System.out.println(Xelement.getName()+":"+Xelement.getData());
}
}
//System.out.println(Pelement.getName());
                                 }
//System.out.println(Celement.getName());
                              }
}
}
}


}catch (Exception e) {
// TODO Auto-generated catch block
                e.printStackTrace();
}


} catch (Exception e) {
// TODO Auto-generated catch block
            e.printStackTrace();
}

}

public static void saveFile(String file, String data, boolean append) throws IOException {
BufferedWriter bw = null;
OutputStreamWriter osw = null;
File f = new File(file);
FileOutputStream fos = new FileOutputStream(f, append);
try {
// write UTF8 BOM mark if file is empty
if (f.length() < 1) {
final byte[] bom = new byte[] { (byte)0xEF, (byte)0xBB, (byte)0xBF };
fos.write(bom);
}
osw = new OutputStreamWriter(fos, "UTF-8");
bw = new BufferedWriter(osw);
if (data != null) bw.write(data);
} catch (IOException ex) {
throw ex;
} finally {
try { bw.close(); fos.close(); } catch (Exception ex) { }
}
}
/**  
* 删除文件  
* @param filePathAndName String 文件路径及名称 如c:/file.xml  
* @param fileContent String  
* @return boolean  
*/  
public static void delFile(String filePathAndName) {   
try {   
String filePath = filePathAndName;   
filePath = filePath.toString();   
java.io.File myDelFile = new java.io.File(filePath);   
myDelFile.delete();   
}   
catch (Exception e) {   
System.out.println("删除文件操作出错");   
e.printStackTrace();   
}   
}   

}
  该代码执行结果如下图:
   DSC0003.jpg
   DSC0004.jpg
  通过以上步骤就可以正常访问SharePoint的列表并可以进行正常解析数据,可以根据以上代码进一步扩展和完善,以满足实际需求。
  

本博客为软件人生原创,欢迎转载,转载请标明出处:http://www.cnblogs.com/nbpowerboy/archive/2013/05/19/3086579.html 。演绎或用于商业目的,但是必须保留本文的署名软件人生(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-119908-1-1.html 上篇帖子: SharePoint 部件通过EditorPart自定义属性面板 下篇帖子: SharePoint 2010 自定义 字段 类型--------省市区联动
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表