servlet请求转发和重定向区别

我们知道,在servlet中实现页面的跳转有好几种方式
现在从以下几个方面来探究一下比较常用的 请求转发重定向 有什么区别!!!

1. 跳转方式
2. 能否跳转外网
3. 能否访问安全目录中页面
4. 能否获取setAttribute中的值


首先配置好相关资源
新建一个web项目,在WebContent目录下新建 index.jsp , login.jsp ,在WEB-INF目录下新建safe.jsp,为了区分这些页面,文件里面写的内容是本文件的名字。之后在src中创建一个servlet包,包里新建一个servlet,命名为TestServlet,作为实验使用。

servlet请求转发和重定向区别

将index.jsp作为发送请求的页面,写入下面代码:

<a href="./TestServlet">跳转</a>

意思是点击这个链接,将会向服务器发送TestServlet请求,因此我们在TestServlet中分别写两种不同的方式。

下面开始探究每个方面的区别!!!


1.跳转方式

package servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		
	}

}

这是没有写处理方式的TestServlet代码,我们将在doGet方法中写两种不同的处理方式。

重定向

response.sendRedirect("login.jsp");

这是重定向方式的处理代码,大致处理方式就是服务器向客户端做出响应,响应需要客户端再向服务器发送另一个请求,也就是括号中的请求,最终服务器响应给你login.jsp中的内容。servlet请求转发和重定向区别
这是准备发送请求的页面,点击跳转
servlet请求转发和重定向区别
这是响应结果,我们发现现在上面地址变成了:http://127.0.0.1:8080//blog_jsp_请求转发/login.jsp,说明确实是直接跳转到了这个页面。

请求转发

request.getRequestDispatcher("login.jsp").forward(request, response);

这是重定向方式的处理代码,大致处理方式就是服务器将发来的请求转发给了指定的地址,最终在这个请求中显示出来。

servlet请求转发和重定向区别
这是准备发送请求的页面,点击跳转

servlet请求转发和重定向区别

这是响应结果,我们发现现在上面地址为:http://127.0.0.1:8080//blog_jsp_请求转发/TestServlet,说明客户端只发了一个请求,仅仅是将其它页面的内容显示了出来。


2. 能否跳转外网

将跳转的地址改为外网地址,例如百度:http://www.baidu.com.

重定向

response.sendRedirect("http://www.baidu.com");

可以跳转到外网。

请求转发

request.getRequestDispatcher("http://www.baidu.com").forward(request, response);

不能跳转到外网。


3. 能否访问安全目录中页面

在项目中,WEB-INF文件夹存储的文件安全性是比较高的,我们通过地址无法直接访问,那么,这两种跳转方式哪个可以访问到呢?

重定向

response.sendRedirect("/WEB-INF/safe.jsp");

不能访问safe.jsp

请求转发

request.getRequestDispatcher("/WEB-INF/safe.jsp").forward(request, response);

可以访问safe.jsp

结合上面的跳转方式也不难理解:
重定向其实就相当于客户端又重新向服务器发送了一个请求,请求safe.jsp页面的内容,与我们直接通过地址访问没有什么区别,当然无法访问安全目录了。
请求转发则是自己转发请求,将请求来的内容显示在自己页面上,可以访问安全目录也是可以理解的。


4. 能否获取setAttribute中的值

如果在TestServlet新建了一个setAttribute,那么在请求之后的内容是否能够获取得到呢?

我们在login.jsp页面新增一行代码:(这样可以知道请求后的内容是否获取了setAttribute的内容)

${yes }

重定向

request.getSession().setAttribute("yes", "yes");
response.sendRedirect("login.jsp");

并没有显示"yes",说明没有获取setAttribute中的内容。

请求转发

request.getSession().setAttribute("yes", "yes");
request.getRequestDispatcher("login.jsp").forward(request, response);

显示"yes",说明获取到了setAttribute中的内容。

同样结合上面的跳转方式理解:
重定向 :服务器在看到 response.sendRedirect(“login.jsp”); 这行代码时先执行,立刻给客户端返回响应,使其发送另一个请求,而这时候setAttribute还没有建立起来,因此没有获取到setAttribute中的内容。

请求转发:服务器依此执行代码,先建立setAttribute,执行到最后请求转发代码,才开始转发请求,显示内容,这个时候setAttribute已经执行,因此可以获取到setAttribute中的内容。


总结

最后来总结一下两种方式各自的作用:

重定向:跳转外网

请求转发:访问WEB-INF安全目录内容获取servlet中setAttribute内容

上一篇:在无法判断是否会出错的情况下进行的操作


下一篇:[HTML5] Add an SVG Image to a Webpage and Get a Reference to the Internal Elements in JavaScript