请求转发和重定向区别

请求转发和重定向区别

标签 : servlet


对于初学者来说,什么时候该用请求转发什么时候该用重定向,是比较容易搞混的一些知识点,下面就详细的来区分一下,两者的区别。

1、请求转发

①请求转发的介绍

请求转发的固定代码:
request.getRequestDispatcher("/s3").forward(request, response);
请求转发的路径是由服务器内部发起的,所以服务器路径

②请求转发的注意事项

 1、请求转发 不会改变地址栏的路径
 2、请求转发 代码执行完毕后,会接着回来执行转发后的代码

    业务会出错例如:
    发现注册失败了,
        请求转发到失败页面,然后显示失败信息
        请求转发后面的代码是注册成功的代码
    建议:
        请求转发代码后面尽量直接加return。特殊业务除外【过滤器再详细介绍】

 3、请求转发N次,响应1次。由最后的Servlet生成响应
 4、请求转发只能跳转本项目内部资源,不能跳转其他项目甚至外网
 5、执行请求转发代码的Servlet,不要执行任何写流操作,因为执行请求转 发代码会清除缓冲区。不要自己flush(),否则后面的请求转发失败抛异常。
 6、请求转发中存在request作用域
 7、请求转发可以 转发到受保护目录 的资源
 8、请求转发中,get的请求转发还是是get请求,post请求转发还是post请求。
 9、请求转发的效率高,因为①服务器内部跳转,没有网速因素②没有主动写响应信息

③请求转发的本质

1、共享request作用域的属性,共享request的参数信息,同时还可以转发时候讲参数改变,代码如下所示:

request.getRequestDispatcher("/sc?username=xiaohong").forward(request, response);

2、在请求转发中,request对象并不是同一个,旧的request数据复制给了新的request对象response对象请求转发中,都是同一个

2、重定向

    重定向固定代码:`response.sendRedirect(path);`  //客户端的路径为绝对路径。
     1、重定向会改变地址的;
     2、重定向N次,响应/请求 N+1次
     3、重定向可以定位到任意资源,包括外网资源
     4、重定向代码尽量不要写 写流【响应体】操作。因为网速快的时候,自动请求会极快得到响应,覆盖之前的响应内容。 只有网速极差的时候,才能看到响应体一次。即:写了也白写。
     5、重定向不存在request作用域
     6、重定向无法访问受保护目录资源 (eg:WEB-INF中的)
     7、重定向get请求重定向后还是get;而post重定向是get请求,相当于在浏览器上写了地址直接回车进入
     8、重定向效率不高。①受网速限制 ②每次重定向都要生成对应的响应信息

什么时候用重定向,什么时候使用请求转发

     ① 是否需要修改地址。,如果需要修改地址,用重定向,如果不需要修改地址
     ② 效率高 ,用请求转发
     ③ 是否需要定位外网资源。 如果需要定位外网---重定向; 如果是内网本项目---建议用请求转发
     ④ 如果需要使用request作用域 。使用请求转发
     ⑤ 如果需要访问受保护目录资源。 使用请求转发。

猜你喜欢

转载自blog.csdn.net/little_calf/article/details/52348368