转载自:http://hi.baidu.com/fboosjgvuvckore/item/405a1cd7be2c36e3795daa8b

此次挂接用户中心,交互大都通过重定向(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

。。。

}

最新文章

  1. Java04
  2. xcode 常见错误报错问题!
  3. 【BZOJ】1513: [POI2006]Tet-Tetris 3D
  4. iOS实现书架布局样式【一些电子书的首页】
  5. placeholder在不同浏览器下的表现及兼容方法
  6. VMWare虚拟机下为Ubuntu 12.04.1配置静态IP_转
  7. Using CSV-Format Log Output
  8. 推荐系统之LFM
  9. C#入门基础
  10. VIM配置(转载)
  11. MTK Android Driver知识大全
  12. Silk Icons —— 再来 700 个免费小图标
  13. 如何优雅的关闭Java线程池
  14. 美团App用户界面分析
  15. 魔力Python--if __name__ == '__main__' 的理解
  16. bash内置命令mapfile:读取文件内容到数组
  17. P2050 [NOI2012]美食节
  18. 【洛谷P1972】HH的项链 离线+树状数组
  19. LeetCode OJ 47. Permutations II
  20. Hadoop3集群搭建之——安装hadoop,配置环境

热门文章

  1. struts2 中怎样获取HttpServletReqest
  2. Centos7 Zookeeper 集群安装
  3. elicpse
  4. Selenium_RC环境配置
  5. Windows 常用快捷方式
  6. 使用docker-compose编排django、mysql实战
  7. E-commerce 中促销系统的设计
  8. Ubuntu16.04中MySQL之中文不能插入问题
  9. QQ分享-定制分享卡片
  10. java并发编程中CountDownLatch和CyclicBarrier的使用