HttpClient+NTLM认证
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认证相关推荐
- 关于HttpClient绕过SSL认证以及NTLM认证
前言 本篇文章只涉及本人在工作上使用HttpClient遇到的情况,并不会详细地展开讲如何使用HttpClient. 1. 为什么使用HttpClient? 一开始其实是考虑使用RestTemplat ...
- 如何使用httpclient进行NTLM认证登录
NTLM是微软的一种安全认证机制,有些网站是实用NTLM做的认证登陆,使用httpclient认证后可以发送一些get,post请求.代码是用来自动签到的,重点在于ntml认证. package co ...
- AXIS2客户端代码连接C#web service带ntlm认证
搞了两天的AXIS2连接带ntlm认证的web service,要吐血了,百度一堆,不是故作神秘的讲一大堆,就是代码给一半,装吧.... 国人就是,知道的不愿意说,说也只说一半,不知道的又装知道,真是 ...
- T1187 强制 NTLM 认证
在上一篇文章 一文理解 Windows 身份验证原理 介绍了什么是 NTLM 以及一些利用 NTLM 进行更一步获取权限的方式,其中就有 NTLM 中继. Net-NTLM hash 破解.但实现这些 ...
- 域渗透基础之NTLM认证协议
域渗透基础的两个认证协议ntlm和Kerberos协议是必须总结的~ 这篇简单总结下ntlm协议 晚上写下kerberos 0x01 NTLM简介 NTLM使用在Windows NT和Windows ...
- NTLM认证原理及其过程
windows认证协议主要有以下两种: 基于ntlm的认证方式,主要用在早期的windows工作组环境中,认证的过程也相对比较简单. 另一种是基于Kerberos的认证方式,主要用在域环境中 NTLM ...
- Windows本地认证和NTLM认证
目录 SSP&SSPI Windows认证方式 Windows本地认证 NTLM认证 NTLM v1和NTLM v2的区别 LmCompatibilityLevel
- 基于NTLM认证的中间人攻击(含实战)
文章目录 中间人攻击 0x01 域和工作组 0x02 NTLM认证(Windows) 本地认证 NTLM Hash的生成 网络认证 工作组环境NTLM认证流程 域环境NTLM认证 0x03 域名解析协 ...
- Windows NTLM认证
文章目录 NTLM NTLM工作流程 为何采用NTLM NTLM使用场景 NTLM NTLM工作流程 client本地生成NTLM hash,值为用户密码的hash值. 客户端将用户名以纯文本的方式发 ...
最新文章
- html5如何掷色子,html5 canvas掷骰子(简单,学习基础canvas)
- 微信小程序首页index.js获取不到app.js中动态设置的globalData的原因以及解决方法
- 宿主机访问虚拟机中xampp搭建的站点失败
- 体验Hadoop3.0生态圈-CDH6.1时代的来临
- java睡眠后继续执行_Java线程只能有千个,而Go的Goroutine能有上百万个
- windows10下载
- java sha1_java使用SHA1加密算法详解
- Hemberg-lab单细胞转录组数据分析(三)
- Servlet JSP和Spring MVC初学指南 PDF
- 【解题报告】Jury Meeting (9.8CF div2)
- 数据结构 --- c语言实现双向循环链表
- 将IDM添加到谷歌浏览器
- css3帮助文档,CSS3 最新版参考手册
- 2022年信息安全工程师考试知识点:信息安全法律法规
- 经典:基因组测序数据从头拼接或组装算法的原理
- python命令行调试_Linux 黑乎乎的命令行下,如何调试 Python?
- opengl之glScalef()函数
- 回波损耗、插入损耗、反射系数等概念
- 7、PCIE总线-PCI、PCIE关系及信号定义
- 服务器设在国外的网站,全球70%的“根服务器”设在美国,为避免关网,中国行动在路上!...
热门文章
- 平安证券股票交易接口异常怎么解决?
- 拼多多商品有权重有排名吗,如何提升权重和排名?
- PLC(可编程逻辑控制器)——WPLSoft的基本操作
- mysql采购系统_Max采购管理系统采购管理系统官方下载)V1.2.1.8 MySQL官方版下载 - 下载吧...
- [No000060]冷读热读:读书九问
- 有哪些证件扫描软件?六种值得一试的途径
- 你是个成熟的项目了,该学会自动构建自动部署了
- 浅学了一下销售订单和交货单的关系和创建(小白莫喷)
- 发现wps2009个人版一个bug
- UTONMOS:如何看待初期的元宇宙?