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

。。。

}

重定向(Redirect)相关的几个问题的更多相关文章

  1. .htaccess技巧: URL重写(Rewrite)与重定向(Redirect)

    URL重定向是.htaccess的重头戏,它可以将长地址转为短地址.将动态地址转为静态地址.重定向丢失的页面.防止盗链.实现自动语言转换等.笔者觉得难点是在正则表达式的运用和理解上. 实现所有这些神奇 ...

  2. .htaccess技巧: URL重写(Rewrite)与重定向(Redirect) (转)

    目录 Table of Contents 一.准备开始:mod_rewrite 二.利用.htaccess实现URL重写(rewrite)与URL重定向(redirect) 将.htm页面映射到.ph ...

  3. 重定向redirect与跳转forward区别

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DemoResponse.a ...

  4. thinkphp 重定向redirect

    /** * URL重定向 * @param string $url 重定向的URL地址 * @param integer $time 重定向的等待时间(秒) * @param string $msg ...

  5. thinkphp51 重定向 redirect()

    thinkphp51 重定向 跨域 redirect() 可以重新定义新的路由,是fetch() 无法做到的.

  6. Laravel5:重定向 redirect 函数的详细使用

    Laravel5 中新增了一个函数 redirect() 来代替 Laravel4 中 Redirect::to() 来进行重定向操作.函数 redirect() 可以将用户重定向到不同的页面或动作, ...

  7. 请求转发(forward)和请求重定向(redirect)的区别(转)

    作者:@haimishasha本文为作者原创,转载请注明出处:https://www.cnblogs.com/haimishasha/p/5952129.html 用户向服务器发送了一次HTTP请求, ...

  8. 转发(Forward)和重定向(Redirect)的区别

    转发是服务器行为,重定向是客户端行为. 转发(Forword) :通过RequestDispatcher对象的forward(HttpServletRequest request,HttpServle ...

  9. nodejs 重定向 (redirect + writeHead(Location))

    参考: Node.js实现301.302重定向服务 Express URL跳转(重定向)的实现:res.location()与res.redirect() 一 方式1 index.js var htt ...

  10. CI框架 重定向redirect()

    CI框架不能使用$this->redirect(),只能使用redirect():并且默认重定向地址带有index.php,如果需要去掉,请使用绝对地址. 使用示例: 通过发送HTTP头,命令客 ...

随机推荐

  1. C++:类中的赋值函数

    先来看一个例子: #include<iostream> #include<string> using namespace std; class Student{ public: ...

  2. Chapter 3 软件项目管理

    软件项目具有产品的不可见性.项目的高度不确定性.软件过程的多变化性.软件人员的高流动性的显著特征.有效的软件项目管理集中于人员.产品.过程和项目四个方面.软件项目的生命周期有项目启动.项目规划.项目实 ...

  3. 软件共享平台的NABCD

    Need: 我感觉我们这个软件很适合现在的大学生,特别是大一大二的学生,由于在大学里面学生都在各忙各的,学生遇到问题如果自己在网上查找,这就需要花费大量的时间,如果有了这个软件学生和老师都可以在这个平 ...

  4. js 对象的合并(3种方法)转载

    对象的合并 需求:设有对象 o1 ,o2,需要得到对象 o3 var o1 = { a:'a' }, o2 = { b:'b' }; // 则 var o3 = { a:'a', b:'b' } 方法 ...

  5. contos7忘记root密码怎么办

    首先在这个界面按"e"键 然后呢就会进入到如下图所示的界面,在LANG=zh_CN.UTF8的后面加上 init=/bin/sh, 再按 [ Ctrl + X ] 进入'单用户模式 ...

  6. My复利计算程序测试报告

    My复利计算程序测试报告 4.0 单元测试----------------------------- 要求: 对我们和复利计算程序,写单元测试. 有哪些场景? 期待的返回值 写测试程序. 运行测试. ...

  7. PAT 1068 万绿丛中一点红

    https://pintia.cn/problem-sets/994805260223102976/problems/994805265579229184 对于计算机而言,颜色不过是像素点对应的一个 ...

  8. redis哨兵机制一(转)

    概述 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如 master宕机了,Redis本身(包括它的很多客户端) ...

  9. 无法安装HAXM (VT-X is not turned on)

    安装HAXM的时候,VT-X is not turned on. 进入bios查看,已经启动了vt-x.上网搜索发现解决有一部分电脑是因为安装了Hyper-V,解决的方法: 管理员运行cmd,输入如下 ...

  10. 为什么选择 .NET Core?

     为什么选择.NETCore? 学习新的开发框架是一项巨大的投资.您需要学习如何在新框架中编写,构建,测试,部署和维护应用程序.作为开发人员,有许多框架可供选择,很难知道什么是最适合的.即使您正在使用 ...