遇到Error 500时如何下载已加载完成的页面内容?
解决Java访问网页返回500但浏览器可正常加载的问题
出现这种情况的核心原因是:你直接用IOUtils.toString(url, ...)发起的请求没有携带浏览器常用的请求头信息,服务器识别出这不是标准的浏览器请求,返回了500错误。浏览器访问时会自动带上这些头,所以能正常加载。
解决方案:模拟浏览器请求头
用HttpURLConnection代替直接调用IOUtils,手动添加必要的请求头(比如User-Agent)来模拟浏览器请求,代码示例如下:
String pageUrl = "https://www.hafen-hamburg.de/en/vessels/klein-erna/"; URL url = new URL(pageUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 添加浏览器请求头,模拟Chrome浏览器 connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"); connection.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); connection.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); // 连接并获取响应码 int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { // 读取页面内容 String content = IOUtils.toString(connection.getInputStream(), StandardCharsets.UTF_8); System.out.println(content); } else { // 如果还是有错误,可以读取错误流排查 String errorContent = IOUtils.toString(connection.getErrorStream(), StandardCharsets.UTF_8); System.err.println("错误响应内容:" + errorContent); } connection.disconnect();
关键说明
- User-Agent:这是最关键的头,服务器通过它识别请求来源,设为浏览器的标识就能绕过大部分基础校验。
- 其他请求头:
Accept、Accept-Language等是浏览器默认携带的,加上能让请求更贴近真实浏览器行为。 - 错误流读取:如果还是返回错误,读取
getErrorStream()能拿到服务器返回的错误详情,方便进一步排查问题。
内容的提问来源于stack exchange,提问作者Mio
相关产品推荐
相关产品推荐

