当前位置: 首页 > 知识库问答 >
问题:

尝试使用HttpClient设置会话cookie

阚乐湛
2023-03-14

帮助将cookie设置为HttpClient

创建了一个登录到外部web服务的程序。但是,要从HTTP GET获取重要信息,我无法传入cookie(从登录生成)。

public class ClientHelper {
    private final static String PROFILE_URL = 
                               "http://externalservice/api/profile.json";
    private final static String LOGIN_URL = "http://externalservice/api/login";

    public static Cookie login(final String username, final String password) {
        DefaultHttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(LOGIN_URL);
        HttpContext localContext = new BasicHttpContext();
        client.getParams().setParameter("http.useragent", "Custom Browser");
        client.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, 
                                        HttpVersion.HTTP_1_1);
        List<Cookie> cookies = null;
        BasicClientCookie cookie = null;

        try {
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
            nameValuePairs.add(new BasicNameValuePair("user", username));
            nameValuePairs.add(new BasicNameValuePair("passwd", password));
            UrlEncodedFormEntity entity = 
                    new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8);
            entity.setContentType("application/x-www-form-urlencoded");

            post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = client.execute(post, localContext);
            cookies = client.getCookieStore().getCookies();
            System.out.println(cookies.get(1));

            cookie = new BasicClientCookie(cookies.get(1).getName(), cookies.get(1).getValue());
            cookie.setVersion(cookies.get(1).getVersion());
            cookie.setDomain(cookies.get(1).getDomain());
            cookie.setExpiryDate(cookies.get(1).getExpiryDate());
            cookie.setPath(cookies.get(1).getPath());               
            BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

            String line = "";
            while ((line = rd.readLine()) != null) {
                System.out.println(line);
            }
        } 
        catch (Throwable e) {
            e.printStackTrace();
        }
        return cookie;
   }

   public static void getProfile(Cookie cookie) {
      DefaultHttpClient client = new DefaultHttpClient();
      HttpContext context = new BasicHttpContext();
      CookieStore cookieStore = new BasicCookieStore();
      cookieStore.addCookie(cookie);
      client.setCookieStore(cookieStore);
      context.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
      HttpGet get = new HttpGet(PROFILE_URL);
      HttpResponse response;

      try {
          response = client.execute(get, context);
          BufferedReader rd = 
             new BufferedReader(
                    new InputStreamReader(response.getEntity().getContent()));

          String line = "";
          while ((line = rd.readLine()) != null) {
              System.out.println(line);
          }
       } 
       catch (ClientProtocolException e) {
           e.printStackTrace();
       } 
       catch (IOException e) {
           e.printStackTrace();
       }
   }
}

app.java(使用ClientHelper的类):

public class App {
   private static final String USER = "myusername";
   private static final String PASSWD = "mypassword";

   public static void main(String[] args) {
       Cookie cookie = ClientHelper.login(USER, PASSWD);
       ClientHelper.getProfile(cookie);
   }
}

当我运行应用程序时,我可以登录(我看到生成的JSON),但是getProfile()方法返回一个空的JSON对象:

 {}

在命令行中,我试图使用curl来模拟以下情况:

curl -b Cookie.txt http://externalservice/api/profile.json

共有1个答案

狄兴邦
2023-03-14

尝试执行这部分代码:

List<Cookie> cookies = client.getCookieStore().getCookies();
        for (Cookie cookie : cookies) {
             singleCookie = cookie;
        }
 HttpResponse response = client.execute(post, localContext);
 类似资料:
  • 但这并不能解决问题。 如何向请求添加会话cookie?

  • 问题内容: 我有一个spring / jdbc / oracle 10g应用程序。Oracle服务器数据库时区设置为GMT + 2 JVM时区设置为GMT + 2(即使对于我而言这无关紧要)。 我有一个执行某些日期操作的存储过程。问题是,即使我未在代码/配置中明确设置会话时区,会话时区也不同于数据库时区(GMT)。 据我所知,会话时区默认情况下等于数据库时区。知道为什么会话时区与数据库时区不同,或

  • 问题内容: 我试图将用户模型视图添加到Flask-Admin。但是,我得到了。为什么会发生这种情况,我该如何解决? : : 当添加时,我也必须添加。添加以下行后出现此错误: 问题答案: 您的代码行在。问题是,有。这是一个循环导入:尝试导入,尝试导入,直到尝试导入才定义。要解决此问题,请将本地应用程序导入移动到所有全局扩展名的定义下方。 目前,您的代码如下所示: 您需要将其更改为:

  • 我的环境是两台物理机器,都运行在Docker-Compose中。 我想创建跨越两个docker容器的elasticsearch集群。 我这样的建筑 两个容器不能互相连接,有什么想法吗? docker image正在使用ElasticSearch:5.4.2 Docker-compose.yml ElasticSearch.yml 和日志 [2017-11-09T05:56:10,552][信息][

  • 问题内容: 如何使用React.DOM更改HTML的样式? 我尝试了这段代码,但无法正常工作: 如果您从浏览器控制台执行此操作,则它可以工作(但我需要在ReactJS代码中工作): 问题答案: 假设您的body标签不是另一个React组件的一部分,只需照常更改即可: 建议将其放在方法中,然后在处将其取消:

  • 问题内容: 是否可以使用Javascript设置PHP会话变量? 问题答案: 在JavaScript中: 在session_write.php文件中: 在HTML中: