HttpURLConnection 访问页面时发生403问题。

工作中发现一个问题。当我用HttpURLConnection去连接读取一个网站时,老是会发生这个403错误。这个引起了IOException,但是我用firefox访问这个网站时就没问题。 google后知道了答案。原来如果用java代码HttpURLConnection去连的话 http header 中的User-Agent就为空,解决方法就是在连接之前先设置这个属性。
URL myUrl =  URL(searchURL);
URLConnection myConn = (HttpURLConnection)myUrl.openConnection();
myConn.setRequestProperty(,);
BufferedReader br = BufferedReader( InputStreamReader(myConn.getInputStream()));

那台Server上要这么做, 可能是要组织一些网络机器人的访问(不过感觉不是很有用,用上面的方法就能破了)。 其实实现感觉也很简单, 加上一个Filter,判断如果request.getHeader("User-agent")为空的话,然后再response一个403 status就行。


### 处理 HTTP 302 重定向问题 #### 默认行为与解决方案 在默认情况下,`HttpClient` 不会自动处理 `302` 跳转,而是直接返回状态码 `302` 和目标地址的 `Location` 字段[^1]。为了应对这种情况,可以手动捕获响应头中的 `Location` 值并发起新的请求。 对于 Java 的场景,可以通过设置 `HttpURLConnection.setInstanceFollowRedirects(true)` 来启用自动跟随重定向的功能[^4]。然而,在某些特定需求下(如需要自定义逻辑),建议手动解析 `Location` 并重新构建请求。 以下是基于 Java 的代码示例: ```java import java.net.HttpURLConnection; import java.net.URL; public class RedirectExample { public static void main(String[] args) throws Exception { String path = "http://example.com"; HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection(); conn.setInstanceFollowRedirects(false); // 手动控制重定向 int responseCode = conn.getResponseCode(); if (responseCode == 302 || responseCode == 301) { // 检查是否发生重定向 String location = conn.getHeaderField("Location"); // 获取 Location System.out.println("Redirected to: " + location); // 发起新请求到目标地址 HttpURLConnection redirectedConn = (HttpURLConnection) new URL(location).openConnection(); redirectedConn.connect(); System.out.println("Final Response Code: " + redirectedConn.getResponseCode()); } } } ``` #### JavaScript 中的 AJAX 请求 当使用 jQuery 或原生 XMLHttpRequest 进行 AJAX 请求,可能会遇到类似的重定向问题。由于浏览器的安全策略,默认不会暴露跨域的重定向细节[^5]。因此,如果目标地址跨越不同域名,则需考虑 CORS 配置或服务端调整。 一种可行的方式是在服务端完成跳转前附加必要的认证信息或其他参数后再执行实际跳转操作。或者改用前端显式获取 `Location` 后再次调用对应接口。 下面是一个简单的例子展示如何判断是否存在 `302` 状态并尝试访问指定位置链接: ```javascript function handleRequest(url) { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 302) { let redirectUrl = xhr.getResponseHeader('Location'); console.log(`Redirecting to ${redirectUrl}`); fetch(redirectUrl) .then(response => response.text()) .then(data => console.log(data)); } else if (xhr.readyState === 4 && xhr.status >= 200 && xhr.status < 300){ console.log(xhr.responseText); } }; xhr.open('GET', url, true); xhr.send(null); } handleRequest('/test'); // 替换为具体路径测试效果 ``` #### Android 开发注意事项 针对移动端开发环境下的情况,Android 提供了多种方式支持网络通信,其中 OkHttp 库因其灵活性被广泛采用。它能够很好地兼容 HTTPS 协议以及管理复杂的连接过程包括但不限于自动追踪多个连续发生的转移动作[^3]。 配置样例如下所示: ```kotlin val client = OkHttpClient.Builder() .followRedirects(true) // 自动跟踪所有类型的重定向前缀 .build() val request = Request.Builder().url("http://yourdomain.com").get().build() client.newCall(request).execute().use { response -> println(response.body?.string()) // 输出最终页面内容 } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值