HttpClient 403没有权限
场景
接入业务方,判断账号是否能注销
浏览器访问OK
Postman工具不能访问
尝试将浏览器中Header一起请求,也是不能访问
在Postman工具中,去掉https协议成功返回
Java HttpClient常规访问
依赖Jar包
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.39</version>
</dependency>
示例代码
public static void main(String[] args) {
try {
HttpClient httpClient = HttpClientBuilder.create().build();
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(5000).setConnectTimeout(6000).build();
HttpGet httpGet = new HttpGet("https://kjf.**.com/****/****/****?id=1");
httpGet.setConfig(requestConfig);
// Header头加入User-Agent属性
HttpResponse httpResponse = httpClient.execute(httpGet);
int statusCode = httpResponse.getStatusLine().getStatusCode();
if (HttpStatus.OK.value() == statusCode) {
HttpEntity entity2 = httpResponse.getEntity();
String detail = EntityUtils.toString(entity2, "UTF-8");
Object codeObj = JSON.parseObject(detail).get("code");
if (!Objects.isNull(codeObj) && "0".equals(codeObj.toString())) {
System.out.println(codeObj.toString());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
返回结果
403错误描述
HttpResponseProxy{HTTP/1.1 403 Forbidden [Date: Fri, 17 May 2019 16:01:21 GMT, Content-Type: text/html, Transfer-Encoding: chunked, Connection: keep-alive, Vary: Accept-Encoding, Connection: close, X-Via-JSL: b5e46f9,-, Set-Cookie: __jsluid=08783ed48cf583740f5d730fc3d00739; max-age=31536000; path=/; HttpOnly, X-Cache: error] [email protected]}
原因分析
1. 业务方服务器对我们出口IP有限制,比如没有配置白名单等 – 浏览器能访问,随即排除
2. 从代码层面,忽略ssl,实测不可用 – 由于本地忽略ssl代码已回滚,导致不能截图 请参考网友提供解决方案
3. 针对相同Java HttpClient测试代码,业务方(长沙)在本地测试,statusCode返回200;我在本地测试,statusCode始终返回403
4. 由于在Postman中请求没有调通,所以第一时间没有将浏览器请求的Header头信息移植到Java客户端来调用
5. 将本段测试代码发给同事测试,同样返回403
6. 实在没有好的解决办法时,准备推送到测试环境看下返回code是否相同,结果还没部署到测试环境,同事反馈需要加入Header头属性名: User-Agent,属性值: 通过浏览器访问的数据复制过来即可
httpGet.setHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS ***");
HttpClient Header agent访问
在上面示例中加入一行代码即可
总结:
公司对外域名都是https,之前由于一直未对公司https请求返回数据,不清楚底层怎么部署的;通过这种方式测试,主站域名statusCode返回200。403首先想到的是没有权限,可能是业务方部署应用时做了什么限制,防止除浏览器之外的工具刷数据,所以才需要显示指定User-Agent