You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java HttpClient请求遭Cloudflare拦截,如何伪装成Firefox浏览器请求?

Java HttpClient请求遭Cloudflare拦截,如何伪装成Firefox浏览器请求?

碰到Cloudflare的拦截真的挺闹心的,我来帮你拆解下问题所在和可行的解决思路:

核心原因:Cloudflare的检测不止看请求头

Cloudflare的人机验证(尤其是JS挑战)可不是只检查User-Agent这么简单。它会校验一堆浏览器专属的特征:

  • 浏览器的JS执行能力:Firefox控制台里的fetch是在完整的浏览器环境中,会自动执行Cloudflare返回的验证JS,完成校验后拿到合法Cookie;但你的Java HttpClient只是模拟了请求头,根本没法执行JS,自然过不了验证。
  • 浏览器指纹:比如Canvas、WebGL指纹,这些是Java HttpClient模拟不出来的。
  • 请求上下文:比如请求的时序、Cookie状态、甚至是TCP连接的一些细节。

先优化你的请求头试试(临时缓解)

你当前的请求头有几个可能不符合浏览器真实请求的地方,调整后说不定能绕过基础检测:

  • 补充浏览器必带的Accept-Encoding和Connection头
  • 修正Sec-Fetch-*系列头:因为你调用的是API接口,不是加载文档,这些头的值和浏览器加载页面时不一样
  • 可能还需要加Cache-Control头

修改后的请求头示例:

HttpRequest request = HttpRequest.newBuilder()
        .GET()
        .uri(new URI("https://api.doggy.market/listings/nfts/minidoges?sortBy=price&sortOrder=asc&offset=0&limit=30"))
        .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
        .header("Accept-Language","en-US,en;q=0.5")
        .header("Accept-Encoding", "gzip, deflate, br") // 新增:浏览器都会带压缩编码头
        .header("Connection", "keep-alive") // 新增:保持连接复用,符合浏览器行为
        .header("Cache-Control", "max-age=0") // 新增:浏览器发起请求时的缓存控制
        .header("Sec-Fetch-Dest", "empty") // 修正:API请求的目标是empty,不是document
        .header("Sec-Fetch-Mode", "cors") // 修正:跨域/同域API请求用cors,不是navigate
        .header("Sec-Fetch-Site", "same-origin") // 修正:如果是从同域名页面发起的请求,用same-origin
        .header("TE", "trailers")
        .header("Upgrade-Insecure-Requests", "1")
        .header("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0")
        .build();

临时解决方案:复用浏览器的验证Cookie

如果只是临时测试,你可以先在Firefox里打开这个API地址,完成Cloudflare的验证(比如滑块验证),然后打开浏览器的开发者工具(F12)→ 网络面板→ 找到这个API请求→ 复制它的Cookie(比如cf_clearance、__cf_bm这些),然后把Cookie加到你的Java请求里:

.header("Cookie", "cf_clearance=你的浏览器Cookie值; __cf_bm=你的浏览器Cookie值")

注意:这个Cookie和你的IP、User-Agent绑定,有效期很短,只能临时用。

长期解决方案:模拟真实浏览器环境

如果要长期稳定地绕过Cloudflare,Java HttpClient这类纯HTTP客户端肯定不行,得用能真实模拟浏览器行为的工具:

  • Selenium/Playwright:这类工具会真实启动Firefox/Chrome浏览器,自动完成Cloudflare的JS验证、滑块验证,然后你可以直接获取请求结果,完全模拟人的操作,Cloudflare很难检测出来。
  • 注意:使用这类工具时,要遵守目标网站的服务条款,不要过度请求给网站造成压力。

备注:内容来源于stack exchange,提问作者Hedayat Mahdipour

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 12:59:34