java - 链接给出来自代码的无效响应代码,但来自浏览器的有效响应代码
问题描述
我通过尝试点击它们并获取响应代码(在 Java 中)来验证链接。但是我从代码中得到了无效的响应代码(403 或 404),但是从浏览器中,当我检查网络活动时,我得到了 200 个状态代码。这是我获取响应代码的代码。[我事先对 url 进行了基本验证,例如将其设为小写等]
static int getResponseCode(String link) throws IOException {
URL url = new URL(link);
HttpURLConnection http = (HttpURLConnection) url.openConnection();
return http.getResponseCode();
}
对于http://science.sciencemag.org/content/220/4599/868 之类的链接,当我运行此代码时,我得到了 403 状态。但是在浏览器(chrome)上,我得到了 200 个状态。另外,如果我使用下面的 curl 命令,我会得到 200 个状态码。
curl -Is http://science.sciencemag.org/content/220/4599/868
解决方案
克服这一点的唯一方法是:
- 检查您的程序发送的 HTTP 标头是什么(例如,通过向http://scooterlabs.com/echo发送查询并检查响应)
- 检查您的浏览器发送的 HTTP 标头是什么(例如,通过访问https://www.whatismybrowser.com/detect/what-http-headers-is-my-browser-sending)
- 发现差异
- 更改您的程序以发送与浏览器相同的标头(有效的标头)
我为你做了这个分析,结果发现这个网站需要一个Accept
类似于现有浏览器的 Accept 标头的标头。默认情况下,Java 会发送一些有效的东西,但不是类似的东西。
你只需要改变你的程序:
static int getResponseCode(String link) throws IOException {
URL url = new URL(link);
HttpURLConnection http = (HttpURLConnection) url.openConnection();
http.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
return http.getResponseCode();
}
(或实际浏览器使用的任何其他值)
推荐阅读
- laravel - Laravel 7 Authentication 检查其他表中的用户状态
- authentication - 问:(ssg-wsg)CorpPass 不断出现错误
- java - HttpRequestBase 可以在 Dart/Flutter 中使用吗?
- c++ - C++:调试时在 VS Code 中看不到输出
- python - Selenium 脚本在 2000 页后超时,我该怎么办?
- javascript - 如何在我的 google-cloud-function (javascript) 中正确编写 try-catch
- linux - 带有变量的 rm:一个有效,下一个无效
- c++ - 如何在 VMTHook 中查找索引
- sql-server - 使用 SSIS 将数据从 SQL Server 表复制到 Excel 时需要合并列标题
- python - AWS 路由表导出详细信息到 CSV