请求转发和重定向
1 2 3 4
| request.getRequestDispatcher(url).forward(req,resp)
response.sendRedirect(url)
|
请求转发forward
请求转发是将一个请求转到服务器的另一个资源,在处理完初步请求另外的资源之后生成响应,使用的是RequestDispatcher.forward方法来实现的,先看一下RequestDispatcher这个接口是什么
RequestDispatcher接口
RequestDispatcher的实例是由Servlet引擎创建的,用于包装一个要被其他资源调用的资源,并可以通过其中的方法将客户端的请求转发给所包装的资源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| public interface RequestDispatcher {
static final String FORWARD_REQUEST_URI = "javax.servlet.forward.request_uri";
static final String FORWARD_CONTEXT_PATH = "javax.servlet.forward.context_path";
static final String FORWARD_PATH_INFO = "javax.servlet.forward.path_info";
static final String FORWARD_SERVLET_PATH = "javax.servlet.forward.servlet_path";
static final String FORWARD_QUERY_STRING = "javax.servlet.forward.query_string";
static final String INCLUDE_REQUEST_URI = "javax.servlet.include.request_uri";
static final String INCLUDE_CONTEXT_PATH = "javax.servlet.include.context_path";
static final String INCLUDE_PATH_INFO = "javax.servlet.include.path_info";
static final String INCLUDE_SERVLET_PATH = "javax.servlet.include.servlet_path";
static final String INCLUDE_QUERY_STRING = "javax.servlet.include.query_string";
public static final String ERROR_EXCEPTION = "javax.servlet.error.exception";
public static final String ERROR_EXCEPTION_TYPE = "javax.servlet.error.exception_type";
public static final String ERROR_MESSAGE = "javax.servlet.error.message";
public static final String ERROR_REQUEST_URI = "javax.servlet.error.request_uri";
public static final String ERROR_SERVLET_NAME = "javax.servlet.error.servlet_name";
public static final String ERROR_STATUS_CODE = "javax.servlet.error.status_code";
public void forward(ServletRequest request, ServletResponse response) throws ServletException, IOException;
public void include(ServletRequest request, ServletResponse response) throws ServletException, IOException; }
|
请求重定向sendRedirect
重定向使用的是response.sendRedirect方法,sendRedirect方法会产生一个302的响应码和Location的响应头,从而通知客户端去重新访问Location响应头中指定的URL,此时会创建一个新的请求。一般用于避免用户的非正常访问。
1 2
| response.sendRedirect(url);
|
除了可以使用response.sendRedirect方法,还可以通过手动的设置所跳转的地址
1 2
| response.setStatus(302); response.setHeader("Location","所要重定向的地址")
|
两者的区别
本质区别:请求转发是在服务器内部转发,重定向是在客户端转发
请求转发只向服务器发起一次请求,重定向发起两次请求
请求转发:可以保持request的parameter,attribute这些值
重定向:丢弃request的parameter,attribute这些值
请求转发:地址是初次发出请求的地址
重定向:地址栏是最后响应的地址
请求转发:在最终的Servlet中,request对象和中转的那个request是同一个对象
重定向:在最终的Servlet中,request对象和中转的那个request不是同一个对象
请求转发:只能转发到当前web应用
请求重定向:可以重定向到任何资源
请求转发:/代表当前web应用的根目录
请求重定向:/代表当前web站点的根目录,要使用request.getContextPath()再加上路径