背景:

使用httpClient请求某登录型网站,模拟一个操作,一般步骤一个httpclient模式登录-》httpClient模拟操作;

此时发现,每次操作都需要进行一次登录,极其浪费时间,是否可以通过某一方式进行一次登录多次操作,这里提供一种方式,带cookie登录。

登录获取cookie:

    public String loginModel(String username, String password) {
String JSESSIONID = null;
HttpPost httppost = new HttpPost(url);//httppost
try {
List<NameValuePair> para = new ArrayList<NameValuePair>();
para.add(new BasicNameValuePair("password", password));
para.add(new BasicNameValuePair("username", username));//构造表单
httppost.setHeader(
"User-Agent",
"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36");
httppost.setEntity(new UrlEncodedFormEntity(para, "utf-8"));//设置请求体
BasicCookieStore cookieStore = new BasicCookieStore();//建立一个CookieStore
CloseableHttpClient httpClient = HttpClients.custom().setDefaultCookieStore(cookieStore).build();//建立带cookie的httpClient
int statuts_codes = httpClient.execute(httppost).getStatusLine().getStatusCode();//发送请求,发送成功后cookie将存在于cookieStore中
if (statuts_codes == HttpStatus.SC_OK) {//请求成功
List<Cookie> cookies = cookieStore.getCookies();//遍历获取需要的值
for (int i = ; i < cookies.size(); i++) {//获取JSESSIONID
if (cookies.get(i).getName().equals("id")) {
JSESSIONID = cookies.get(i).getValue();
}
}
cookieMap.put("JSESSIONID", JSESSIONID); } else {//请求失败 }
} catch (UnsupportedEncodingException ex) { } catch (IOException ex) { } finally {
httppost.releaseConnection();//释放资源
}
return cookieMap.get("JSESSIONID");
}

创建带有cookie的HttpClient

 public CloseableHttpClient getHttpClients(String username, String password) {
BasicCookieStore cookieStore = new BasicCookieStore();
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
String JSESSIONID = loginModel(username, password);
BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", JSESSIONID);
cookie.setVersion(0);
String domain = Constant.HOOK_URL.substring(0, Constant.HOOK_URL.indexOf(":"));
if (Constant.HOOK_URL.startsWith("http://")) {
domain = Constant.HOOK_URL.substring(Constant.HOOK_URL.lastIndexOf("/") + 1, Constant.HOOK_URL.lastIndexOf(":"));
}
cookie.setDomain(domain);
cookie.setPath(Constant.HOOK_FW);
cookieStore.addCookie(cookie);
//带有cookie的httpclient
return httpClientBuilder.setDefaultCookieStore(cookieStore).build();
}

使用:

public void useCookieHttpClient() {

        CloseableHttpClient httpClient = getHttpClients(user, pass);
HttpPost httppost = new HttpPost(url2);
List<NameValuePair> para = new ArrayList<>();//表单
para.add("键", "值");
httppost.setEntity(new UrlEncodedFormEntity(para, "utf-8"));
httppost.setEntity(new UrlEncodedFormEntity(para, "utf-8"));
CloseableHttpResponse res = httpClient.execute(httppost);
int statuts_codes = res.getStatusLine().getStatusCode();
if (statuts_codes == HttpStatus.SC_OK) {//请求成功
String result = EntityUtils.toString(res.getEntity(), "utf-8");//返回值
} }

HTTPClient实现免登陆请求(带cookie请求)的更多相关文章

  1. 带cookie请求数据

    经常会用到一些采集网上的资源,普通网站很好采,get_file_contents()/c_url(). 有的网站会有登陆后才能采集,需要带cookie请求获取(登陆网站相同方法),下面记录一下使用方法 ...

  2. 利用postman进行接口测试并发送带cookie请求的方法

    做web测试的基本上都用用到postman去做一些接口测试,比如测试接口的访问权限,对于某些接口用户A可以访问,用户B不能访问:比如有时需要读取文件的数据.在postman上要实现这样测试,我们就必要 ...

  3. postman 请求带cookie

    以亚马逊为例,我抓包随便看一个返回是json数据格式的一个接口,比如随便点一个,我的订单 随便找一条,然后复制url过滤 右键,copy下url 将url放入filter过滤: 在postman里面, ...

  4. C# 跨域 请求带cookie

    原文:https://blog.csdn.net/z69183787/article/details/78954325 背景: 别个的项目,要开发App接口,要求用前端AJAX的方式访问接口数据. 后 ...

  5. 如何实现免登陆功能(cookie session?)

    Cookie的机制 Cookie是浏览器(User Agent)访问一些网站后,这些网站存放在客户端的一组数据,用于使网站等跟踪用户,实现用户自定义功能. Cookie的Domain和Path属性标识 ...

  6. Spring Cloud系列之客户端请求带“Authorization”请求头,经过zuul转发后丢失了

    先摆解决方案: 方法一: 方法二: zuul.routes.<routeName>.sensitive-headers= zuul.routes.<routeName>.cus ...

  7. okhttp3带cookie请求

    Request经常都要携带Cookie,上面说过request创建时可以通过header设置参数,Cookie也是参数之一.就像下面这样: Request request = new Request. ...

  8. python请求带cookie

    先获得cookie到文件 import cookielib import urllib2 #设置保存cookie的文件,同级目录下的cookie.txt filename = 'cookie.txt' ...

  9. ajax跨域请求带cookie

    调用网站:a.xxx.com jQuery(document).ready(function () { $.ajax({ type: "get", async: true, url ...

随机推荐

  1. C++ 和 MFC的学习

    1. 在Windows应用程序设计中,既可以使用个C的基本数据类型,也可以使用Windows自定义的数据类型.但要注意,凡是Windows自定义的关键字都要大写. 2. 什么是句柄? 在Windows ...

  2. RabbitMQ--work queues(二)

    封装一个task到一个message,并发送到queue.consumer会去除task并执行这个task. 这里我们简化了操作,发送消息到队列中,consumer取出消息计算里面'.'号有几个就sl ...

  3. 缓存数据库-redis(订阅发布)

    一:Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 c ...

  4. .Net程序集强签名详解

    强签名: 1. 可以将强签名的dll注册到GAC,不同的应用程序可以共享同一dll. 2. 强签名的库,或者应用程序只能引用强签名的dll,不能引用未强签名的dll,但是未强签名的dll可以引用强签名 ...

  5. 读书笔记--C陷阱与缺陷(五)

    第五章 第五章干货也偏少,但是几个练习题还不错,写出来大家分享下: 1.当一个程序异常终止时,程序输出的最后几行常常会丢失,原因是什么? 我们能够采取怎么样的措施来解决这个问题? 答:因为异常终止的程 ...

  6. CVE-2012-1876Microsoft Internet Explorer Col元素远程代码执行漏洞分析

    Microsoft Internet Explorer是微软Windows操作系统中默认捆绑的WEB浏览器.         Microsoft Internet Explorer 6至9版本中存在漏 ...

  7. 题解-python-CodeForces 227B

    用hash解决.我python代码消耗很多内存,好在代码比C++短很多 n = int(raw_input()) mylist = raw_input().split(' ') i = 0 zid = ...

  8. appium----adb shell输入中文/Emoji表情符(ADBKeyBoard)

    前序 “adb shell input textyoyo“ 可以通过adb 输入英文的文本,由于不支持unicode编码,所以无法输入中文,github上有个国外的大神写了个ADBKeyBoard输入 ...

  9. **CI中使用IN查询(where_in)

    注意别漏了$this->db->get(); /** * 匹配用户手机号,返回匹配的用户列表 * @param $column_str 'user_id, user_name, user_ ...

  10. 选择性卸载eclipse安装过的工具

    我们有时候需要卸载eclipse中之前安装的一些工具,而不想全部删除,那就可以采取下面的方式: 打开eclipse,Help->About Eclipse->Installation De ...