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. iOS 总结遇到的各种坑儿
  2. 108-学习如何格式化字符串
  3. 如何编写第三方接口_Python接口测试之数据驱动
  4. linux下创建proc文件系统,[转载]Linux下的proc文件系统(转载)
  5. 基于visual Studio2013解决C语言竞赛题之1081shell排序
  6. 阿里云开发大会——体验云效智能代码补全
  7. Java:这是一份全面 详细的 Synchronized关键字 学习指南
  8. android和java中常见 Exception
  9. RuiJi Scraper基础 – RuiJi表达式模型
  10. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_05 IO字符流_1_字符输入流_Reader类FileRead...
  11. 数学建模算法与应用 数理统计
  12. matlab画森林图,R语言meta分析(4)网状Meta 分析
  13. 【渝粤题库】陕西师范大学800010 经济地理学
  14. xposed框架安装使用教程(第一篇)
  15. 通过 jstack 与 jmap 分析一次线上故障
  16. Java实现通过证书访问Https请求
  17. 红蓝对抗——蓝军(CheckList)总结
  18. 解题笔记——NIT 遥远的村庄
  19. 10 种 Python 聚类算法完整操作示例(附代码说明)
  20. 软件安全期末考试试题21SZ回忆版

热门文章

  1. 5G 从人到物的连接
  2. Java有哪些编程语言
  3. 重置 Mac 的 PRAM 和 NVRAM
  4. python画笑脸表情_python
  5. 我的机器学习主线「优化算法」
  6. php微博 百度文库,新浪微博与百度贴吧移动社交功能的竞品分析
  7. MarkDown如何输入数学公式
  8. 2021计算机科学与技术毕业论文,关于计算机科学与技术学院2021届本科生毕业论文(设计)知网检测的通知...
  9. ajax请求-IE缓存处理
  10. Mcafee 8.5i杀毒软件规则配置2008-01-27 19:06mcafee 8.5i杀毒软件规则配置