转发和重定向的本质区别 简洁明了
来源:互联网 发布:南方大数据100指数雪球 编辑:程序博客网 时间:2024/06/06 00:18
本质区别:
一句话概括:重定向是客户端行为,转发是服务器行为.
1.请求次数:
重定向:重定向行为是做了两次请求,及产生了两个request对象,重定向会导致request对象信息丢失。
请求转发:转发做了一次请求, 浏览器的地址栏一直是第一次请求的地址。转发是服务器内部request/response控制权的移交。
2.请求资源地址:
重定向:web组件可以将请求重定向到任意一个url,而不仅仅是同一个应用。
重定向的源组件与目标组件不共用同一个HttpServletRequest对象,因此不能在request范围内共享数据。
请求转发:转发的源组件与目标组件必须在同一个应用中,两者可以在request范围内共享数据。
工作流程:
1.重定向
浏览器发出http请求 >> 服务器接受请求并发送302状态码和新的对应的url到浏览器 >>
浏览器接收响应并自动请求新的url >> 服务器接收请求并寻找客户所需的资源响应到浏览器
2.转发
浏览器发出http求其 >> 服务器接收请求 >> 服务器调用内部的一个方法在容器内完成请求处理和转发动作 >>
将客户所需资源发送到浏览器
调用方式:
1.重定向:
1).response.sendRedict(url);
2).response.setState(302);
response.setHeader("location",url);
2.转发:
1).request.getRequestDispatcher(url).forward(request,response);
2).request.getRequestDispatcher(url).include(request,response);
3).<jsp:forward page=url />
以上来自:http://my.oschina.net/mlongbo/blog/76135
package com. control;
import java. io. IOException;
import java .io .InputStream ;
import java .io .PrintWriter ;
import javax. servlet. ServletException;
import javax .servlet .ServletInputStream ;
import javax. servlet. http. HttpServlet;
import javax. servlet. http. HttpServletRequest;
import javax. servlet. http. HttpServletResponse;
public class UserLoginServlet extends HttpServlet
{
public void doGet (HttpServletRequest request , HttpServletResponse response ) throws ServletException, IOException{
this. doPost (request , response) ;
}
public void doPost (HttpServletRequest request , HttpServletResponse response ) throws ServletException, IOException{
//http://localhost:8080/USerLogin
String password = request. getParameter ("password" );
String username = request. getParameter ("username" );
//1,转发、重定向之后的代码还会执行,不要对request、response进行操作以免影响结果,
// 合理的做法应该什么都不要操作,因为请求已经移交到下一步了。(别管转发是服务器自己移交下一步,还是重定向告诉浏览器请求另一个资源)
// request.getRequestDispatcher("MyHtml.html").forward(request, response);
// response.sendRedirect("MyHtml.html");
// System.out.println("111111");
if (username . equals( password)){
//2,转发与重定向都可以使用 url?key=value的方式传值
// response.sendRedirect("loginOk2. jsp?name="+username +"2");
request. getRequestDispatcher ("loginOk.jsp?name=" +username +"2" ). forward( request, response );
//3,如果转发或者重定向到同一个地址,如果没有错误的情况下回进入死循环。
// 转发:重复调用本 servlet,ruquest 可以传值,
// 重定向:浏览器重复请求本 servlet(下图会有浏览器请求地址截图),但是由于request已经是另一个所以取不到值,上面的 username是null,所以if会报空指针
// response.sendRedirect("UserLoginServlet");
// request.getRequestDispatcher("UserLoginServlet").forward(request, response);
// 4,其他1:另外要注意:它不能改变浏览器地址,刷新的话会导致重复提交
// 其他2:转发更加高效,在转发 可以满足需要时,尽量使用RequestDispatcher.forward()方法.
// 其他3: 注:在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRequest()方法
} else {
response. sendRedirect ("loginFall.jsp?name=" +username +"2" );
//
}
}
}
实例代码:http://download.csdn.net/detail/zhanghongzheng3213/9557678
servlet 表单提交示意图:
servlet 表单提交示意图:
0 0
- 转发和重定向的本质区别 简洁明了
- 转发和重定向的本质区别
- 转发和重定向的区别
- 转发和重定向的区别
- 转发和重定向的区别
- 转发和重定向的区别
- 转发和重定向的区别
- 转发和重定向的区别
- 重定向和转发的区别
- 转发和重定向的区别
- 转发和重定向的区别
- 转发和重定向的区别!
- 转发和重定向的区别
- 转发和重定向的区别
- 转发和重定向的区别
- JSP转发和重定向的区别
- 转发和重定向的区别
- 转发和重定向的区别
- 扩展欧几里德
- 验证当前日期是否为一年中最后一天,否则,默认返回当前日期前一年的最后一天日期
- 百度鹰眼Android SDK 运行配置
- SDO处理(二)
- 解决php网页运行超时问题:Maximum execution time of 30 seconds exceeded
- 转发和重定向的本质区别 简洁明了
- 指针
- JAVA除法保留小数点后两位的方法
- 第13周 阅读程序2-(1)交通工具类
- MySQL的索引结构
- 项目部署到远程服务器出现Unsupported major.minor version 51.0问题及解决方法
- 模板匹配
- 关于OPEN_CURSORS和SESSION_CACHE_CURSORS参数值的设定
- 获取url问号后的参数方法