深入分析重定向和转发

来源:互联网 发布: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、请求和响应对象;

1

2

3

** 调用目标Servlet的service方法,发出请求,读取信息后使用sendRedirect方法重定向,并将service返回,读取响应消息,作出响应;

4

5

6

7

** 返回重定向的Http信息给浏览器;

8

** 接着浏览器再次向服务器发出重定向的请求;

9

** 经过请求后,再次创建一个Servlet、response和request对象,再次调用service方法,并读取请求信息和写入响应信息;

10

11

12

13

** 调用service返回信息后,web应用读取响应信息,并向浏览器作出响应;

14

15

16

请求转发(sendRedirect)的原理

** 当浏览器向服务器发出Http请求时,首次创建Servlet、请求和响应对象;

1

2

3

** 调用service方法,读取请求信息和写入响应信息;

4

5

6

** 向web服务器发出forword命令,web服务器再次访问Servlet,并调用service方法,读取相关信息;

7

8

9

** 返回时服务器读取响应信息,并向浏览器作出响应;

10

11

12

重定向和转发的区别

**重定向过程中浏览器会向服务器发送两次,意味着有两个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
原创粉丝点击