1.HttpClient的使用步骤

1)创建HttpClient对象(项目中之前用的是CloseableHttpClient,这个对象无法使用NTLM认证,我换成了DefaultHttpClient)

2)创建请求方法的实例,并指定URL,根据请求方式的不同创建HttpGet或HttpPOST请求

3)如果需要发送请求参数,可以调用HttpGet/HttpPost共同的setParams(HetpParams params)方法来实现,对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。

4)调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。

5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

6. 释放连接。无论执行方法是否成功,都必须释放连接


2.项目中用到的工具类

@Component
public class HttpConnectionManager {

private static final Integer DEFAULT_MAX_TOTAL = 200;
    private static final Integer DEFAULT_MAX_PER_ROUTE = 20;

private final Logger logger = LoggerFactory.getLogger(getClass());

private PoolingHttpClientConnectionManager cm;
    private Registry<ConnectionSocketFactory> registry;
    private ApplicationProperties applicationProperties;

private void init() {
        try {
            SSLContextBuilder builder = SSLContexts.custom();
            builder.loadTrustMaterial(null, (chain, authType) -> true);
            SSLContext sslContext = builder.build();
            SSLConnectionSocketFactory sslSF = new SSLConnectionSocketFactory(
                    sslContext, new String[] { Constants.TLS_V1_PROTOCAL, Constants.SSL_V3_PROTOCAL}, null,
                    NoopHostnameVerifier.INSTANCE);

registry = RegistryBuilder
                    .<ConnectionSocketFactory> create()
                    .register(Constants.HTTP_PROTOCAL, PlainConnectionSocketFactory.INSTANCE)
                    .register(Constants.HTTPS_PROTOCAL, sslSF)
                    .build();

cm = new PoolingHttpClientConnectionManager(registry);
            cm.setMaxTotal(DEFAULT_MAX_TOTAL);
            cm.setDefaultMaxPerRoute(DEFAULT_MAX_PER_ROUTE);

} catch (Exception ex) {
            logger.error("Can't initialize connection manager! Exiting");
            System.exit(FATAL_EXIT_CODE);
        }
    }

public HttpConnectionManager(ApplicationProperties applicationProperties) {
        init();
        this.applicationProperties = applicationProperties;
    }

  

  //这里是我们项目对请求的一个封装,这里请求的URL配置在application.properties中

    public HttpPost defaultProxiedPostRequest(String url, String jsonStr) throws UnsupportedEncodingException {
        if (StringUtils.isBlank(url) || StringUtils.isBlank(jsonStr)) {
            throw new InvalidParameterException("Invalid url or requestJson");
        }

HttpPost request = new HttpPost(url);
        StringEntity se = new StringEntity(jsonStr);
        request.setEntity(se);
        request.setHeader("Accept", "application/json");
        request.setHeader("Content-type", "application/json");
        if (StringUtils.isNotBlank(applicationProperties.getHrgenieHttpProxyHost())) {
            HttpHost proxy = new HttpHost(applicationProperties.getHrgenieHttpProxyHost(), applicationProperties.getHrgenieHttpProxyPort());
            RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
            request.setConfig(config);
        }
        return request;
    }

   

   //获取到HttpClient对象

    public CloseableHttpClient getConnection() {
        CloseableHttpClient httpclient = HttpClients.custom().setConnectionManager(cm).build();
        return httpclient;
    }

}


3.使用HttpClient加入NTLM验证的核心代码

       @SuppressWarnings("deprecation")
public <V, K> V search(K k, Class<V> respClz) {
        String snqUrl = applicationProperties.getSinequa().getUrl();
        Optional<String> reqJson = SearchEngineUtil.objToJson(k);
        HttpPost postReq = null;

        try {

           //利用上面的类对请求做封装

            postReq = httpConnectionManager.defaultProxiedPostRequest(snqUrl, reqJson.get());
        } catch (IOException ex) {
            logger.error("Exception thrown when getting request, exception is:{}", ex);
            throw new BadSearchEngineRequestException("Invalid SINEQUA search request!");
        }

V snqResponse = null;
        //新建一个NTLM对象,前面两个参数是用于验证的用户名和密码
        NTCredentials creds = new NTCredentials(userAu, passAu,"", "");
        // 新建一个httpclient对象,把NTLM验证加入该对象
        DefaultHttpClient httpclient = new DefaultHttpClient();
        httpclient.getCredentialsProvider().setCredentials(AuthScope.ANY, creds);
        
        try (CloseableHttpResponse response = httpclient.execute(postReq)) {
            snqResponse = parseResponse(response, respClz);
        } catch (IOException ex) {
            logger.error("Exception thrown when getting the response, exception is:{}", ex);
            throw new BadSearchEngineResponseException("Invalid SINEQUA search response!");
        }
        return snqResponse;

    }


附加:(用于对象和Json之间相互转换的工具类)

public class SearchEngineUtil {

public static Optional<String> objToJson(Object object) {
        ObjectMapper mapper = new ObjectMapper();
        String jsonStr = null;
        try {
            jsonStr = mapper.writeValueAsString(object);
        } catch (JsonProcessingException ex) {
            ex.printStackTrace();
        }
        return Optional.ofNullable(jsonStr);
    }

public static <T> Optional<T> jsonToObj(String json, Class<T> clz) {
        ObjectMapper mapper = new ObjectMapper();
        T objToRet = null;
        try {
            objToRet = mapper.readValue(json, clz);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return Optional.ofNullable(objToRet);
    }
}

HttpClient+NTLM认证相关推荐

  1. 关于HttpClient绕过SSL认证以及NTLM认证

    前言 本篇文章只涉及本人在工作上使用HttpClient遇到的情况,并不会详细地展开讲如何使用HttpClient. 1. 为什么使用HttpClient? 一开始其实是考虑使用RestTemplat ...

  2. 如何使用httpclient进行NTLM认证登录

    NTLM是微软的一种安全认证机制,有些网站是实用NTLM做的认证登陆,使用httpclient认证后可以发送一些get,post请求.代码是用来自动签到的,重点在于ntml认证. package co ...

  3. AXIS2客户端代码连接C#web service带ntlm认证

    搞了两天的AXIS2连接带ntlm认证的web service,要吐血了,百度一堆,不是故作神秘的讲一大堆,就是代码给一半,装吧.... 国人就是,知道的不愿意说,说也只说一半,不知道的又装知道,真是 ...

  4. T1187 强制 NTLM 认证

    在上一篇文章 一文理解 Windows 身份验证原理 介绍了什么是 NTLM 以及一些利用 NTLM 进行更一步获取权限的方式,其中就有 NTLM 中继. Net-NTLM hash 破解.但实现这些 ...

  5. 域渗透基础之NTLM认证协议

    域渗透基础的两个认证协议ntlm和Kerberos协议是必须总结的~ 这篇简单总结下ntlm协议 晚上写下kerberos 0x01 NTLM简介 NTLM使用在Windows NT和Windows ...

  6. NTLM认证原理及其过程

    windows认证协议主要有以下两种: 基于ntlm的认证方式,主要用在早期的windows工作组环境中,认证的过程也相对比较简单. 另一种是基于Kerberos的认证方式,主要用在域环境中 NTLM ...

  7. Windows本地认证和NTLM认证

    目录 SSP&SSPI Windows认证方式 Windows本地认证 NTLM认证 NTLM v1和NTLM v2的区别 LmCompatibilityLevel

  8. 基于NTLM认证的中间人攻击(含实战)

    文章目录 中间人攻击 0x01 域和工作组 0x02 NTLM认证(Windows) 本地认证 NTLM Hash的生成 网络认证 工作组环境NTLM认证流程 域环境NTLM认证 0x03 域名解析协 ...

  9. Windows NTLM认证

    文章目录 NTLM NTLM工作流程 为何采用NTLM NTLM使用场景 NTLM NTLM工作流程 client本地生成NTLM hash,值为用户密码的hash值. 客户端将用户名以纯文本的方式发 ...

最新文章

  1. html5如何掷色子,html5 canvas掷骰子(简单,学习基础canvas)
  2. 微信小程序首页index.js获取不到app.js中动态设置的globalData的原因以及解决方法
  3. 宿主机访问虚拟机中xampp搭建的站点失败
  4. 体验Hadoop3.0生态圈-CDH6.1时代的来临
  5. java睡眠后继续执行_Java线程只能有千个,而Go的Goroutine能有上百万个
  6. windows10下载
  7. java sha1_java使用SHA1加密算法详解
  8. Hemberg-lab单细胞转录组数据分析(三)
  9. Servlet JSP和Spring MVC初学指南 PDF
  10. 【解题报告】Jury Meeting (9.8CF div2)
  11. 数据结构 --- c语言实现双向循环链表
  12. 将IDM添加到谷歌浏览器
  13. css3帮助文档,CSS3 最新版参考手册
  14. 2022年信息安全工程师考试知识点:信息安全法律法规
  15. 经典:基因组测序数据从头拼接或组装算法的原理
  16. python命令行调试_Linux 黑乎乎的命令行下,如何调试 Python?
  17. opengl之glScalef()函数
  18. 回波损耗、插入损耗、反射系数等概念
  19. 7、PCIE总线-PCI、PCIE关系及信号定义
  20. 服务器设在国外的网站,全球70%的“根服务器”设在美国,为避免关网,中国行动在路上!...

热门文章

  1. 平安证券股票交易接口异常怎么解决?
  2. 拼多多商品有权重有排名吗,如何提升权重和排名?
  3. PLC(可编程逻辑控制器)——WPLSoft的基本操作
  4. mysql采购系统_Max采购管理系统采购管理系统官方下载)V1.2.1.8 MySQL官方版下载 - 下载吧...
  5. [No000060]冷读热读:读书九问
  6. 有哪些证件扫描软件?六种值得一试的途径
  7. 你是个成熟的项目了,该学会自动构建自动部署了
  8. 浅学了一下销售订单和交货单的关系和创建(小白莫喷)
  9. 发现wps2009个人版一个bug
  10. UTONMOS:如何看待初期的元宇宙?