Android 使用自带的HttpClient进行https请求出现403的解决过程记录
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的解决过程记录相关推荐
- HttpClient发送Https请求报 : unable to find valid certification path to requested target
一.场景 近期在对接第三方接口时,通过HttpClient发送Https请求报 : unable to find valid certification path to requested tar ...
- Android——自建CA证书,实现https请求
Android 使用https 协议请求客户端 server端操作 自己创建 CA 证书 拿自建CA 证书创建 server 端证书 创建 https 服务 Android客户端操作 创建项目并引入相 ...
- 用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 ...
- Java使用HttpClient发送Https请求证书失效:PKIX path building failed:
最近使用HttpClient对接第三方短信接口,在进行本地测试时报了一个证书失效的错误. 1. 封装的HttpClient的Post请求 public static Map<String, Ob ...
- 关于IOS由于Dropbox被封,https请求不好用的解决办法
最近研究IOS的In-House安装方法,好不容易申请下来了企业级证书,也使用了Dropbox的网盘来支持苹果的In-House安装方法,也给客户展示了,下载的地址也给客户了.没过几天,坑爹的天朝把D ...
- httpclient发起https请求以及获取https返回内容
工作中的需要,使用Apache httpclient发起获取通过https返回的内容,试了很多网上的解决办法都不行,查阅了Apache httpclient的官方文档,最后终于找出解决方法,分享给需要 ...
- 转-HTTPClient调用https请求,通过基本认证用户名密码(Basic Auth)
转自: https://blog.csdn.net/qq_27605885/article/details/79131483 本文来源是Apache官网例子:http://hc.apache.org/ ...
- 如何解决httpclient调用https请求报错
public static CloseableHttpClient getClient() {SSLContext sslContext = null;try {sslContext = new SS ...
- 用HttpClient发送HTTPS请求报SSLException: Certificate for <域名> doesn’t match any of the subject alternativ
用exchage获取Outlook数据服务是因为证书问题导致,现在需要去除证书验证就可以访问了. ExchangeService service = new ExchangeServiceWithHo ...
最新文章
- Intellij IDEA2019项目包分层结构显示设置
- 不可不知的C#基础 4. 延迟加载 -- 提高性能
- 劲乐团u显示服务器维护,劲乐团9YOU原版服务端架设教程
- 和商简智能CEO关于APS的聊后感
- 威伦触摸屏和三菱PLC通信
- php barcode设置黑条宽度,JsBarcode常用参数设置
- shell脚本练习题(编程题)。
- 盘点互联网招聘玩法:从垂直招聘到猎头平台到精准匹配
- 写一个强化学习训练的gym环境
- php获取本机内网ip地址
- [转知乎]网易云音乐的歌单推荐算法是怎样的?
- 访问2008服务器共享文件很慢,鲜为人知的win2008网络管理优化技巧
- echart折线图连线不显示问题总结
- introduce yourself in the Interview(面试英语自我介绍)
- Filter Solutions 10.0+破解
- 小米笔记本Air12.5与Deepin系统体验
- 浮点数在计算机的储存方式
- 树莓派救援机器人制作
- 全国大学生计算机等级考试计算机二级python真题复习链接
- build.gradle笔记
热门文章
- python3 “from PIL import...“报错
- Efficient Graph-Based Image Segmentation
- 【星球知识卡片】图像风格化与翻译都有哪些核心技术,如何对其长期深入学习...
- 【NLP-ChatBot】搜索引擎的最终形态之问答系统(FAQ)详述
- how to fix error 25007 : loadlibraryshim()
- axios捕获401 赋值token
- ImportError: cannot import name Namespace
- 【链表】BZOJ1588: [HNOI2002]营业额统计
- 解析利用wsdl.exe生成webservice代理类的详解
- bootstrap-实现loading效果