XMLHttpRequest 如何处理 redirect (转)

当用XMLHttpRequest (或者其它ajax框架) 请求一个url (例如index.do), 而这个请求被redirect到另一个url (例如home.do)

例如Struts Action中return new ActionForward("home.do", true);
服务器返回

HTTP/1.1 302 Found
Date: Thu, 01 Dec 2005 02:00:24 GMT
Server: Apache/1.3.33 (Unix) PHP/4.4.0 mod_ssl/2.8.24 OpenSSL/0.9.7e
X-Powered-By: PHP/4.4.0
Location: home.do

这种情况下,XMLHttpRequest是如何处理的?

XmlHTTPRequest的行为将依赖用户浏览器。一般来说XmlHTTPRequest不能得到这个消息头,也不能得到http 302的状态码,而是直接继续访问跳转页面Location: testpost.php,如果访问成功,直接返回http状态码200,并读取得到此页面的文本输出。
  • IE : 没有相关配置,只会进行上述行为。
  • Opera : 有“是否允许自动重定向”设置。如果用户不允许自动重定向则xmlHTTPRequest能接收到302信息,xmlHttpRequest不会继续跳转。
  • Firefox : 有一个选项network.http.redirection-limit(20),这个选项是用户所允许的重定向次数。如果设置成0,那么很遗憾,XmlHTTPRequest接收不到任何信息。

原文地址
http://dulao5.blog.hexun.com/2491050_d.html
### 处理HTTP 302重定向的方式 当遇到HTTP状态码302时,表示服务器希望客户端访问新的资源位置。然而,默认情况下某些工具(如`HttpClient`)不会自动处理这种跳行为[^1]。为了正确应对这种情况,可以采取以下方法: #### 使用Java中的HttpURLConnection 在Java中可以通过设置`HttpURLConnection`的相关属性来手动获取并跟随302重定向链接。例如,创建一个连接对象后,需启用允许跟随重定向的功能: ```java HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); conn.setInstanceFollowRedirects(true); // 启用自动跟随重定向 int responseCode = conn.getResponseCode(); // 获取响应码 if (responseCode == HttpURLConnection.HTTP_MOVED_TEMP || responseCode == HttpURLConnection.HTTP_MOVED_PERM) { String redirectUrl = conn.getHeaderField("Location"); // 提取Location字段作为目标地址 } ``` 上述代码片段展示了如何检测是否存在重定向以及提取对应的URL路径[^2]。 #### Ajax请求中的特殊考虑 对于基于浏览器环境下的Ajax调用来说,由于XMLHttpRequest本身会尝试遵循同源策略限制,因此即使服务端返回了一个有效的302跳指令,但如果目标站点位于不同域名下,则可能会触发跨域异常情况[^3]。此时建议要么调整API设计避免不必要的外部跳操作,或者借助CORS机制开放必要的权限给前端应用使用。 #### Android平台上的实践案例 针对移动开发领域,在Android应用程序里执行网络通信任务时常遇见类似的挑战——即从普通的HTTP协议迁移到更安全的HTTPS加密传输过程中可能出现未预期的行为模式。具体而言,如果初始请求指向的是非SSL版本的服务接口却最终被引导至其TLS保护形式的话,那么程序就需要特别注意这一点以便能够顺利过渡而不至于中断用户体验流程[^4]。 总之,无论在哪种编程环境下工作,理解整个过程背后的工作原理都是至关重要的一步。这不仅涉及到简单的编码技巧层面的知识积累,还需要考虑到实际部署环境中可能存在的各种复杂因素影响,比如性能优化、安全性加固等方面的要求[^5]。 ```python import requests def handle_redirect(url): try: session = requests.Session() resp = session.get(url, allow_redirects=True) print(f"Final URL after redirection: {resp.url}") except Exception as e: print(e) handle_redirect('http://example.com') ``` 此Python脚本利用了requests库内置的支持特性简化了对多次连续跳链路追踪的过程管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值