目录
概述:
首先安装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;}