模拟登录访问获取token
当进行访问一个网站都会进行登录相关的操作,在想获取该网站token的时候,可以进行登录后拿到该网站的token 可作为的用途我们可以把网站token拿到,做一些接口进行操作。
本文基于VUE+SpringBoot框架进行开发的后台管理系统上进行模拟登录,验证码解码获取 获取token操作。
后台接口的请求处理 当在使用网站时首先进行login页面的查找,因为有些页面会让我们去get请求,从而在本机浏览器环境下生成Cookie信息,生成原因呢? 就是他在post请求的时候也会去携带Cookie的数据,如下图所示。
有些网站也是很好去模拟登录的,他不需要我们去进行get请求页面生产cookie可以直接进行post数据请求把登录的info信息进行发送过去进行验证登录即可。
在请求网站的时候使用到的代码-> 该环境是在SpringBoot框架下进行操作的。
导入主要使用到的依赖环境
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <parent > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-parent</artifactId > <version > 2.3.1.RELEASE</version > <relativePath /> </parent > <dependencies > <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-web</artifactId > </dependency > <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-test</artifactId > </dependency > </dependencies >
接下来,进行登录页的请求,使用的是restTemplate模板下的exchange方法
1 2 3 4 5 6 7 8 9 ResponseEntity<T> exchange (URI url, HttpMethod method, @Nullable HttpEntity<?> requestEntity, ParameterizedTypeReference<T> responseType) throws RestClientException;
在进行网站模拟请求的时候永远绕不过去的就是验证码环节,因为Java不像python那样有强大的爬虫库可以操作,本次操作是基于第三方API接口进行的操作。
模拟验证码操作 获取验证码本次模拟接口是 http://localhost:8501/admin/system/index/generateValidateCode 自己搭建生产的验证码验证服务。
在请求该接口的时候获取到 code,message,data三个json数据,我们主要对data的数据codeKey和codeValue进行操作。
该codeValue的数据是base64图片格式数据,我们就得数据拿到发送到我们api处理接口。
1 2 3 4 5 6 7 8 9 10 11 HttpHeaders headers = new HttpHeaders (); headers.add("User-Agent" ,"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 SLBrowser/9.0.3.5211 SLBChan/112" ); HttpEntity<MultiValueMap<String,String>> startPage = new HttpEntity <>(headers); URI url = new URI (ValidateCodeUrl); ResponseEntity<String> response = restTemplate.exchange(url,HttpMethod.GET,startPage,String.class); ObjectMapper mapper = new ObjectMapper (); JsonNode jsonNode = mapper.readTree(response.getBody()); String codeKey = String.valueOf(jsonNode.get("data" ).get("codeKey" )).replaceAll("\"" , "" ); String Imgbase = String.valueOf(jsonNode.get("data" ).get("codeValue" )).replaceAll("\"" , "" );
拿到data中的Imgbase数据,接下来使用API的接口进行操作,可查看官方端口进行查看https://www.jfbym.com/price.html
// # 通用数英1-4位 10110
// # 通用数英5-8位 10111 规定接口上传数据必须base64
// # 通用数英9~11位 10112
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public ResponseEntity<String> commonVerify (String imageContent) throws URISyntaxException { String verify_type; verify_type = "10110" ; HttpHeaders verifyHeader = new HttpHeaders (); verifyHeader.add("Content-Type" , "application/json" ); JSONObject jsonObject = new JSONObject (); jsonObject.put("image" , imageContent); jsonObject.put("type" , verify_type); jsonObject.put("token" , Token); HttpEntity startEntity = new HttpEntity <>(jsonObject,verifyHeader); System.out.println("startEntity = " + startEntity); URI captch = new URI (CustomUrl); ResponseEntity<String> response = restTemplate.exchange(captch,HttpMethod.POST,startEntity,String.class); System.out.println(response); return response; }
进行模拟登录 在通过commonVerify接口完成验证码的识别后,将获取到的数据进行构建json数据mapper.readTree ,在jsonNode中拿去所需要的数据。
1 2 3 4 5 6 7 ResponseEntity<String> response1 = commonVerify(Imgbase); jsonNode = mapper.readTree(response1.getBody()); String captcha = String.valueOf(jsonNode.get("data" ).get("data" )).replaceAll("\"" ,"" );HttpHeaders postHeader = new HttpHeaders ();postHeader.add("User-Agent" ,"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 SLBrowser/9.0.3.5211 SLBChan/112" );
在此我们就拿到了codekey和codeValue 再配上我们所添加的username和password 就构建登录请求体数据
在此也需要判断 login请求需要的是json格式还是其余格式。
根据所需要的格式,去构建HttpEntity的实体类,该操作是请求体和请求头的方式,请求体通过json的形式
1 2 3 4 5 6 7 8 9 10 11 12 postHeader.add("Content-Type" , "application/json" ); JSONObject jsonObject = new JSONObject (); jsonObject.put("userName" , username); jsonObject.put("password" , password); jsonObject.put("captcha" , captcha); jsonObject.put("codeKey" , codeKey); HttpEntity httpEntity = new HttpEntity <>(jsonObject,postHeader); url = new URI (loginUrl); ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class); System.out.println("exchange = " + exchange);
完成,获取到token数据!!!