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

由于java中的会话,两个HTTP请求(一个接一个)不起作用

秦博达
2023-03-14

我有一个http请求的问题,我想你可以帮助我。我有一个JavaEE webapp,我需要在上面提出一些请求。

特别是,我有两个请求要一个接一个地做。但是为了成功,webapp(链接到我公司的另一个webapp)希望请求来自“两个不同的来源”。例如,如果我用同一个浏览器处理这些请求,它就不会工作,而如果我用mozilla处理第一个请求,然后在“匿名窗口”中用mozilla处理第二个请求,它就会工作!很奇怪不是吗?

所以我想对java的post请求使用同样的策略(我正在为谷歌眼镜开发一个应用程序),但是我做不到。我尝试了很多技巧。这是我的最后一段代码,我使用了一个httpclient链接到一个上下文本身,这个上下文链接到一个cookiestore,我清除了cookie store =

  public RestClient(){
    httpClient = new DefaultHttpClient();
    localContext = new BasicHttpContext();
    cookieStore = new BasicCookieStore();
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
    }

  private String postHttp(String address, String content, String contentType) {
    String text = null;
    HttpResponse response;
    try {
      HttpPost httpPost = new HttpPost(address);
      httpPost.setHeader("Content-Type", contentType);
      httpPost.setEntity(new StringEntity(content));
      response = httpClient.execute(httpPost, localContext);
      text = HttpUtil.convertInputStreamToString(response);
      cookieStore.clear();
    }
    catch (Exception e) {
      return e.getLocalizedMessage();
    }
    return text;
  }

在活动中:

postData = "myrequest1";
RestClient a = new RestClient();
String result1 = a.postHttp(Constants.AVAIL_ADDRESS, postData, "application/x-www-form-urlencoded;charset=UTF-8");
a = null;
//fine

postData = "myrequest2";
RestClient b = new RestClient();
String result2 = b.postHttp(Constants.BOOKING_ADDRESS, postData, "application/x-www-form-urlencoded;charset=UTF-8");
//error

仅供参考,错误不是来自java,而是来自我的公司webapp,因为它检测到类似会话的东西(我不确定“会话”这个词...)

谢谢你的帮助!

更新

Maven dependencies :

<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpclient</artifactId>
  <version>4.3.3</version>
</dependency>
<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpmime</artifactId>
  <version>4.3.3</version>
</dependency>
<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpcore</artifactId>
  <version>4.3.2</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.2.3</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.2.3</version>
</dependency>
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.8.2</version>
  <scope>test</scope>
</dependency>

共有2个答案

黄弘深
2023-03-14

不确定确切的问题在哪里,但我认为这与cookie存储在上下文中的设置方式有关。我还注意到您使用的许多类都已弃用。

这应该可以让你上路了:

import java.io.IOException;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.HttpClientBuilder;

public class RestClientToo {
    private HttpClient client = HttpClientBuilder.create()
            .disableCookieManagement().build();
    private BasicResponseHandler responseHandler = new BasicResponseHandler();

    public String postHttp(String address, String content, String contentType)
            throws ClientProtocolException, IOException {

        HttpPost post = new HttpPost(address);
        post.setHeader("Content-Type", contentType);
        post.setEntity(new StringEntity(content));

        HttpResponse response = client.execute(post);
        String result = responseHandler.handleResponse(response);

        return result;
    }
}

请注意,我没有在任何地方指定字符编码,因此您可能希望添加这些编码以及一些异常处理,以使事情更加健壮。

钮誉
2023-03-14

您可以通过为两个请求设置不同的用户代理来尝试模拟所需的行为(来自两个不同浏览器的两个请求),如下所示:

httpPost.setHeader("User-Agent", "MyAgent");
 类似资料:
  • 问题内容: 我有一个javascript函数,其中有两个$ .post请求。两个$ .post请求都应该执行。但是有时候,第二个$ .post请求却没有执行。这可能是什么原因? 问题答案: 是$ .ajax()结构的缩写形式。我通常更喜欢使用该结构,因为: 比较容易发现我是否错过了任何事情 我可以更轻松地添加其他参数,例如 当刚接触ajax时,我发现对这种结构进行故障排除要容易得多 在您的情况下,

  • 问题内容: 我运行foo.com。我在foo.com中有两个不同的应用程序:一个是foo.com/bar,另一个是foo.com/example。我使用会话来跟踪有关用户登录的信息,但是如果用户从foo.com/bar转到foo.com/example,则foo.com/example会看到用户从foo.com/启动的会话并使用该信息。我的问题是,如何同时为每个目录进行两个不同的会话? 问题答案:

  • 我一直有一个问题,当请求来自域名而不是localhost时,会话变量不可用。例如,如果我设置一个用户变量: 当客户端发出另一个请求并且我尝试访问用户会话变量时,它返回null。 我注意到,在每个请求中,都会设置一个新的JSESSIONID cookie,并且ID值会更改。这是否意味着每次客户端访问服务器时都会创建一个新会话?如何在客户端之间保持相同的会话,以便我可以在Http会话中存储对象并访问它

  • 我正在尝试使用Apache Flink流API加入两个流,但没有任何内容加入,并且在阅读文档后我不知道我做错了什么 关键功能是

  • 我在WebDriver中的测试有问题。 在第一个包我有2类(页)主页,登录页。 在secound包中,我有test-goToLiginPageTest和LoginTest。 在Gotoligini页面,我检查,我在主页上,并进入登录页面。 在LoginTest中,我检查我是否在登录页面上,并登录。 但来自goToLiginPageTest的两个测试通过,但来自LoginTest的测试失败。 我不确

  • 问题内容: 如何在一个HTTP请求中下载多个文件?我的意思是,当您有多个附件时,选择要下载的内容,然后按下载,这样便可以自动下载它们,而不必手动单击每个附件。 我正在使用PHP作为服务器端加密。 问题答案: 它 是 可以发送一个在HTTP响应多: 通常,HTTP与任何其他媒体类型一样对待多部分消息主体:严格作为有效负载。[…] HTTP用户代理应遵循与MIME用户代理在收到多部分类型时相同或相似的