请求转发和重定向区别
标签 : 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作用域 。使用请求转发
⑤ 如果需要访问受保护目录资源。 使用请求转发。