HTTP通信中的请求转发和请求重定向

HTTP通信中的请求转发和请求重定向

    在HTTP通信和Java Web开发中,经常会用到请求转发和请求重定向,它们两个有很大的区别:
    首先,请求转发是指:一个Web资源在收到一个客户端的请求后,去掉用另外一个资源进行处理,这个过程请称为请求转发。很明显,请求转发是发生在Web服务器端的,客户发发出Request,服务端在内部进行forward,然后把最终的结果Response给客户端。
    请求重定向则是一个交互的过程,一个Client在请求服务器的过程中,服务器通知Client去访问另一个资源称为请求重定向,服务器在Response头中会加入Location字段,客户端在收到这个Response后发现有Location字段,则就重新向Location指定的URL重新发送一次请求。
    在Servlet中,请求转发的典型用法是:    
request.getRequestDispatcher(arg0).forward(request,response);
    从上面代码可以看出,一个资源收到了一个request,然后调用它的getRequestDispatcher函数,来找到另一个资源,再通过forward方法把原始的request和response传过去。对Client来讲,它只发送了一次请求,得到了一次回应。
    请求重定向的使用代码如下:
response.sendRedirect(arg0);
    很明显可以看出,重定向是发生在response中,sendRedirect方法就是在HTTP协议响头中添加Location字段。

    关于请求转发和请求重定向,还有如下细节区别:
    1. RequestDispatcher.forward方法只能将请求转发到同一Web站点的其它组件,而HttpServletResponse.sendRedirect方法不仅可以将请求重定向到同一Web站点的其它资源,还可以仅用绝对的URL 地址重定向到别的站点。
    2. 浏览器发出请求后,HttpServletResponse.sendRedirect直接做出响应,响应的内容就是重定向到另一个URL,而RequestDispatcher.forward方法去将请求转发给另一个资源,另一个资源处理后,再将处理的结果返回给浏览器。
    3. 请求重定向发生后,浏览器地址栏中的URL发生变化,由初始请求的URL变为重定向后的URL。请求转发的过程中,浏览器地址栏中的URL并未发生变化,浏览器不知道服务器器做了什么事情。
    4. 对于RequestDispatcher.forward方法,调用者和被调用者共享同一个request对像和response对像,它们处理的是同一个请求和响应的过程。对于sendRedirect方法,调用者和被调用者使用的是各自的request对像和response对像,它们属于两个独立的请求和响应过程。
    5. sendRedirect方法的相对URL以“/”开头表示相对于整个WEB站点的根目录,RequestDispatcher对像的相对URL以“/”开头表示当前WEB应用的根目录。

发布了105 篇原创文章 · 获赞 34 · 访问量 27万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章