如何在Java中处理419 HTTP响应

omhiaaxx  于 2023-03-06  发布在  Java
关注(0)|答案(2)|浏览(566)

我试图解析一个特定的网站,当我的java代码调用它时,我得到了一个HTTP响应代码419。我需要解析响应来查找内容,但我被响应代码卡住了。
我试过用apache http客户端(4. 5. 6版)拼凑一个Java程序来调用我需要解析的网站,我得到的http响应代码是419。

try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
    HttpGet httpGet = new HttpGet("http://www.website.com");
    try (CloseableHttpResponse response1 = httpclient.execute(httpGet)) {
        System.out.println(response1.getStatusLine());
        HttpEntity entity1 = response1.getEntity();
        EntityUtils.consume(entity1);
    }
}

它输出的结果如下:

HTTP/1.1 419 status code 419

我在等200美元

HTTP/1.1 200 OK

当我把网站改成谷歌或其他网站时,我就会得到这个结果。

4dbbbstv

4dbbbstv1#

我正在通过HttpClient库以及从POSTMAN发出获取请求,并面临相同的419错误。要解决此419错误,我们需要在提交表单时添加csrf令牌。
然而,如果您仍然想知道如何找到csrf令牌,即使您正在发出GET请求并面临状态419,在我的情况下,我通过在标题中添加user-agent: xxxx令牌解决了这个问题
示例:

user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36

HttpClient代码:

connectionManager = new PoolingHttpClientConnectionManager();
  ...
  ...
  ...

  httpClient = HttpClients.custom()
                .setConnectionManager(connectionManager)
                .setRedirectStrategy(new LaxRedirectStrategy())
                .setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36")
                .build();
c3frrgcw

c3frrgcw2#

如果你从任何浏览器点击网站网址,那么你可以很容易地获得内容,但当你从 Postman 或从你的代码点击网址,那么它说的状态代码419,这实际上意味着它需要一个csrf令牌。但是浏览器如何获得内容呢?这是因为你试图点击的网站是以这样一种方式配置的,当它从浏览器只得到请求,然后它会呈现结果.当浏览器点击http请求时,它会发送一个名为“user-agent”的参数,并在其中发送一些信息。例如-

user-agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
  • “Mozilla/5.0”-表示浏览器与Mozilla兼容,Mozilla是一种常见的Web浏览器引擎。
  • “( windows 新台币10. 0;Win 64; x64)”-指示操作系统为Windows 10,并且运行在64位处理器上。
  • “AppleWebKit/537.36(KHTML,like Gecko)”-表示浏览器正在使用WebKit渲染引擎,其他流行的浏览器(如Safari和Opera)也使用该引擎。“KHTML”指的是WebKit基于KHTML布局引擎。
  • “Chrome/58.0.3029.110”-表示浏览器为Google Chrome版本58.0.3029.110。
  • “Safari/537.36”-表示浏览器还使用Safari浏览器的某些组件。

因此,如果我们可以从我们的java代码(如下)伪造http调用,就像从浏览器发送一样,那么它将不再给予419状态。

String url = "your-site-url";
            HttpClient client = HttpClientBuilder.create().build();
            request = new HttpGet(url);

            String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
            request.addHeader("User-Agent", userAgent);
            HttpResponse response = client.execute(request);

            HttpEntity entity = response.getEntity();
            String content = EntityUtils.toString(entity);
            System.out.println(content);

p.s-此处使用apache httpclient,请确保将依赖项添加到pom.xml

相关问题