java后台实现模拟登陆

一:原理

  • 客户端访问服务器,服务器通过Session对象记录会话,服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求。
  • 我们通过Chrome浏览器进行网页访问时,服务器会在我们第一次请求时就建立会话生成Session对象,然后给我们的浏览器返回该Session ID,并把Session的ID保存在客户机的Cookie中,如图:
  • 我们的每次请求都带上我们的Cookie,就可以实现会话状态的保持。

 二:代码

package com.****.pjYzm;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.*;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.commons.httpclient.cookie.*;
import java.util.*;
import org.jsoup.*;
import org.jsoup.nodes.*;
import org.jsoup.select.*;import com.****.hlSSLzs.CertificateValidationIgnored;import net.sf.json.JSONObject;import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;/***

Tile:LoginTest.java

*/public class mnLogin {public static String getHTML() throws Exception {String cookie1 = "";String html = "null";//登录urlString loginURL = "https://*************.cn/service/yhdl/doQyLogin";//验证码下载网址String checkCodeURL = "https://*************.cn/service/yzmimage/getImage?0.7215294058433883";//创建浏览器对象//HttpClient httpClient = new HttpClient();//构造httpclient实例并且忽略服务端SSL证书校验ProtocolSocketFactory fcty = new CertificateValidationIgnored();Protocol.registerProtocol("https", new Protocol("https", fcty, 443));HttpClient httpClient=new HttpClient();//先访问验证码页面,获取验证码GetMethod getMethod1 = new GetMethod(checkCodeURL);try {//设置HttpClient接收CookiehttpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);httpClient.executeMethod(getMethod1);//获取访问后的CookieCookie[] cookies1 = httpClient.getState().getCookies();StringBuffer tmpcookies1 = new StringBuffer();for(Cookie c1 : cookies1) {tmpcookies1.append(c1.toString()+";");System.out.println("访问页面cookies : "+c1.toString());cookie1 = tmpcookies1.toString();//cookie1 = c1.toString();}//验证码保存路径/*File storeFile = new File("F:\\img\\vc.jpg");InputStream is = getMethod1.getResponseBodyAsStream();FileOutputStream fos = new FileOutputStream(storeFile);byte[] b = new byte[1024];int n;while((n = is.read(b)) != -1) {fos.write(b,0,n);}is.close();fos.close();*///该处代码是用于验证码自动识别//txtSecretCode = ImagePreProcess.getAllOrc("D:\\java爬虫jar包\\verifycode\\vc.gif");}catch(Exception e) {e.printStackTrace();}System.out.println("测试使用cookie1:"+cookie1);//模拟登录,按实际服务器端要求选用Post 或 Get请求方式PostMethod postMethod = new PostMethod(loginURL);//设置相同的cookiepostMethod.setRequestHeader("cookie",cookie1);//设置登录时需要的信息NameValuePair[] data = {new NameValuePair("qyinputSjhm","d3RkbExPZmxQR2VLZzdQdTU1VTlYdD09"),new NameValuePair("qyinputPwd","YVpzRk8yQ3c2RnE5NUZyTDZyMXkxQT09"),new NameValuePair("djxh","NmpxQVZ3SGpTSGlYWjdWdHFMekQ4blB3bFdpKzMwZnZCcDBjMU9EY0Y1RT0=")};postMethod.setRequestBody(data);try {int statusCode = httpClient.executeMethod(postMethod);html = postMethod.getResponseBodyAsString();System.out.println(statusCode);System.out.println("登陆成功返回报文:"+html);//重定向if(statusCode == 200) { System.out.println("模拟登录成功!");//设置HttpClient接收Cookie,用与浏览器一样的策略httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);//获取登录后的CookieCookie[] cookies = httpClient.getState().getCookies();StringBuffer tmpcookies = new StringBuffer();for(Cookie c : cookies) {tmpcookies.append(c.toString()+";");System.out.println("登录页面cookies : "+c.toString());}cookie1 = tmpcookies.toString();//System.out.println("-------------------------------InformationFrame------------------------------");//进行登录后的操作/**税(费)种认定信息接口调用_cui_xyang*/String urlszrd = "https://*************.cn/service/sfzrd/getSfzrdxxList";//设置登录时需要的信息JSONObject parameters = new JSONObject();parameters.put("rdyxqq", "");parameters.put("rdyxqz", "");parameters.put("djxh", "10115*************747");html = postmothd(urlszrd,parameters,cookie1);System.out.println("税(费)种认定信息接口调用返回报文:"+html);//**获取信用登记返回报文_cui_xyang*//*String urlxydj = "https://*************.cn/service/Ansr/queryxypj?djxh=101151140*****47&nsrsbh=915*************&pjnd=2018";//设置登录时需要的信息NameValuePair[] dataxypj = {new NameValuePair("djxh","1011511******747"),new NameValuePair("nsrsbh","915114****EL0J"),new NameValuePair("pjnd","2018")};html = getMethod(urlxydj,dataxypj,cookie1);System.out.println("信用登记返回报文接口调用返回报文:"+html);/**申报信息接口调用_cui_xyang*/String urlsb = "https://*************.cn/service/sbmx/getSbmxList";//设置需要的信息JSONObject parameterssb = new JSONObject();parameterssb.put("skssqq", "");parameterssb.put("skssqz", "");parameterssb.put("djxh", "10*************");parameterssb.put("nssbrqq", "");parameterssb.put("nssbrqz", "");html = postmothd(urlsb,parameterssb,cookie1);System.out.println("申报信息接口调用返回报文:"+html);/**违章违法信息接口调用_cui_xyang*/String urlwzwf = "https://*************.cn/service/****/wf*****List";//设置登录时需要的信息JSONObject parameterswzwf = new JSONObject();parameterswzwf.put("rqq", "2018-01-01");parameterswzwf.put("rqz", "2019-06-14");html = postmothd(urlwzwf,parameterswzwf,cookie1);System.out.println("违章违法信息接口调用返回报文:"+html);/**欠税信息接口调用_cui_xyang*/String urlqs = "https://*************.cn/service/*****/gz****ist";//设置登录时需要的信息JSONObject parametersqs = new JSONObject();parametersqs.put("rqq", "2018-01-01");parametersqs.put("rqz", "2019-06-14");html = postmothd(urlqs,parametersqs,cookie1);System.out.println("欠税信息接口调用返回报文:"+html);}else {System.out.println("登录失败");}}catch(Exception e) {e.printStackTrace();}return html;}public static String postmothd(String url,JSONObject parameters,String cookie1) throws UnsupportedEncodingException{String html = "";//构造httpclient实例并且忽略服务端SSL证书校验ProtocolSocketFactory fcty = new CertificateValidationIgnored();Protocol.registerProtocol("https", new Protocol("https", fcty, 443));HttpClient httpClient=new HttpClient();//模拟登录,按实际服务器端要求选用Post 或 Get请求方式PostMethod postMethod = new PostMethod(url);//设置相同的cookiepostMethod.setRequestHeader("cookie",cookie1);String toJson = parameters.toString();RequestEntity se = new StringRequestEntity (toJson ,"application/json" ,"UTF-8");postMethod.setRequestEntity(se);postMethod.setRequestHeader("Content-Type","application/json");//默认的重试策略postMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());postMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000);//设置超时时间try{int statusCode = httpClient.executeMethod(postMethod);html = postMethod.getResponseBodyAsString();System.out.println(statusCode);if(statusCode == 200){System.out.println("接口调用成功!"+url);//System.out.println("接口调用返回报文:"+html);}}catch(Exception e){e.printStackTrace();}return html;}public static String getMethod(String url,NameValuePair[] dataxypj,String cookie1){String html = "";//构造httpclient实例并且忽略服务端SSL证书校验ProtocolSocketFactory fcty = new CertificateValidationIgnored();Protocol.registerProtocol("https", new Protocol("https", fcty, 443));HttpClient httpClient=new HttpClient();//模拟登录,按实际服务器端要求选用Post 或 Get请求方式PostMethod postMethod = new PostMethod(url);//设置相同的cookiepostMethod.setRequestHeader("cookie",cookie1);//设置登录时需要的信息postMethod.setRequestBody(dataxypj);try{int statusCode = httpClient.executeMethod(postMethod);html = postMethod.getResponseBodyAsString();if(statusCode == 200){System.out.println("接口调用成功!");System.out.println("接口调用返回报文:"+html);}}catch(Exception e){e.printStackTrace();}return html;}public static void main(String[] args) throws Exception {mnLogin.getHTML();}}

Demo分享链接:

https://download.csdn.net/download/u013310119/11241313

最近准备了一个公众号每天都会推送一些开发中经常遇到的问题解决方法,希望多久关注一下,谢谢支持:


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部