加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 使用NTLM身份验证使用soap服务

发布时间:2020-12-15 02:15:06 所属栏目:Java 来源:网络整理
导读:我试图通过创建NTLM引擎(遵循 http://hc.apache.org/httpcomponents-client-4.3.x/ntlm.html上的说明)来使用NTLM身份验证来使用SOAP服务,实现了AuthSchemeFactory并最终将AuthSchemeFactory注册到我的HTTP客户端.当我使用我的HTTP客户端点击服务时,我得到一
我试图通过创建NTLM引擎(遵循 http://hc.apache.org/httpcomponents-client-4.3.x/ntlm.html上的说明)来使用NTLM身份验证来使用SOAP服务,实现了AuthSchemeFactory并最终将AuthSchemeFactory注册到我的HTTP客户端.当我使用我的HTTP客户端点击服务时,我得到一个响应:“状态代码 – 415,消息 – 服务器无法为请求提供服务,因为媒体类型不受支持.”

任何人都可以告诉我如何解决这个不受支持的媒体问题,以便在Java平台上使用受NTLM保护的SOAP Web服务.使用JCIFS是一个正确的选项来约束NTLM受保护的服务,还是有更好的方法.提前致谢.

DefaultHttpClient httpclient = new DefaultHttpClient();

    httpclient.getAuthSchemes().register(AuthSchemes.NTLM,new JCIFSNTLMSchemeFactory());

    CredentialsProvider credsProvider = new BasicCredentialsProvider();
    NTCredentials ntcred = new NTCredentials("USERNAME","PASSWORD","HOST","DOMAIN");

    credsProvider.setCredentials(new AuthScope("HOST",443,AuthScope.ANY_REALM,"NTLM"),ntcred);

    httpclient.setCredentialsProvider(credsProvider);

    httpclient.getParams().setParameter(
            CoreProtocolPNames.HTTP_CONTENT_CHARSET,"UTF-8");

    Writer writer = new StringWriter();
        writer.write("MY SOAP REQUEST BODY");

    HttpPost httppost = new HttpPost(
            "https://<HOST_NAME>/XiPay30WS.asmx");
    httppost.setEntity(new StringEntity(writer.toString()));

    httppost.setHeader("Content-Type","application/x-www-form-urlencoded");

    HttpResponse httpresponse = httpclient.execute(
                new HttpHost("HOST","https"),httppost,new BasicHttpContext());

    String statusCode = httpresponse.getStatusCode();

解决方法

使用带有FLASK的NTLM Auth实现python实现.

如果你想使用java,运行下面的独立烧瓶代码并通过http请求从java代码调用url(例如POST request / dora / httpWithNTLM)

from flask import  Flask,render_template,flash,request,url_for,redirect,session,Response
import requests,sys,json
from requests_ntlm import HttpNtlmAuth
app = Flask(__name__)




@app.route("/dora/httpWithNTLM",methods=['POST'])
def invokeHTTPReqWithNTLM():
    url =""
    reqData = json.loads(request.data)        
    reqxml=request.data
    headers = {}
    headers["SOAPAction"] = "";
    headers["Content-Type"] = "text/xml"
    headers["Accept"] = "text/xml"
    print("req headers "+str(request.headers))

    r = requests.Request("POST",url,auth=HttpNtlmAuth('domainusername','password'),data=reqxml,headers=headers) 

    prepared = r.prepare()
    s = requests.Session()
    resp = s.send(prepared)
    print (resp.status_code)
    return Response(resp.text.replace("&lt;","<").replace("&gt;",">"),resp.status_code)




if __name__ == '__main__':
    app.run(host="0.0.0.0",port=5001)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读