Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HttpClient未保持登录状态_Java_Android_Web Scraping_Httpclient - Fatal编程技术网

Java HttpClient未保持登录状态

Java HttpClient未保持登录状态,java,android,web-scraping,httpclient,Java,Android,Web Scraping,Httpclient,我尝试在使用HttpClient登录后浏览网站 我首先定义一个HttpClient实例和一个cookie存储: public HttpClient httpclient = new DefaultHttpClient(); public CookieStore cookieStore = new BasicCookieStore(); public HttpContext localContext = new BasicHttpContext(); localContext.setAttribu

我尝试在使用HttpClient登录后浏览网站

我首先定义一个HttpClient实例和一个cookie存储:

public HttpClient httpclient = new DefaultHttpClient();
public CookieStore cookieStore = new BasicCookieStore();
public HttpContext localContext = new BasicHttpContext();
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
在一个(android)背景任务中,我成功登录了该网站

HttpPost httppost = new HttpPost("http://www.deeproute.com/deeproute/default.asp");
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("cookieexists","false"));
nameValuePairs.add(new BasicNameValuePair("name", mUser));
nameValuePairs.add(new BasicNameValuePair("password", mPassword));
nameValuePairs.add(new BasicNameValuePair("subbera", "Login"));

httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
res = httpclient.execute(httppost, localContext);
但是,当我连接到此页面时,我将不再登录。我看了一下,成功登录后的cookies仍然在,所以我不知所措

编辑:作为记录,本网站在普通浏览器中完全正常运行


编辑2:根据Aaron下面的回答,cookies似乎正在保存,因为如果在第一次请求后,我会这样做:

List<Cookie> cookies = cookieStore.getCookies();
    int cookieSize = cookies.size();

    for (int i = 0; i < cookieSize; i++) {
        Log.v(TAG, "Cookie " + i + "name: "
                                + cookies.get(i).getName());
        Log.v(TAG, "Cookie " + i + "value: "
                                + cookies.get(i).getValue());
    }
在第二个请求之后,我有两个会话ID cookie:

name: ASPSESSIONIDSCSCSBCS
value: GBAJALJBOGKBFLAELPNKEDOE

name: ASPSESSIONIDSCSCSBCS
value: MBAJALJBDBOKPEHNCDDFOCBC

看起来不像您在初始请求中保存的cookies,因此在下一个请求中没有任何内容可以告诉站点您已登录。
你需要一个饼干容器。谷歌搜索。我遇到了同样的问题。我实现了cookies,但是它仍然没有保持登录状态。我终于让它工作了,所以我发布这段代码希望能帮助其他人解决同样的问题

以下是Apache中关于如何登录和检索所有cookie的示例:

您还可以在此处查看Apache关于“HTTP状态管理”的HttpClient文档:

以下是我的登录功能的实现方式:

  • 使用
    CredentialsProvider设置代理
  • 使用
    BasicCookieStore
  • 使用
    CloseableHttpClient
  • 设置后请求:目标、主机、参数、路径
  • 执行
    /login.html
    发送请求以登录
  • 执行对
    /user
    的GET请求,查看我们是否正确登录
  • 打印响应的状态代码

    //////// SETUP
    //Setup Proxy (If needed)
        CredentialsProvider credsProvider = new BasicCredentialsProvider();
        credsProvider.setCredentials(
                new AuthScope("proxy.mycompany", 8080),
                new UsernamePasswordCredentials("my_username", "my_password"));
    //Setup Cookies
        BasicCookieStore cookieStore = new BasicCookieStore();
    
    //Build HttpClient
        CloseableHttpClient httpclient = HttpClients.custom()
                .setDefaultCredentialsProvider(credsProvider)
                .setDefaultCookieStore(cookieStore)
                .build();
        HttpHost target = new HttpHost("www.mycompany.com", 80, "http");
        HttpHost proxy = new HttpHost("proxy.mycompany", 8080);
        RequestConfig config = RequestConfig.custom()
                .setProxy(proxy)
                .build();
    try {
    //////// LOGIN REQUEST, POST TO /login.html
    //Start POST Request
        HttpPost httppost = new HttpPost('/login.html');
    //Add parameters to POST Request
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();   
        nameValuePairs.add(new BasicNameValuePair('username','my_username'));  
        nameValuePairs.add(new BasicNameValuePair('password','my_password'));
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    //Set Config for POST Request
        httppost.setConfig(config);
    //Execute POST Request
        httpresponse = httpclient.execute(target, httppost);
    //Print Response Code
        try {
           System.out.println("Status Code: "+httpresponse.getStatusLine().getStatusCode());
        } finally {
    //Close HTTP Reponse (must be in a 'finally' block)
            httpresponse.close();
        }
    
    //////// CHECK LOGIN STATUS, GET TO /user
    //Start GET Request
        HttpGet httpget = new HttpGet('/user');
    //Set Config for GET Request
        httpget.setConfig(config);
    //Execute GET Request
        httpresponse = httpclient.execute(target, httpget);
    //Print Response Code
        try {
           System.out.println("Status Code: "+httpresponse.getStatusLine().getStatusCode());
        } finally {
    //Close HTTP Reponse (must be in a 'finally' block)
            httpresponse.close();
        }
    } finally {
        httpclient.close();
    }
    
    ///SETUP
    //安装代理(如果需要)
    CredentialsProvider credsProvider=新的BasicCredentialsProvider();
    credsProvider.setCredentials(
    新AuthScope(“proxy.mycompany”,8080),
    新用户名密码凭据(“我的用户名”、“我的密码”);
    //设置Cookies
    BasicCookieStore cookieStore=新BasicCookieStore();
    //构建HttpClient
    CloseableHttpClient httpclient=HttpClients.custom()
    .setDefaultCredentialsProvider(CredProvider)
    .setDefaultCookieStore(cookieStore)
    .build();
    HttpHost target=新的HttpHost(“www.mycompany.com”,80,“http”);
    HttpHost proxy=新的HttpHost(“proxy.mycompany”,8080);
    RequestConfig=RequestConfig.custom()
    .setProxy(代理)
    .build();
    试一试{
    ////////登录请求,发布到/LOGIN.html
    //启动POST请求
    HttpPost-HttpPost=newhttppost('/login.html');
    //向POST请求添加参数
    List nameValuePairs=新的ArrayList();
    添加(新的BasicNameValuePair('username','my_username');
    添加(新的BasicNameValuePair('password','my_password');
    setEntity(新的UrlEncodedFormEntity(nameValuePairs));
    //设置POST请求的配置
    httppost.setConfig(config);
    //执行POST请求
    httpresponse=httpclient.execute(目标,httppost);
    //打印响应代码
    试一试{
    System.out.println(“状态代码:+httpresponse.getStatusLine().getStatusCode());
    }最后{
    //关闭HTTP响应(必须在“finally”块中)
    httpresponse.close();
    }
    ////////检查登录状态,转到/user
    //开始获取请求
    HttpGet-HttpGet=newhttpget('/user');
    //设置GET请求的配置
    httpget.setConfig(config);
    //执行GET请求
    httpresponse=httpclient.execute(目标,httpget);
    //打印响应代码
    试一试{
    System.out.println(“状态代码:+httpresponse.getStatusLine().getStatusCode());
    }最后{
    //关闭HTTP响应(必须在“finally”块中)
    httpresponse.close();
    }
    }最后{
    httpclient.close();
    }
    

  • 谢谢你的回答,但是我认为cookie正在保存,因为如果我打印cookie列表的元素,我确实看到了值。我还在谷歌上搜索了cookie容器,但我唯一能找到的是CookieManager,它似乎只适用于Android网络视图?
    name: ASPSESSIONIDSCSCSBCS
    value: GBAJALJBOGKBFLAELPNKEDOE
    
    name: ASPSESSIONIDSCSCSBCS
    value: MBAJALJBDBOKPEHNCDDFOCBC
    
    //////// SETUP
    //Setup Proxy (If needed)
        CredentialsProvider credsProvider = new BasicCredentialsProvider();
        credsProvider.setCredentials(
                new AuthScope("proxy.mycompany", 8080),
                new UsernamePasswordCredentials("my_username", "my_password"));
    //Setup Cookies
        BasicCookieStore cookieStore = new BasicCookieStore();
    
    //Build HttpClient
        CloseableHttpClient httpclient = HttpClients.custom()
                .setDefaultCredentialsProvider(credsProvider)
                .setDefaultCookieStore(cookieStore)
                .build();
        HttpHost target = new HttpHost("www.mycompany.com", 80, "http");
        HttpHost proxy = new HttpHost("proxy.mycompany", 8080);
        RequestConfig config = RequestConfig.custom()
                .setProxy(proxy)
                .build();
    try {
    //////// LOGIN REQUEST, POST TO /login.html
    //Start POST Request
        HttpPost httppost = new HttpPost('/login.html');
    //Add parameters to POST Request
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();   
        nameValuePairs.add(new BasicNameValuePair('username','my_username'));  
        nameValuePairs.add(new BasicNameValuePair('password','my_password'));
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    //Set Config for POST Request
        httppost.setConfig(config);
    //Execute POST Request
        httpresponse = httpclient.execute(target, httppost);
    //Print Response Code
        try {
           System.out.println("Status Code: "+httpresponse.getStatusLine().getStatusCode());
        } finally {
    //Close HTTP Reponse (must be in a 'finally' block)
            httpresponse.close();
        }
    
    //////// CHECK LOGIN STATUS, GET TO /user
    //Start GET Request
        HttpGet httpget = new HttpGet('/user');
    //Set Config for GET Request
        httpget.setConfig(config);
    //Execute GET Request
        httpresponse = httpclient.execute(target, httpget);
    //Print Response Code
        try {
           System.out.println("Status Code: "+httpresponse.getStatusLine().getStatusCode());
        } finally {
    //Close HTTP Reponse (must be in a 'finally' block)
            httpresponse.close();
        }
    } finally {
        httpclient.close();
    }