Servlet 之转发与重定向的本质区别介绍

目    录

转发与重定向

一、本质区别

二、代码区别及验证

三、运用场景

四、总结


©本文由博主原创,未经允许,不得转载相关博文内容


  • 转发与重定向

    在学习了JSP之前呢,我们知道 B/S 架构的软件,通常都是由用户想进行某种行为,此时点击了浏览器上的某些网址才出现的各种丰富多彩的页面。例如,CSDN上面的这些导航栏。

    我们只要点击了某个选项,浏览器就会刷新一个新的页面。不仅如此,此时的地址栏中的网址也会跟随着每个页面的不同而发生改变。这种刷新或跳转到一个新的指定页面的实现方式称为:重定向或转发

一、本质区别

    重定向和转发都能够实现页面的跳转或刷新,但是既然存在两种方式,必定有它们的不同之处。其不同之处中最重要的是转发使用的是同一个 request(请求对象),而重定向则是抵达一个中间 request 之后再重新发送 request 到指定目标。这便是转发与重定向的本质区别。

    更直观的区别是搜索栏中的网址会不会发生改变,将网址称为 URL(Uniform Resource Locator),指服务器上的某一个或多个资源文件,而这些资源文件都会有一个可以给予外部访问的 URL 。

    通过区分转发和重定向的本质,我们知道转发自始自终都使用着同一个 request ,所以转发并不会改变 URL 。而重定向则是通过至少 2 次以上的 request ,这就导致 URL 发生改变。所以,这也是它们的一个更加直观的区别。

二、代码区别及验证

    虽然我们坚信重定向和转发存在这些区别,但是自己不尝试一下总归缺那点意思。所以我打算利用最简单的一个例子,这个例子中有三个 Servlet 容器为 A 、B、C。我对 A 进行请求,对请求中置入一个属性值,到 B 去接收,如果能接收到且 URL 不发生改变,那便验证了我们的结果。

A 中代码:

package com.xww;

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

@WebServlet("/A")
public class A extends HttpServlet {
	private static final long serialVersionUID = 1L;

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

		response.getWriter().println("AAAAA");
		request.setAttribute("A", "AAAAA");
		// 重定向到 C
//		response.sendRedirect("C");
		// 转发到 B
		 request.getRequestDispatcher("B").forward(request, response);
	}
}

B中代码:

package com.xww;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/B")
public class B extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.getWriter().print("This is B");
		response.getWriter().print("recieved:" + request.getAttribute("A"));
	}
}

    开始对 A 进行请求:

    结果可想而如,转发的确可以接收到 request 中的属性值,并且 URL 不发生改变,由此证明使用转发的方式,request 自始自终都是同一个 reqeust 对象。

C中代码:

package com.xww;

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

@WebServlet("/C")
public class C extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.getWriter().print("This is C");
		response.getWriter().print("recieved:" + request.getAttribute("A"));
	}
}

    结果已经明了,C 中根本接收不到 A 传来的任何属性值,并且 URL 此时也改为了 C,由此推出重定向发起的 request 到结束时的 reqeust 并不是同一个对象,即这也是收不到值的原因。

三、运用场景

    根据转发与重定向的本质区别,我们从上述代码中也能够看出,重定向可以重定向到任何一个网址,只要能正常打开的。比如我可以在代码中写入 ”http://www.baidu.com“,即重定向到”百度“。

    而转发可想而知,它需要传入的是(request , response)参数,这就已经限制了它仅在本站点(本个Web应用)下访问资源。所以这是它的一个缺点,但是这也是它的一个优点。

    比如,我有一个比较私密的文件不能让浏览器直接输入网址访问,而是通过转发的方式才能够访问(比如下载文件资源)。而WebRoot 目录下的 WEB-INF 目录就是 Web 应用不让外部直接访问的一个目录。

    我现在想通过浏览器直接访问 test.html 页面是不可行的,但是通过转发的方式,便可以成功获取到。

 通过转发可以访问相对隐私的资源文件,从而保证了文件的安全性。并且转发用的都是同一个 request 对象,这个请求只有一个,相对来说速度会快于重定向。

四、总结

    在开发中,如果对于上一个请求页面需要传递参数到下一个请求页面的话(例如表单提交),这种一定要使用转发的方式,否则接收不到值。或者访问本站下比较隐私的资源时,通常也需要用转发。

    其他的一般情况,基本使用重定向就可以了,重定向使用的居多,转发在必要条件下也需要使用。只有明确需求,懂得两种请求的本质区别,才能够更好的掌握运用场景。

©原文链接:https://blog.csdn.net/smile_Running/article/details/86832237

©作者博客 ID:smile_running

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值