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


    转载自: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

    。。。

    }


  • 相关阅读:
    flash时间控制
    内联元素及其特性 &块元素
    清除浮动两种方法
    ie6 lineheight失效 待测试
    表单 文字和输入框对齐的最简单的方法
    ie6bugie6默认的最小高度是设定字体的高度
    CSS triangle generator
    解释性的语言vs编译性语言
    outerHeight(options)
    获取input的value值得 jQuery插件
  • 原文地址:https://www.cnblogs.com/ycpanda/p/3637148.html
Copyright © 2020-2023  润新知