深入分析重定向和转发
来源:互联网 发布:51软件测试业余班 编辑:程序博客网 时间:2024/05/07 19:36
在上篇中提到response和request对象中都实现重定向和请求转发,那么这其中蕴藏的原理和两者之间的区别又在何处呢?
重定向(RequestDispatcher)
客户发送一个请求到服务器,服务器匹配servlet,这都和请求转发一样,servlet处理完之后调用了sendRedirect()这个方法,这个方法是response的方法,所以,当这个servlet处理完之后,看到response.senRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问test.jsp,紧接着客户端受到这个请求后,立刻发出一个新的请求,去请求test.jsp,这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应。
请求转发(sendRedirect)
客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的test.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完成的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在jsp中都能取出来,因此,jsp能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回给客户端。整个过程是一个请求,一个响应。
具体的原理
重定向(RequestDispatcher)的原理
** 当浏览器向服务器发出Http请求时,首次创建Servlet、请求和响应对象;
** 调用目标Servlet的service方法,发出请求,读取信息后使用sendRedirect方法重定向,并将service返回,读取响应消息,作出响应;
** 返回重定向的Http信息给浏览器;
** 接着浏览器再次向服务器发出重定向的请求;
** 经过请求后,再次创建一个Servlet、response和request对象,再次调用service方法,并读取请求信息和写入响应信息;
** 调用service返回信息后,web应用读取响应信息,并向浏览器作出响应;
请求转发(sendRedirect)的原理
** 当浏览器向服务器发出Http请求时,首次创建Servlet、请求和响应对象;
** 调用service方法,读取请求信息和写入响应信息;
** 向web服务器发出forword命令,web服务器再次访问Servlet,并调用service方法,读取相关信息;
** 返回时服务器读取响应信息,并向浏览器作出响应;
重定向和转发的区别
**重定向过程中浏览器会向服务器发送两次,意味着有两个Servlet,整个过程有两个请求,两个响应,而请求转发过程只是有一个Servlet,整个过程是一个请求,一个响应。
**重定向过程中,浏览器地址会发生变化,而请求转发过程浏览器地址则不会。
!!!PS:一般情况下,能使用请求转发技术则使用请求转发,因为重定向存在的弊端还是比较多,除了有些特殊应用场景必须使用重定向技术,
例如:
/** * 需求:实现referer防盗链的现象 * * @author 芷若初荨 * */public class FangdaoLian extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub String referer=req.getHeader("referer"); if(referer==null||referer.startsWith("http://localhost")){ //!!!此处采用重定向的原因:重定向会是地址发生变化,这样可以让用户看到页面显示结果,如果使用转发forword,那么地址不会发生变化,那么用户就不会发生变化。 resp.sendRedirect("/ResponseTest/index.jsp"); } String data="芷若初荨"; resp.getWriter().write(data); /* * jsp代码中: * body中: * 1.<a href="Response/servlet/FangdaoLian">查看图书</a> * 2.<br/>广告<br/> * 3.<a href="Response/servlet/MessyCodeTest">中文乱码解决方法</a> * 用户如果看到有兴趣的内容想要查看,那么想要点击链接2,那么会跳转到另一个页面显示 * */ } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub doGet(req, resp); }}
这正是上篇中提到的如何实现防盗链现象的设计中,需要让页面跳转后用户仍能看到想要看到的显示页面,重定向会是地址发生变化,如果使用转发forword,那么地址不会发生变化,那么用户就不会发生变化,因此在这里只能使用重定向。
0 0
- 深入分析重定向和转发
- 深入理解Servlet转发和重定向
- 深入理解Servlet转发和重定向
- 深入理解Servlet转发和重定向
- 深入理解Servlet转发和重定向
- 深入理解Servlet转发和重定向
- 深入理解Servlet转发和重定向
- 转发和重定向
- 转发和重定向
- 转发和重定向
- 重定向和转发
- 转发和重定向
- 转发和重定向
- 重定向和转发
- 转发和重定向
- 转发和重定向
- 转发和重定向
- 重定向和转发
- 【Spring Boot教程】快速搭建spring boot项目工程
- LeetCode题目:338. Counting Bits
- 根文件系统的原理——Linuxrc本质,rootfs有哪些目录,VFS简介
- Java 对象比较
- 链表--素数链表
- 深入分析重定向和转发
- Bat编写参考
- 排序(2)二分排序、快速排序、归并排序
- printf函数常用的输出方式及格式化输出说明
- memset用法小结
- QT中QToolBar中如何添加QAction控件
- Python3抓取糗百、不得姐、kanqu.com
- How much the cost of an APP development?
- 如何实现Builder模式