热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

通过httpClient模拟登陆并重定向到其他系统

目录概述:首先安装tesseract获取验证码获取验证码的函数重定向ControllerhttpClient模拟登录概述:简单实现一个跨域重

目录

 

概述:

首先安装tesseract

获取验证码

获取验证码的函数

重定向Controller

httpClient模拟登录



概述:

简单实现一个跨域重定向功能。

首先安装tesseract

https://blog.csdn.net/showgea/article/details/82656515

OCR,即Optical Character Recognition,光学字符识别,是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程。对于图形验证码来说,它们都是一些不规则的字符,这些字符确实是由字符稍加扭曲变换得到的内容,但是对于一些复杂的图片识别会有问题。

获取验证码

登录页面找到 获取验证码的地址如下图:

 

http://demo/servlet/captchaCode

 

获取验证码的函数

public static String getCode() {//new一个URL对象URL url;String s="";try {url = new URL("http://demo/servlet/captchaCode");HttpURLConnection conn = (HttpURLConnection)url.openConnection();//设置请求方式为"GET"conn.setRequestMethod("GET");//超时响应时间为5秒conn.setConnectTimeout(5 * 1000);//通过输入流获取图片数据InputStream inStream = conn.getInputStream();//得到图片的二进制数据,以二进制封装得到数据,具有通用性byte[] data = readInputStream(inStream);//new一个文件对象用来保存图片,默认保存当前工程根目录File imageFile = new File("C:\\test\\timg5.jpg");//创建输出流FileOutputStream outStream = new FileOutputStream(imageFile);//写入数据outStream.write(data);//关闭输出流outStream.close();// OCR ITesseract instance = new Tesseract();//设置训练库的位置instance.setDatapath("C:\\test\\");//chi_sim :简体中文, eng根据需求选择语言库instance.setLanguage("eng");String result = null;if(imageFile.exists()) {try {long startTime = System.currentTimeMillis();result = instance.doOCR(imageFile);long endTime = System.currentTimeMillis();System.out.println("Time is:" + (endTime - startTime) + " 毫秒");} catch (TesseractException e) {e.printStackTrace();}System.out.println("=========result:"+result);} else {System.out.print("文件不存在");}return result;} catch (Exception e) {e.printStackTrace();}return null;}

重定向Controller

 

@RequestMapping("/login")public void login(User user,HttpServletResponse response)throws Exception {String userName = user.getName();int password = user.getPassword();//模拟登陆返回结果Map restult = ImitateLogin.HttpClientLogin();//body为获取的html代码String body = (String)restult.get("html");@SuppressWarnings("unchecked")List COOKIEList=(List)restult.get("COOKIEs");//模拟登陆后 ,得到的Header@SuppressWarnings("unused")List headerList =(List)restult.get("headers");;for(Header hd:headerList) {response.setHeader(hd.getName(), hd.getValue());}response.setContentType("text/html;charset=utf-8");//模拟登陆后,得到的COOKIEfor(COOKIE ck:COOKIEList) {javax.servlet.http.COOKIE c= new javax.servlet.http.COOKIE(ck.getName(),ck.getValue());c.setDomain(ck.getDomain());c.setPath(ck.getPath());c.setVersion(ck.getVersion());c.setSecure(ck.getSecure());c.setHttpOnly(true);response.addCOOKIE(c);}response.setStatus(302);// 重定向到第三方网站response.sendRedirect("http://localhost:8080/Thingworx/Runtime/index.html#mashup=dd123");}

httpClient模拟登录

public static Map HttpClientLogin( ) {Map restult &#61; new HashMap<>();String loginUrl &#61; "http://localhost:8080/demo/action-login";String dataUrl &#61; "http://localhost:8080/demo/Runtime/index.html#mashup&#61;dd123";HttpClient httpClient &#61; new HttpClient();httpClient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8");PostMethod postMethod &#61; new PostMethod(loginUrl);NameValuePair[] postData &#61; {new NameValuePair("userid", "Administrator"),new NameValuePair("password", "admin"),new NameValuePair("code", getCode())};//设置登陆密码postMethod.setRequestBody(postData);//设置headerpostMethod.setRequestHeader("Accept","text/html,application/xhtml&#43;xml,application/xml;q&#61;0.9,*/*;q&#61;0.8");postMethod.setRequestHeader("Accept-Encoding:","gzip, deflate");postMethod.setRequestHeader("Accept-Language","zh-CN,zh;q&#61;0.8,zh-TW;q&#61;0.7,zh-HK;q&#61;0.5,en-US;q&#61;0.3,en;q&#61;0.2");postMethod.setRequestHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0");postMethod.setRequestHeader("Connection","keep-alive");postMethod.setRequestHeader("Content-Length","148");postMethod.setRequestHeader("Content-Type","application/x-www-form-urlencoded");postMethod.setRequestHeader("Host","localhost:8080");postMethod.setRequestHeader("Referer","http://localhost:8080/demo/FormLogin/DD");postMethod.setRequestHeader("Upgrade-Insecure-Requests","1");try {//获取登陆后COOKIE&#xff0c;COOKIE中有JSESSIONIDCOOKIE[] COOKIEs &#61; httpClient.getState().getCOOKIEs();StringBuffer stringBuffer &#61; new StringBuffer();for (COOKIE c : COOKIEs) {stringBuffer.append(c.toString() &#43; ";");}//获取登陆后首页数据GetMethod getMethod &#61; new GetMethod(dataUrl);getMethod.setRequestHeader("COOKIE", stringBuffer.toString());postMethod.setRequestHeader("Host", "localhost:8080");postMethod.setRequestHeader("Referer", "http://localhost:8080/demo/Runtime/index.html");postMethod.setRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0");httpClient.executeMethod(getMethod);String html &#61; getMethod.getResponseBodyAsString();Header[] headers &#61; getMethod.getResponseHeaders();List headerList &#61; Arrays.asList(headers);System.out.println(html);//设置返回参数restult.put("html", html);restult.put("COOKIEs", Arrays.asList(COOKIEs));restult.put("headers", headerList);return restult;} catch (Exception e) {e.printStackTrace();}return null;}

 


推荐阅读
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • 本文介绍了在C#中SByte类型的GetHashCode方法,该方法用于获取当前SByte实例的HashCode。给出了该方法的语法和返回值,并提供了一个示例程序演示了该方法的使用。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文介绍了ASP.NET Core MVC的入门及基础使用教程,根据微软的文档学习,建议阅读英文文档以便更好理解,微软的工具化使用方便且开发速度快。通过vs2017新建项目,可以创建一个基础的ASP.NET网站,也可以实现动态网站开发。ASP.NET MVC框架及其工具简化了开发过程,包括建立业务的数据模型和控制器等步骤。 ... [详细]
  • Android源码中的Builder模式及其作用
    本文主要解释了什么是Builder模式以及其作用,并结合Android源码来分析Builder模式的实现。Builder模式是将产品的设计、表示和构建进行分离,通过引入建造者角色,简化了构建复杂产品的流程,并且使得产品的构建可以灵活适应变化。使用Builder模式可以解决开发者需要关注产品表示和构建步骤的问题,并且当构建流程发生变化时,无需修改代码即可适配新的构建流程。 ... [详细]
  • SpringBoot简单日志配置
     在生产环境中,只打印error级别的错误,在测试环境中,可以调成debugapplication.properties文件##默认使用logbacklogging.level.r ... [详细]
author-avatar
mobiledu2502909383
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有