当前位置: 首页 > 编程日记 > 正文

JSP中的重定向和请求转发以及它们的区别

我们先硬着头皮看一下重定向的定义:

重定向(Redirect):

客户端浏览器向Web应用服务器端发送一个请求,Web服务器端使用HttpServletResponse的sendRedirect()方法将结果(结果中头信息内HTTP状态码为302,Location响应报头域中保存响应回来的地址)返回给客户端浏览器;客户端浏览器收到服务器端结果后解析其头部信息,然后自动按照头部指定地址以GET方式再次向Web应用服务器端发请求,此时地址栏URL发生变化,服务器端接收到新的请求再将结果返回至客户端浏览器,客户端浏览器解释执行返回结果并将执行结果显示给用户,至此该过程结束。

或许有人看的头大,也有人可能明白了一点,都不要紧,我来解释一下,通俗点说,就是客户端浏览器向Web应用服务器端发送了两次请求,Web应用服务器也返回了两个执行结果给客户端浏览器,只是第一次发请求是手动的,而第二次是自动的。

其中的302是HTTP协议中的一个状态码,百度百科上是这样说的:

对于服务器,通常会给浏览器发送HTTP Location头部来重定向到新的新位置。

用通俗的话说就是,http约定好了,只要浏览器收到服务器给的302,那就是让我(浏览器),再一次提交请求,而这次的请求与上次(请求的是servlet)的不一样,这次请求的是response.sendRedirect("./target.jsp");中的target.jsp页面(当然引号里面是你自己写的目标路径,我这个只是做演示用的,你完全可以写https://www.baidu.com,那第二次请求访问的就是百度页面了)。


这次应该对重定向有大致了解了吧,那我们接着看请求转发的定义:
请求转发(Forward):

这里的“请求”是名词,请求转发指客户端浏览器向Web服务器端发送请求服务器端收到请求进行相应处理再将该请求转发到另外的资源(即这一“转发”操作是在Web服务器端执行的),服务器端对该资源进行处理后反馈给客户端

从定义中我们可以看出请求转发与重定向不同,请求转发客户端浏览器只向Web服务器端发送一次请求,服务器端也只给客户端返回一次处理结果。(其实请求转发最后服务器端也给客户端发了一个状态码:200,表明这个请求已经成功)。

我们来看一个请求转发的代码:request.getRequestDispatcher("./target.jsp").forward(request, response);,我们查一下Dispatcher的意思是调度员,所以请求转发也可以这样理解:客户端浏览器向Web应用服务器发送一次请求(访问servlet),然后服务器端处理到request.getRequestDispatcher("./target.jsp").forward(request, response);改行代码时,知道要跳转了,(这时不需要反馈给客户端)而是直接转发到另外的资源,处理后一并反馈给客户端,此时浏览器地址栏显示的是第一次访问的原地址。(而重定义过程结束后,地址栏中显示第二次访问的地址。


我们再来说一下它们的区别:
重定向和请求转发的区别:

  1. 其实第一个区别我们在上面已经说过了, 但为了便于方便查找,以及保证文章结构清晰,我就再赘述一遍:重定向是浏览器客户端向Web应用服务器端发送两次请求,服务器端也向客户端返回两次处理结果,最后在浏览器地址栏中显示的是第二次访问的地址;而请求转发是浏览器向Web应用服务器端发送一次请求,服务器端也只向客户端返回一次处理结果,最后在浏览器地址栏中显示的是第一次访问的原地址。
  2. 第二个区别是页面的跳转,还记得上面介绍重定向时说过的response.sendRedirect("./target.jsp");吗?引号里也可以写https://www.baidu.com,这样第二次访问的页面就是百度了。所以第二个区别就是重定向对页面的跳转没有限制,可以是本Web应用系统的资源,也可以是其他Web应用的资源;而请求转发处理页面跳转时,跳转的新地址必须是本Web应用系统的资源,不可以访问其他Web应用的资源。
  3. 第三个区别是重定向无法在新的页面获取request.setAttribute("key", "value");中保存的数据,若非要使用<%= request.getAttribute("key") %>获取,则获取到的值为null;而请求转发就可以在新的页面获取到request.setAttribute("key", "value");中保存的数据。
  4. 最后一个区别可以说是请求转发的一个特性:Web项目中WEB-INF文件夹是最安全的目录,该目录内的资源只能通过请求转发获取,重定向的方式无法获取!

相关文章:

想你,是一种美丽

想你&#xff0c;是一种美丽 想你 不论何时何地想你 是一腔热血的唠叨想你 是一地相思泪的燃烧想你 是一弯明月的宣誓想你 是一抹诗情的聚焦 每个路口都有为你守侯的目光每个黄昏都有为你焦急的心你的名字便是祈祷的圣经你的身影便是我梦中永远的天使 即…

通用数据库连接执行类(SQL)

usingSystem;usingSystem.Data;usingSystem.Data.SqlClient;namespacePublic{///<summary>/// CustomADO 数据连接执行类。///</summary>public class CustomADO{#region定义或创建类私有变量或对象private string _connstr; //连接字符串存储变量private …

Alpha冲刺 - (5/10)

Part.1 开篇 队名&#xff1a;彳艮彳亍团队 组长博客&#xff1a;戳我进入 作业博客&#xff1a;班级博客本次作业的链接 Part.2 成员汇报 组员2 黄志铭 过去两天完成了哪些任务学习了逻辑层js与界面的数据传送完成共享编辑的界面以及相关接口接下来的计划1.对之前的界面完成逻…

session对象运行机制

当你看到 “会话” 这个词的时候&#xff0c;你会怎么理解呢&#xff1f;是交流、对话的意思吗&#xff1f;那毫无疑问绝对是的啦&#xff0c;只不过那是传统意义上的&#xff0c;或者说是日常生活中的意思&#xff0c;在计算机科学领域&#xff0c;它的意思就要引申一些了。在…

git查看某个文件的提交历史

git log --prettyoneline 文件名接下来使用git show显示具体的某次的改动。git show <git提交版本号> <文件名>转载于:https://www.cnblogs.com/ppsunlight/p/7095612.html

省市县三级级联(模块化开发)

不废话&#xff0c;上代码&#xff1a; 先看一下项目列表&#xff1a; tool包里的代码&#xff1a; 请看&#xff1a;tool包 vo.Area类&#xff1a; package com.jd.vo;public class Area {private String id;private String name;private String code;private String pa…

IOS - 设置与帮助界面

设置与帮助 改动头像, 改动password, 移动客服, 帮助, 声明, 关于我们. 代码 // // IndexSetting600ViewController.h // SymptomChecker // // Created by wang on 2015-7-21. // //#import "CYTableViewController.h"interface IndexSetting600ViewController …

CentOS虚拟机和物理机共享文件夹实现

CentOS虚拟机和物理机共享文件夹实现过程。 一、 安装VMware Tools VMwareTools的安装脚本是要使用到perl的&#xff0c;而CentOS 6自身不带perl&#xff0c;所以需要自己安装。可以自己下载源代码编译&#xff0c;也可以直接用yum来安装。 yum install perl 2、虚拟机工具栏-…

[讨论]你的女朋友值多少钱?

你的女朋友值多少钱&#xff1f;一个简单的测试可能会告诉我们很多的东西。 女主持人气势咄咄的问一个男嘉宾&#xff0c;你为什么那么在乎钱&#xff0c;男嘉宾说&#xff1a;“钱能买到一切!” 现场的观众哗然了。 男嘉宾微笑的说&#xff1a;“我们做个测试吧。” 一个很简单…

庆祝天津.Net俱乐部成立,辛苦TerryLee了,感谢dudu!

终于等来了天津.Net俱乐部的成立&#xff0c;欢迎天津热心.Net的人士申请加入&#xff01; 转载于:https://www.cnblogs.com/anchky/archive/2006/03/21/354946.html

软件工程专业1

任何软件系统开发的共同本质&#xff1a; – 从现实空间的需求到计算机空间的软件代码之间的映射与转换&#xff1b; 软件工程本质&#xff1a; 用严格的规范和管理手段来缩小偏差&#xff0c;通过牺牲“时间”来提高“质量”。 软件工程的两个映射&#xff1a; 概念映射&#…

动态网页项目(Dynamic Web Project)2.5和3.0版本的差异

我们知道在2.5版本中都有web.xml&#xff0c;用来配置servlet&#xff1a; 但3.0版本却没有web.xml&#xff0c;那该怎么配置servlet呢&#xff1f; 解决的方法就是使用注解&#xff1a; 而且在注解中配置servlet非常方便&#xff01; 那如果想在3.0中也使用web.xml该怎么办…

New LINQ CTP!

FYI, we just released an updated community preview of our LINQ support for both VB and C#, entitled “Microsoft Visual Studio Code Name “Orcas” Language-Integrated Query, May 2006 Community Technology Preview.” Or you could just call it “the May CTP.”…

mybatis的一些基础问题

拿实体类中的属性 userPhone 来说&#xff1a; mapper 文件 转载于:https://www.cnblogs.com/py1994/p/7097808.html

(zt)Web 2.0奔路进行时

Web 2.0奔路进行时作者 黄昆Web2.0不是独立存在的&#xff0c;在2006年将会全面融入互联网&#xff0c;这种融入并不意味着Web2.0以及Web2.0所代表的创新浪潮的消退&#xff0c;反而将以这种充满活力的创新方式引发互联网产业格局的巨大变革。Web2.0&#xff0c;在奔跑。发展到…

each(callback)与each(object[,callback])的区别

each(callback)与each(object[,callback])的区别&#xff1a; 1. 调用对象不同&#xff0c;前者必须使用jQuery对象调用&#xff1b;后者只能使用$调用&#xff1b; 2. 遍历对象不同&#xff1a;前者遍历的是jQuery对象&#xff1b;后者还可以遍历数组等非jQuery对象。我们来看…

Microsoft .Net Remoting系列专题之二:Marshal、Disconnect与生命周期以及跟踪服务

Microsoft .Net Remoting系列专题之二 一、远程对象的激活 在Remoting中有三种激活方式&#xff0c;一般的实现是通过RemotingServices类的静态方法来完成。工作过程事实上是将该远程对象注册到通道中。由于Remoting没有提供与之对应的Unregister方法来注销远程对象&#xff0…

luogu P2759 奇怪的函数 二分答案+数论

题目描述 使得 x^x 达到或超过 n 位数字的最小正整数 x 是多少&#xff1f; 输入输出格式 输入格式&#xff1a; 一个正整数 n 输出格式&#xff1a; 使得 x^x 达到 n 位数字的最小正整数 x 输入输出样例 输入样例#1&#xff1a;11 输出样例#1&#xff1a;10 说明 n<2000000…

前端性能毫秒必争方案(一)HTTP请求

在讲http知识之前&#xff0c;有必要提及下网络七层协议OSI(Open System Interconnect)的缩写 犹如水浒里面的七星聚义&#xff0c;没这七星&#xff0c;就没有108将。(已经放置文章最后面) 2. 减少http请求次数原因在于 1、Http连接 RequestHeader 的开销 众所周知&#xff0c…

CodeSmith应用(一)

这个例子仅是一个简单的应用&#xff0c;在我翻译并学习完CodeSmith的英文帮助文档后&#xff0c;对CodeSmith有了一定的了解&#xff0c;开始着手编写一些CodeSmith应用模板&#xff0c;今天按照最早提到的例子自行编写了一个基于表的添加存储过程的生成模板。具体语法前面基础…

01_创建一个新的activityactivity配置清单文件

今天开始学四大组件。今天是学Activity&#xff0c;然后是广播接收者&#xff0c;然后是服务&#xff0c;然后是内容提供者。四大组件&#xff0c;咱们一天一个。Activity就是跟用户交互的界面&#xff0c;大部分的应用都不会只有这么一个界面。创建多个Activity&#xff0c;在…

Java 集合——List集合

Collection接口是集合的老祖宗&#xff0c;定义了接口的基本方法。 List是Collection接口的子接口&#xff0c;也是最常用的接口&#xff0c;此接口对Collection接口进行了大量的扩展&#xff0c;List集合里的元素是可以重复的。 List接口的主要实现类有ArrayList&#xff0c;和…

jQuery中的插件机制

我们在很多地方都用过插件&#xff0c;插件能让我们操作某个东西变得异常方便&#xff0c;jQuery也不例外&#xff0c;为了扩展jQuery库函数&#xff0c;jQuery提供了两种方式&#xff1a; jQuery.extend(object)&#xff1a;扩展jQuery对象本身&#xff0c;主要是用来扩展jQu…

ActiveRecordBase借助NHibernate的条件获取实体类对象

ActiveRecordBase.FindAll() 函数其中有一个这样的版本的参数ActiveRecordBase.FindAll(TargetType AsSystem.Type,Orders() AsNHibernate.Expression.Order,ParamArraycriterias() AsNHibernate.Expression.ICriteriion) 可以方便的使用NHibernate的条件查询&#xff0c;例如…

轻量级持久层V2版本代码与模板

首页列表上好像不能下载&#xff0c;要下载文件请进来下。 上篇帖《轻量级持久层的讨论》中大家踊跃的提出各种意见&#xff0c;让我得到不少灵感&#xff0c;这些新的想法将会应用到下一个版本的开发中&#xff0c;我先得试试可行性如何。这里先给出这一版本的代码和模板&…

最近用到的一些方法技巧

郁闷&#xff0c;msn上不去&#xff0c;没法干活。记上最近项目中用到的一些code snippet1.查询今天的记录select datediff(dd,ConvDateTime,getdate()),* from dbo.rbConversationMaster where datediff(dd,ConvDateTime,getdate())0 DataDiff Returns the number of date and…

MyBatis的使用

要了解MyBatis的使用&#xff0c;首先要了解MyBatis是因何而来的&#xff1f;为了和数据库进行交互&#xff0c;通常的做法是将SQL语句写在Java代码里&#xff0c;然后生成class文件&#xff0c;而我们知道class文件是无法修改的。假如后来我们只想改变一下SQL语句&#xff0c;…

iOS7系统iLEX RAT冬青鼠安装教程:无需刷机还原纯净越狱系统

全网科技 温馨提醒&#xff1a;iLEX RAT和Semi-Restore的作用都是让你的已越狱的设备恢复至越狱的初始状态。可是要注意无论你是用iLexRAT冬青鼠还是Semi-restore。对于还原来说都存在巨大的风险。非必要情况下&#xff0c;还是不要任意使用它们。*iLEX RAT冬青鼠安装教程&…

HDU 4832(DP+计数问题)

HDU 4832 Chess 思路&#xff1a;把行列的情况分别dp求出来&#xff0c;然后枚举行用几行。竖用几行&#xff0c;然后相乘累加起来就是答案 代码&#xff1a; #include <stdio.h> #include <string.h> #include <iostream> using namespace std;typedef long…

社会生活中常用的14条著名法则

一、 马太效应          八、 水桶定律 二、 手表定理          九、 蘑菇管理三、 不值得定律         十、 奥卡姆剃刀定律四、 彼得原理          十一、 二八定律五、 零和游戏原理        十二、 钱的问题六、 华盛顿合作…