HttpClient 403没有权限

场景

接入业务方,判断账号是否能注销
浏览器访问OK

浏览器访问示例

Postman工具不能访问

尝试将浏览器中Header一起请求,也是不能访问
Postman请求
在Postman工具中,去掉https协议成功返回
Postman http请求

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
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] org.apache.http.client.entity.DecompressingEntity@439a8f59}

原因分析
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访问

在上面示例中加入一行代码即可
Header agent请求
总结:
公司对外域名都是https,之前由于一直未对公司https请求返回数据,不清楚底层怎么部署的;通过这种方式测试,主站域名statusCode返回200。403首先想到的是没有权限,可能是业务方部署应用时做了什么限制,防止除浏览器之外的工具刷数据,所以才需要显示指定User-Agent

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值