1. 程式人生 > >java2: HttpClient,實現登入,請求等操作,session保持

java2: HttpClient,實現登入,請求等操作,session保持

HttpClient,httpclient.jar包中的,我則喜歡折射成類似於dll以用的形式,知道在哪個namespace下

可以從這裡獲取或得到些資訊

實現的目標:

1.模擬登入

2.登入之後,模擬提交請求

關鍵點:

1.session狀態保持

2.頁面隱藏的屬性獲取

之前用HttpURLConnection,但未成功,瓶頸在於沒有繞過session保持上,最終還是使用HttpClient,實現相對容易些

示例程式碼

(程式碼有刪減,不見得能夠跑通,需要修改)

複製程式碼 /**
*
*/package httpclienttest;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import
org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;

import com.alibaba.ccbu.parseelements.ParseTest;

/**
*
@author forward
*
*/publicclass LoginFormDemo {

publicstaticvoid DemoLoginTwo() throws Exception {

DefaultHttpClient httpclient
=new DefaultHttpClient();

HttpGet httpget
=new HttpGet(
);

HttpResponse response
= httpclient.execute(httpget);
HttpEntity entity
= response.getEntity();

System.out.println(
"Login form get: "+ response.getStatusLine());
if (entity !=null) {
entity.consumeContent();
}
System.out.println(
"Initial set of cookies:");
List
<Cookie> cookies = httpclient.getCookieStore().getCookies();
if (cookies.isEmpty()) {
System.out.println(
"None");
}
else {
for (int i =0; i < cookies.size(); i++) {
System.out.println(
"- "+ cookies.get(i).toString());
}
}

// action=xxx&Password=xxxx HttpPost httpost =new HttpPost(
"http://localhost/sss");

List
<NameValuePair> nvps =new ArrayList<NameValuePair>();
nvps.add(
new BasicNameValuePair("LoginId", "xxxx"));
nvps.add(
new BasicNameValuePair("Password", "xxxxx"));
nvps.add(
new BasicNameValuePair("action", "xxxx"));
nvps.add(
new BasicNameValuePair("eventSubmit_doPost", "xxxx"));

httpost.setEntity(
new UrlEncodedFormEntity(nvps, HTTP.UTF_8));

response
= httpclient.execute(httpost);
entity
= response.getEntity();

System.out.println(
"Login form get: "+ response.getStatusLine());
if (entity !=null) {
entity.consumeContent();
}


System.out.println(
"Time now: "+new Date().toString());
System.out.println(
"-------------------1---------------------");
httpget
=new);

System.out.println(
"executing request "+ httpget.getURI());

// Create a response handler ResponseHandler<String> responseHandler =new BasicResponseHandler();
String responseBody
= httpclient.execute(httpget, responseHandler);
// System.out.println(responseBody);
System.out.println(
"Time now: "+new Date().toString());
System.out.println(
"-------------------2---------------------"); // 這裡是為了獲取頁面上的hidden,用來提交的時候繼續使用
hidden
= ParseTest.testTest(responseBody);

System.out.println(csrfToken);

System.out.println(
"Time now: "+new Date().toString());
System.out.println(
"---------------3-post offer begin---------------");
// post offer
httpost
=new HttpPost("host
String keywords
="001autop"+ randomString(4);
nvps
=new ArrayList<NameValuePair>();
// post時,提交的form資訊
nvps.add(
new BasicNameValuePair("action", "xxxxx"));
nvps.add(
new BasicNameValuePair("event_submit_do_process", "submit"));nvps.add(new BasicNameValuePair("topCatFormKey", "58"));
nvps.add(
new BasicNameValuePair("names1", "xxxx"));

nvps.add(new BasicNameValuePair("names2", "9.00"));


httpost.setEntity(
new UrlEncodedFormEntity(nvps, HTTP.UTF_8));

responseHandler
=new BasicResponseHandler();
responseBody
= httpclient.execute(httpost, responseHandler);
// System.out.println(responseBody); writeFile("E:\\result.html", responseBody);

response
= httpclient.execute(httpost);
entity
= response.getEntity();

System.out.println(
"Login form get: "+ response.getStatusLine());
if (entity !=null) {
entity.consumeContent();
}
System.out.println(
"Time now: "+new Date().toString());
System.out.println(
"---------------3-post offer end----------------");
}

/**
* 產生隨機字串
*
*/privatestatic Random randGen =null;
privatestaticchar[] numbersAndLetters =null;
privatestatic Object initLock =new Object();

publicstaticfinal String randomString(int length) {

if (length <1) {
returnnull;
}
if (randGen ==null) {
synchronized (initLock) {
if (randGen ==null) {
randGen
=new Random();
numbersAndLetters
= ("0123456789abcdefghijklmnopqrstuvwxyz"+"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")
.toCharArray();
// numbersAndLetters =
// ("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ").toCharArray(); }
}
}
char[] randBuffer =newchar[length];
for (int i =0; i < randBuffer.length; i++) {
randBuffer[i]
= numbersAndLetters[randGen.nextInt(71)];
// randBuffer[i] = numbersAndLetters[randGen.nextInt(35)]; }
returnnew String(randBuffer);
}

publicstaticvoid writeFile(String path, String content) {
String s
=new String();
String s1
=new String();
try {
File f
=new File(path);
if (f.exists()) {
System.out.println(
"檔案存在");
f.delete();
}
else {

}
System.out.println(
"檔案不存在,正在建立...");
if (f.createNewFile()) {
System.out.println(
"檔案建立成功!");
}
else {
System.out.println(
"檔案建立失敗!");
}
BufferedReader input
=new BufferedReader(new FileReader(f));

while ((s = input.readLine()) !=null) {
s1
+= s +"\n";
}
// System.out.println("檔案內容:" + s1); input.close();
s1
+= content;

BufferedWriter output
=new BufferedWriter(new FileWriter(f));
output.write(s1);
output.close();
}
catch (Exception e) {
e.printStackTrace();
}
}

}
複製程式碼

相關推薦

java2: HttpClient實現登入請求操作session保持

HttpClient,httpclient.jar包中的,我則喜歡折射成類似於dll以用的形式,知道在哪個namespace下 可以從這裡獲取或得到些資訊 實現的目標: 1.模擬登入 2.登入之後,模擬提交請求 關鍵點: 1.session狀態保持 2.頁面隱藏的屬性獲取 之前用HttpURLConne

android下的XMPP對應smack-4.2.1實現登入註冊發單聊加聊天室發群聊簡單功能

1.API地址:點選開啟連結 2.openfire,spark下載:點選開啟連結 3.效果圖 4.引用的JAR: compile files('libs/fscontext.jar') compile files('libs/providerutil

jmeter通過BeanShell 腳本實現對http請求參數的加密

一個 sha 下載源碼 功能 mage 使用 1-1 one 裏的 jmeter一直是一款很好的接口和性能測試工具,它是開源的,不需要為此支付任何費用,而且可以下載源碼,可以在修改源代碼並在此基礎上拓展自己的功能或插件,它可以跟ant和jenkins結合起來搭建自己的自動化

js將字串作為函式名呼叫實現input文字框form表單元素回車鍵統一事件響應

  通過給文字框<input enterKey=“fnName” />設定enterKey=“fnName”,頁面載入完後會自動繫結input的keydown事件,捕捉到回車鍵則呼叫fnName函式,如select等其它form元素也可以。要實現form表單元素回車鍵統一事件響應

CentOS7下解決問題 要執行請求操作WordPress 需要訪問您網頁伺服器的許可權。 請輸入您的 FTP 登入XXXX

解決wordpress 安裝刪除主題外掛需要FTP使用者名稱密碼的問題   在伺服器安裝wordpress 後,在後臺自動升級時,或者更新、刪除主題或者外掛的時候,如果提示需要輸入FTP賬戶資訊,然而即使我們正確輸入了FTP使用者名稱和密碼也無法完成升級,這個是伺服器端的許可權設定問

Mybatis Blob和String互轉實現檔案上傳

這樣的程式碼網上有很多,但是本人親測有bug, 下面是我寫的程式碼。望參考 1 @MappedJdbcTypes(JdbcType.BLOB) 2 public class BlobAndStringTypeHandler extends BaseTypeHandler<String&g

利用Filter與Session實現登入使用者可以訪問資源登入使用者禁止訪問

案例目標 情景:系統中的某些頁面只有在正常登陸後在可以訪問,使用者請求這些頁面是,需要先檢查Session中有無該使用者的資訊,但是在               所有必要的頁面上加上對session的判斷相當麻煩,

spring mvc攔截器實現統計http請求的後臺執行時間

使用兩種方式,實現攔截http請求的後臺執行時間。 廢話不多說直接上程式碼 /** * Http請求時間統計 * 攔截所有請求 */ public class HttpRquestTimeInterceptor extends HandlerInterceptorAdapter { Threa

你必須知道的React的知識點:單向資料流高效能虛擬DOM元件間的資料互動事件與資料的雙向繫結生命週期鉤子fetch:資料請求

1、React除錯工具:React Developer Tools 2、React開發工具:Atom 3、React UI庫:Material-UI / Ant Deaign 4、React適用場景:資料不斷變化的大型應用程式 5、前端UI構建方式:資料模型、UI介面

C#利用HttpWebRequest、HttpWebResponse呼叫12306介面實現登入、查票、買票。

【免責申明】本文只為學習使用,若有用作商業、其他行為,與本人無關。 使用工具 - UI bootstrap - 後臺C# - 外掛 datetimepicker.js,select.js UI介面效果預覽 UI介面原始碼 <!DOCTYPE html&

vue+typescript封裝axios實現取消重複請求

vue-cli3可以直接生成vue+typescript專案,然後對axios進行封裝,實現攔截多次重複請求,並取消。 直接擼程式碼(也是借鑑網上的,做了修改) 在根目錄下新建axios.tool.ts檔案 import Vue from 'vue'; im

es6 實現二叉樹的中序先序後序以及插入刪除操作以及自平衡樹的插入

//二叉樹 class BinarySearchTree { constructor(){ this。root = null this .Node = class { constructor(key){ this。鍵 =鍵入

ssm配置完成shiro實現登入驗證的功能

花了一天時間,算是完成了shiro登入驗證的這一基本功能。 https://www.w3cschool.cn/shiro/andc1if0.html 這個教程可以多看看,核心的基礎功能很重要。 實現shiro 第一步,引入所需要的依賴 在pom.xml檔案中加入 &

ionic3模擬token實現登入攔截

1、在http服務裡面管理token相關資訊    注意:要在每個請求中新增token資訊(和後臺)public post(url: string, params: any = null, successCallback, errorCallback): any { //

廣義表的C++實現(包含建構函式拷貝建構函式解構函式獲取表頭表尾獲取直接後繼操作

資料結構是資料在系統中的物理儲存結構,自己編寫資料結構可以對某種資料結構的物理和邏輯結構有更深的瞭解。 一、廣義表作為一種資料結構有以下的特點: 1. 廣義表是遞迴的; 2. 廣義表的元素可以使廣義表,也可以是值; 3. 廣義表是有序的; 4. 廣義表是有長度有深度的。 二

原生socket實現簡單HTPP請求

#include <windows.h> #include <fstream> #include <WinSock2.h> #pragma comment(lib, "ws2_32.lib") int initWin32Net() {

jsp登入頁面捕獲enter鍵實現登入操作

1、應瞭解,實現方式,即只要鍵盤按鍵按下並釋放,就會進行判斷是否為enter鍵。 2、瞭解如何捕獲enter鍵。 *******************************************jsp**********************************

【centos安裝wordpress】要執行請求操作WordPress 需要訪問您網頁伺服器的許可權。 請輸入您的 FTP 登入XXXX”完美解決方法

方法一: 如果不是自己編譯的LAMP環境,那麼網站的根目錄都會是/var/www/,那麼把wprdpress解壓到此目錄後,執行 sudo chown -R www-data /var/www/wordpresssudo chmod -R 775/var/www/wordpress 這樣就完全解決問題了

使用 Promise 實現任務佇列傳送請求實現最大請求數目限制

核心 設定最大請求數量,當前請求數量,待執行佇列 呼叫時,建立一個新任務,然後判斷是否達到最大請求數量,若達到則將任務追加到待執行佇列,否則,則直接執行該任務。並返回Promise 建立任務時,需要返回一個函式,當該任務開始執行則當前數量加一。當任務執行完畢時使用finally,當前數量減一,並從待執行佇列

Java實現:拋開jieba工具寫HMM+維特比演算法進行詞性標註

一、前言:詞性標註 二、經典維特比演算法(Viterbi) 三、演算法實現 四、完整程式碼 五、效果演示: 六、總結 一、前言:詞性標註   詞性標註(Part-Of-Speech tagging, POS tagging),是語料庫語言學中將語料庫中單詞的詞性按其含義和上下文內容進行標記的文字資料處理技術