2019独角兽企业重金招聘Python工程师标准>>>

出现的过程

最近在用程序模拟一个web站的https登录,然后进行一些后续操作的小玩意。先使用java程序写测试代码,测试通过移植到android。

java基于httpclient-4.3.1.jar开发。

    android端使用自带的HttpClient。(sdk版本14)

    代码移植到android环境,https请求出现403(请求被拒绝),Google N久找不到答案 - -。但是java一次又一次都能成功!

处理方法

最终换jar!使用commons-httpclient-3.1.jar!业务逻辑不变,程序测试通过!

我!很!忧!伤!(java端可以,android端不行。)

(jar是从http://git.oschina.net/atearsan/android-app/tree/master/libs里下的- -,我懒,直接用osc那边的)

同样是403,其他的一些可能情况

我这个情况可能特殊,Google时也发现了其他的一些情况,顺便记录下。

1. 缺少header参数. 常见的如下:

post.addHeader("Referer", xx);
post.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
post.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63");
post.addHeader("Host", xx);

2. 缺少cookie信息.

这个就需要分析实际的请求了。可以借助一些工具分析(http/https/tcp)请求链接,常见的工具有:

Fiddler

Wireshark

还有直接浏览器调式也行,但是可能不够用,请求过程不够清晰

java端和android端部分关键代码

不知道贴出来是否有实际用处,先贴出来吧。

java端:

public void login() {try {List<NameValuePair> loginParams = new ArrayList<NameValuePair>();loginParams.add(new BasicNameValuePair("appuri", appuri));loginParams.add(new BasicNameValuePair("useruri", useruri));loginParams.add(new BasicNameValuePair("service", service));loginParams.add(new BasicNameValuePair("sid", null));loginParams.add(new BasicNameValuePair("uname", name));loginParams.add(new BasicNameValuePair("action", action));loginParams.add(new BasicNameValuePair("pwd", password));HttpPost post = new HttpPost(loginURL);post.addHeader("Referer", referer);post.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");post.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63");post.addHeader("Host", "xxxxxxxxx");post.setEntity(new UrlEncodedFormEntity(loginParams, HTTP.UTF_8));// 发送登录请求HttpResponse response = httpClient.execute(post);if (response.getStatusLine().getStatusCode() == HttpStatus.SC_MOVED_TEMPORARILY) {post.releaseConnection();// 获取重定向地址String location = getLocation(response);if (!"".equals(location)) {String signURL = getSignURL(location);if(!"".equals(signURL)) {signIn(signURL);} else {System.out.println("signURL为空");}} else {System.out.println("location为空");}} else {System.out.println("登录出错了");}} catch (Exception e) {e.printStackTrace();}}

android端的实现:

public void login() {try {/*List<NameValuePair> loginParams = new ArrayList<NameValuePair>();loginParams.add(new BasicNameValuePair("appuri", appuri));loginParams.add(new BasicNameValuePair("useruri", useruri));loginParams.add(new BasicNameValuePair("service", service));loginParams.add(new BasicNameValuePair("sid", ""));loginParams.add(new BasicNameValuePair("uname", name));loginParams.add(new BasicNameValuePair("action", action));loginParams.add(new BasicNameValuePair("pwd", password));HttpPost post = new HttpPost(loginURL);post.addHeader("Referer", referer);post.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");post.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63");post.addHeader("Host", "xxx");post.setEntity(new UrlEncodedFormEntity(loginParams, HTTP.UTF_8));HttpResponse response = httpClient.execute(post);*/HttpClient cc = new HttpClient();PostMethod pm = new PostMethod(loginURL);org.apache.commons.httpclient.NameValuePair[] parametersBody = {new org.apache.commons.httpclient.NameValuePair("appuri", appuri),new org.apache.commons.httpclient.NameValuePair("useruri", useruri),new org.apache.commons.httpclient.NameValuePair("service", service),new org.apache.commons.httpclient.NameValuePair("sid", ""),new org.apache.commons.httpclient.NameValuePair("uname", name),new org.apache.commons.httpclient.NameValuePair("action", action),new org.apache.commons.httpclient.NameValuePair("pwd", password)   };pm.setRequestBody(parametersBody);pm.setRequestHeader("Referer", referer);pm.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");pm.setRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63");pm.setRequestHeader("Host", "xxx");//           int statusCode = response.getStatusLine().getStatusCode();int statusCode = cc.executeMethod(pm);  // 登录请求if (statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {String location = getLocation(pm);    // 获取重定向地址
//              String location = getLocation(response);if (!TUtil.EMPTY.equals(location)) {String signURL = getSignURL(location);if(!TUtil.EMPTY.equals(signURL)) {signIn(signURL);} else {String log = "获取签到地址失败";super.notification(TUtil.TYPE_CM_E_CODE, log);}} else {String log = "获取重定向地址失败";super.notification(TUtil.TYPE_CM_E_CODE, log);}} else {String log = "登录失败.状态码:"+statusCode;super.notification(TUtil.TYPE_CM_E_CODE, log);}} catch (Exception e) {Log.e(e);String log = "登录异常:"+e.getMessage();super.notification(TUtil.TYPE_CM_E_CODE, log);}}

// java端和android代码对比结果:

// 代码真的没啥差异,android端被注释的那些就是使用自带的HttpClient,但是偏偏登录请求一直是403.

// 换成基于commons-httpclient-3.1.jar的HttpClient,没问题了!

//

// 我还有个问题就是:android sdk 14 自带的apche HttpClient是什么年代的版本...??? java端4.3没问题- -

转载于:https://my.oschina.net/atearsan/blog/205517

Android 使用自带的HttpClient进行https请求出现403的解决过程记录相关推荐

  1. HttpClient发送Https请求报 : unable to find valid certification path to requested target

    一.场景   近期在对接第三方接口时,通过HttpClient发送Https请求报 : unable to find valid certification path to requested tar ...

  2. Android——自建CA证书,实现https请求

    Android 使用https 协议请求客户端 server端操作 自己创建 CA 证书 拿自建CA 证书创建 server 端证书 创建 https 服务 Android客户端操作 创建项目并引入相 ...

  3. 用HttpClient发送HTTPS请求报SSLException: Certificate for <域名> doesn‘t match any of the subject alternative

    目录 1:HttpClient 的https证书验证请求问题 2: post请求示例 3: get请求示例 1:HttpClient 的https证书验证请求问题 最近用http 推送,用apache ...

  4. Java使用HttpClient发送Https请求证书失效:PKIX path building failed:

    最近使用HttpClient对接第三方短信接口,在进行本地测试时报了一个证书失效的错误. 1. 封装的HttpClient的Post请求 public static Map<String, Ob ...

  5. 关于IOS由于Dropbox被封,https请求不好用的解决办法

    最近研究IOS的In-House安装方法,好不容易申请下来了企业级证书,也使用了Dropbox的网盘来支持苹果的In-House安装方法,也给客户展示了,下载的地址也给客户了.没过几天,坑爹的天朝把D ...

  6. httpclient发起https请求以及获取https返回内容

    工作中的需要,使用Apache httpclient发起获取通过https返回的内容,试了很多网上的解决办法都不行,查阅了Apache httpclient的官方文档,最后终于找出解决方法,分享给需要 ...

  7. 转-HTTPClient调用https请求,通过基本认证用户名密码(Basic Auth)

    转自: https://blog.csdn.net/qq_27605885/article/details/79131483 本文来源是Apache官网例子:http://hc.apache.org/ ...

  8. 如何解决httpclient调用https请求报错

    public static CloseableHttpClient getClient() {SSLContext sslContext = null;try {sslContext = new SS ...

  9. 用HttpClient发送HTTPS请求报SSLException: Certificate for <域名> doesn’t match any of the subject alternativ

    用exchage获取Outlook数据服务是因为证书问题导致,现在需要去除证书验证就可以访问了. ExchangeService service = new ExchangeServiceWithHo ...

最新文章

  1. Intellij IDEA2019项目包分层结构显示设置
  2. 不可不知的C#基础 4. 延迟加载 -- 提高性能
  3. 劲乐团u显示服务器维护,劲乐团9YOU原版服务端架设教程
  4. 和商简智能CEO关于APS的聊后感
  5. 威伦触摸屏和三菱PLC通信
  6. php barcode设置黑条宽度,JsBarcode常用参数设置
  7. shell脚本练习题(编程题)。
  8. 盘点互联网招聘玩法:从垂直招聘到猎头平台到精准匹配
  9. 写一个强化学习训练的gym环境
  10. php获取本机内网ip地址
  11. [转知乎]网易云音乐的歌单推荐算法是怎样的?
  12. 访问2008服务器共享文件很慢,鲜为人知的win2008网络管理优化技巧
  13. echart折线图连线不显示问题总结
  14. introduce yourself in the Interview(面试英语自我介绍)
  15. Filter Solutions 10.0+破解
  16. 小米笔记本Air12.5与Deepin系统体验
  17. 浮点数在计算机的储存方式
  18. 树莓派救援机器人制作
  19. 全国大学生计算机等级考试计算机二级python真题复习链接
  20. build.gradle笔记

热门文章

  1. python3 “from PIL import...“报错
  2. Efficient Graph-Based Image Segmentation
  3. 【星球知识卡片】图像风格化与翻译都有哪些核心技术,如何对其长期深入学习...
  4. 【NLP-ChatBot】搜索引擎的最终形态之问答系统(FAQ)详述
  5. how to fix error 25007 : loadlibraryshim()
  6. axios捕获401 赋值token
  7. ImportError: cannot import name Namespace
  8. 【链表】BZOJ1588: [HNOI2002]营业额统计
  9. 解析利用wsdl.exe生成webservice代理类的详解
  10. bootstrap-实现loading效果