重定向(Redirect)相关的几个问题

此次挂接用户中心,交互大都通过重定向( Redirect )实现。期间也遇到了一些问题,总结如下。

Redirect 原理及使用

1. 重定向原理
重定向方式是在客户端作的重定向处理。该方法通过修改 HTTP 协议的 HEADER 部分 , 对浏览器下达重定向指令的,让浏览器对在 location 中指定的 URL 提出请求,使浏览器显示重定向网页的内容。
该方法可以接受绝对的或相对的 URLs 。如果传递到该方法的参数是一个相对的 URL ,那么 Web container 在将它发送到客户端前会把它转换成一个绝对的 URL 。

2. sendRedirect 可以将页面跳转到任何页面,不一定局限于本 web 应用中。用法如下:

response.sendRedirect("/login.jsp");

response.sendRedirect("http://union.baidu.com");

3. 跳转后浏览器地址栏变化。

4. 这种方式要传值出去的话,只能在 url 中带 parameter 或者放在 session 中,无法使用 request.setAttribute 来传递。

Redirect vs Forward

1. Forward 重定向是在容器内部实现的同一个 Web 应用程序的重定向,所以 forward 方法只能重定向到同一个 Web 应用程序中的一个资源,重定向后浏览器地址栏 URL 不变,而 sendRedirect 方法可以重定向到任何 URL ,因为这种方法是修改 http 头来实现的, URL 没什么限制,重定向后浏览器地址栏 URL 改变。

2. forward 重定向将原始的 HTTP 请求对象( request )从一个 servlet 实例传递到另一个实例,而采用 sendRedirect 方式两者不是同一个 application 。

3. 基于第二点,参数的传递方式不一样。 forward 的 form 参数跟着传递,所以在第二个实例中可以取得 HTTP 请求的参数。 sendRedirect 只能通过链接传递参数, response.sendRedirect(“login.jsp?param1=a”) 。

Ajax 请求处理重定向

对于 Ajax 请求,客户端不会处理该 302 的重定向请求,即页面无响应。

当我们请求发生在服务器 session 失效下,服务器自动 302 到登录页面,那我们异步获取的是登录页面的数据。事实上,并没有发生失败事件,浏览器会再发一次 ajax 请求到 302 的地址,如果还是发生 302 ,一直请求,直到完成请求或者请求跨域失败为止。对于 js 来说, 301 302 这种跳转是透明的,无法处理。

那到底如何当 ajax 正确处理 302 呢,这是浏览器级别的问题,也就是说没有浏览器能正确处理 302 。

对于我们前端来说,正确的验证 ajax 回来的数据,并给出提示,那也不友好(比如服务器端希望我们去登录页面)。更友好的处理是当服务器端发生 302 ,那 ajax 就当 " 错误 " 处理,也做 302 跳转。

后一种修改方式(某产品线目前所采用的方案)即向 ajax 中添加对 302 的处理。这需要修改 common.js 中 Ajax 类,以及 dwr 源代码,添加对 302 重定向的处理(跳转到登陆页)。

xml.onreadystatechange = function() {

。。。

else if(xml.status == 302 && success) {

       location.href="/ ×× /login.jsp";

} else if

。。。

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值