首页 > 其他分享 >https请求获取token和cookie,并用于未来其他请求

https请求获取token和cookie,并用于未来其他请求

时间:2024-02-01 19:56:17浏览次数:28  
标签:请求 baseUrl token cookie https import tokenAndCookie String

主要参考百度AI生成的程序。
上次的例子用token带入了新的请求,请求成功,正确获取response.
我这里的例子是:
当请求不含token时,请求失败;当请求只含有token时,监控软件没有获取请求的用户名;当请求含有token和cookie时,监控软件能获取请求的用户名。我这里需要获取用户名,因此必须请求必须加上cookie.
1.用户打开baseUrl,此时请求的Request Headers和Response Headers均不含有token和cookie
2.用户输入正确的用户名和密码,点击登录。此时后台执行了
2a. getPublicKey,这个请求的Request Headers和Response Headers仍然不含有cookie,但是reponse中含有token。
2b. login, 这个请求中的Request Headers不含cookie,payload中含有token. Response Headers中含有cookie。有两个值,其中一个是JSESSIONID。这个JSESSIONID暂时忽略,我继续访问这个产品的其他功能,JSESSIONID会变化。
但是另一个cookie没变。因此重点关注另外一个。可能不同的产品cookie的名称也不同,这个名称必须已知。可以用以下方法获取cookie

Response response = client.target(loginUrl)  // 第一个Request Header不含cookie但是Response Header含cookie的请求的url。
.request(MediaType.APPLICATION_JSON)
.post(Entity.entity(loginData, MediaType.APPLICATION_JSON), Response.class);
Map<String, NewCookie> cookies = response.getCookies();
cookies.forEach((key, value) -> System.out.println("Key: " + key + ", Value: " + value));
NewCookie cookie = response.getCookies().get(cookieName);
String cookieValue = cookie.getValue();
System.out.println(cookieValue);

然后用获取的token和cookie带入到新的请求中。此时监控软件中获取了用户名。

String cookiesValue = cookieName + "=" + cookieValue;  // cookiename由产品决定,一般不变,可以Chrome F12 - network获取,cookieValue就是之前获取的值。
PolicyGroupHelper.GetPolicyGroupsResponse response = testClient.target(baseUrl + api)
                .request(MediaType.APPLICATION_JSON)
                .header("token", token)
                .header("Cookie", cookiesValue)
                .post(Entity.entity(filter, MediaType.APPLICATION_JSON), PolicyGroupHelper.GetPolicyGroupsResponse.class);

附完整可运行的程序

import cn.hutool.core.util.StrUtil;
import org.apache.commons.codec.binary.Base64;
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.client.ClientProperties;
import org.glassfish.jersey.jackson.JacksonFeature;

import javax.crypto.Cipher;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import javax.ws.rs.ProcessingException;
import javax.ws.rs.client.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.NewCookie;
import javax.ws.rs.core.Response;
import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;


public class SensLevelHelper {
    public static void main(String[] args) throws Exception {
        String baseUrl = "https://hostname:port/";
        String api = "apiUrl不包含baseUrl";
        String account = "******";
        String password = "****";
        String cookieName = "****";   // 这里的cookie的name,由server端提供的,根据产品的不同而不同。
        getResponseWithTokenAndCookie(account, password, baseUrl, api, cookieName);
    }

    public static void getResponseWithTokenAndCookie(String account, String password, String baseUrl, String api, String cookieName) throws Exception {
        List<String> tokenAndCookie = getClientTokenAndCookie(account, password, baseUrl, api, cookieName);
        if (tokenAndCookie == null || tokenAndCookie.size() == 0) {
            System.out.println("haven't gotten token or cookie");
            return;
        }

        String token = tokenAndCookie.get(0);
        String cookie = tokenAndCookie.get(1);
        String cookiesValue = cookieName + "=" + cookie;
        System.out.println(cookiesValue);
        ClientConfig configuration = new ClientConfig();
        configuration = configuration.property(ClientProperties.CONNECT_TIMEOUT, 30000);
        configuration = configuration.property(ClientProperties.READ_TIMEOUT, 30000);
        Client testClient = ClientBuilder.newBuilder().sslContext(createIgnoreVerifySSL()).withConfig(configuration).hostnameVerifier((s1, s2) -> true).register(new JacksonFeature()).build();


        PolicyGroupHelper.SearchPolicyFilter filter = new PolicyGroupHelper.SearchPolicyFilter();
        filter.setType(1);
        PolicyGroupHelper.GetPolicyGroupsResponse response = testClient.target(baseUrl + api)
                .request(MediaType.APPLICATION_JSON)
                .header("token", token)
                .header("Cookie", cookiesValue)
                .post(Entity.entity(filter, MediaType.APPLICATION_JSON), PolicyGroupHelper.GetPolicyGroupsResponse.class);
        System.out.println(response);
    }

    public static List<String> getClientTokenAndCookie(String account, String password, String baseUrl, String api, String cookieName) {
        List<String> tokenAndCookie = new ArrayList<>();
        String getKeyUrl = baseUrl + "getToken api 不包含baseUrl";  // 获取token 的API
        String loginUrl = baseUrl + "login api 不包含baseUrl";      // 获取cookie的API
for (int i = 0; i < 3; i++) {
            try {
                Client client = ClientBuilder.newBuilder().sslContext(createIgnoreVerifySSL()).hostnameVerifier((s1, s2) -> true).register(new JacksonFeature()).build();
                WebTarget webTarget = client.target(getKeyUrl);


                Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
                LogInHelper.PubKey publicKey = invocationBuilder.get(LogInHelper.PubKey.class);
                byte[] decoded = Base64.decodeBase64(publicKey.getData());
                RSAPublicKey pubKey;
                pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
                Cipher cipher = Cipher.getInstance("RSA");
                cipher.init(Cipher.ENCRYPT_MODE, pubKey);
                String outStr = Base64.encodeBase64String(cipher.doFinal(password.getBytes(StandardCharsets.UTF_8)));
                LogInHelper.LoginData loginData = new LogInHelper.LoginData(account, outStr);

                Response response = client.target(loginUrl)
                        .request(MediaType.APPLICATION_JSON)
                        .post(Entity.entity(loginData, MediaType.APPLICATION_JSON), Response.class);

                LogInHelper.LoginResponse loginResponse = response.readEntity(LogInHelper.LoginResponse.class);
                if (StrUtil.isNotEmpty(loginResponse.data.token)) {
                    tokenAndCookie.add(loginResponse.data.token);
                }

                Map<String, NewCookie> cookies = response.getCookies();
                cookies.forEach((key, value) -> System.out.println("Key: " + key + ", Value: " + value));
                NewCookie cookie = response.getCookies().get(cookieName);
                String cookieValue = cookie.getValue();
                if (StrUtil.isNotEmpty(cookieValue)) {
                    tokenAndCookie.add(cookieValue);
                }
                if (tokenAndCookie != null && tokenAndCookie.size() > 0) {
return tokenAndCookie;
}
} catch (ProcessingException ex) {
ex.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
return null;
}

private static SSLContext createIgnoreVerifySSL() throws Exception {
SSLContext sc = SSLContext.getInstance("TLSv1.3");

// 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法
X509TrustManager trustManager = new X509TrustManager() {
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
String paramString) {
}

@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
String paramString) {
}

@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
};

sc.init(null, new TrustManager[]{trustManager}, null);
return sc;
}
}


标签:请求,baseUrl,token,cookie,https,import,tokenAndCookie,String
From: https://www.cnblogs.com/panda4671/p/18001991

相关文章

  • nvm安装Nodejs时报错,Could not retrieve https://npm.taobao.org/mirrors/node/latest
    1.首先要使用管理员运行命令2.在安装nvm的目录下找到settings.txt,没有就手动增加一个node_mirror:https://npm.taobao.org/mirrors/node/npm_mirror:https://npm.taobao.org/mirrors/npm/这个地方有点奇怪,安装18的时候把上面的Https://去掉以后就下载成功了3.安装19以及......
  • web-http协议与https协议
    web-http协议与https协议http协议超文本传输协议(英文:HyperTextTransferProtocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。http协议运行简要流程1.在客户端输入URL2.客户端向DNS服务器......
  • npm证书过期:npm ERR! request to https://registry.npm.taobao.org/element-ui failed
    场景:使用淘宝源安装element-ui时npm证书过期报错信息如下:npmERR!codeCERT_HAS_EXPIREDnpmERR!errnoCERT_HAS_EXPIREDnpmERR!requesttohttps://registry.npm.taobao.org/element-uifailed,reason:certificatehasexpirednpmERR!Acompletelogofthisrun......
  • ClientBuilder https请求时忽略SSL证书。
    在chrome中连接https时,有时被告知不是私密链接,手动可以继续。用java代码进行https也遇到这种情况,可以 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法附完整可用代码importorg.glassfish.jersey.jackson.JacksonFeature;importjavax.net.ssl.SSLContext;im......
  • 11.jmeter用户定义变量、请求头管理器、json提取器、CSV导入数据
     ......
  • 服务器端请求伪造 (SSRF)
    什么是SSRF?服务器端请求伪造是一种Web安全漏洞,它允许攻击者使服务器端应用程序向非预期位置发出请求。在典型的SSRF攻击中,攻击者可能导致服务器与组织基础结构中的仅限内部的服务建立连接。在其他情况下,它们可能能够强制服务器连接到任意外部系统。这可能会泄露敏感数据,例如授......
  • 如何在vue3项目app.ts中获取第三方跳转过来的token 提前处理携带token情况的初始化 两
    如何在vue3项目app.ts中获取第三方跳转过来的token提前处理携带token情况的初始化两种方式路由守卫和window.location在Vue3项目的app.ts文件中获取第三方跳转过来的token,你可以使用VueRouter的route对象来获取URL参数。假设你的token参数位于URL的查询字......
  • 群晖开启HTTPS访问
    1.申请免费SSL证书点击连接,微信扫码,登陆腾讯云控制台,直接跳转到证书申请页面。腾讯云免费SSL证书申请在腾讯申请的域名可以使用自动DNS验证,在其他域名服务商申请的域名,选择手动DNS验证。填写域名,例如nas.example.com,填写邮箱。点击提交申请,进行域名验证后,进入下面的页面。会提......
  • 使用Java实现HTTPS通信:一场加密的探戈
    你知道吗,HTTPS不仅仅是一个简单的字母替换游戏,它是互联网安全的重要组成部分。好消息是,有了Java,我们也可以轻松地实现HTTPS通信!今天,就让我们一起跳进加密的探戈世界,了解如何使用Java实现HTTPS通信。首先,我们要明白HTTPS是什么。简单来说,HTTPS就是“超文本传输协议安全版”,它通过使......
  • axios实现,在一个极短时间内,请求同一个接口,若传参完全一样,则使用浏览器中的缓存中的上
    axios实现,在一个极短时间内,请求同一个接口,若传参完全一样,则使用浏览器中的缓存中的上次的值。同时,上次的值应该在指定时间内可以自动清除。请写一个axios适配器。实现上述功能。在axios中,我们可以利用浏览器的缓存机制(HTTP缓存)来实现这个需求。不过,浏览器的HTTP缓存主要依赖于服......