转发和重定向简介及与之相关的(URL)参数(parameter)、属性(attribute)问题探讨
1.引子
转发和重定向是我们在做web项目中常用到的两个术语,有必要理清两者的区别和与之相关的参数、属性获取问题。
2.转发和重定向
1).转发
转发是服务器行为,将当前请求(Request)和响应(Response)处理打包发送给目标服务(Servlet),这样下一个目标服务就能获取或操作上一个服务中的请求和响应。
客户浏览器发送http请求—>web服务器接受此请求—>调用内部的一个方法在容器内部完成请求处理和转发动作—>将目标资源 发送给客户
转发行为是同一次请求,其URL地址仍是以前的地址,不会发生变化,但页面内容却是新页面的东西了。转发只能是在同一应用中使用,不能跨应用转发请求,比如,京东页面的请求就不可能转发给淘宝的服务器。
2).重定向
重定向就如其名字一样,是将页面定位到一个新位置。重定向客户端行为,是全新的请求,客户端不能保存当前的请求,在定位到新的页面或servlet服务时,上次的请求超出请求的作用范围了,那个请求即失效了。
客户浏览器发送http请求—>web服务器接受后发送302状态码响应及对应新的location给客户浏览器—>客户浏览器发现 是302响应,则自动再发送一个新的http请求,请求url是新的location地址—>服务器根据此请求寻找资源并发送给客户。
重定向至少是两次请求,重定向后URL地址是新的地址了,当然页面内容也更新为目标页面的内容了。重定向可以定位到任意页面,可以跨越不同的应用程序。比如,天猫的页面就可以重定向到淘宝的页面上。
参数(parameter)、属性(attribute)的区别,可以看我另一篇帖子-----Servlet中的属性(attribute)和参数(parameter)的区别
3.简单示例
登录页html代码
<form action="loginServlet" method="post">
用户名:
<input type="text" name="username" /> <br/>
密 码:
<input type="password" name="pwd"/><br/>
<!-- 默认的submit,提交给loginServlet处理 -->
<input type="submit" value="提交至将转发的servlet"> <br/>
<!-- 一个表单内容可以提交给不同的servlet,而formaction属性值就对应提交的目标地址,
这里提交给loginServlet2进行请求处理 -->
<input type="submit" formaction="loginServlet2" value="提交至将重定向的servlet">
</form>
要转发的servlet
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String name=request.getParameter("username");
String pwd=request.getParameter("pwd");
System.out.println("用户名:"+name+"\t密码:"+pwd);
//request域中设置一个属性
request.setAttribute("nowDate", new Date());
//转发
request.getRequestDispatcher("forward_page.jsp?url_param=test_url_param").forward(request, response);
}
要重定向的servlet
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String name=request.getParameter("username");
String pwd=request.getParameter("pwd");
System.out.println("用户名:"+name+"\t密码:"+pwd);
//request域中设置一个属性
request.setAttribute("nowDate", new Date());
//重定向
response.sendRedirect("redirect_page.jsp?url_param=test_url_param");
}
将转发的登录页面
转发页的html代码
<body>
<h3>这是一个转发后的页面</h3>
request中获取参数(用户名):<label>${param.username}</label> <br/>
request中获取参数(密码):<label>${param.pwd}</label> <br/>
request中获取的属性(‘nowDate’):<label>${nowDate}</label> <br/>
url中获取的一个参数:<label>${param.url_param}</label> <br/>
</body>
servlet转发到的页面
从上图可以看出,所有的参数和属性(包括url中拼接的参数)都可以正确地获取,并显示在页面上。但url地址还是"loginServlet",不是当前页面所对应的"forward_page.jsp"地址。
将重定向的登录页面
重定向页的HTML代码
<body>
<h3>这是一个重定向后的页面</h3>
request中获取参数(用户名):<label><c:out value="${param.username}" default="空"/></label> <br/>
request中获取参数(密码):<label><c:out value="${param.pwd}" default="空"/></label> <br/>
request中获取属性‘nowDate’:<label><c:out value="${nowDate}" default="空"/></label> <br/>
url中获取的一个参数:<label><c:out value="${param.url_param}" default="空"/></label> <br/>
</body>
servlet重定向到的页面

从上图可以看出,上次请求的所有属性、参数均不能获取到。另外url地址更新了,不再是servlet的映射地址了,而当前新页面的"redirect_page.jsp"地址。
除此之外,可以看到重定向的URL中拼接的键值对参数“url_param=test_url_param”在新页面还是能获取到的。
4.总结
1.重定向,是一次新的请求,不能获得上次请求中的参数、属性;转发,是同一次请求,之前所有的参数、属性在新的页面或servlet中都可见的,它们保存在同一个request域中。
2.转发操作,(即使转至新页面)其URL地址不会变化;而在重定向操作中,URL地址会更新变为重定向的目标地址。
3.若要页面内容、URL地址均更新,并且新页面还要获取上次请求的参数、属性,可以通过一种曲线救国的方式实现:在重定向的URL中以键值对的方式来拼接上次请求的参数、属性;并在新页面中通过EL表达式“${param.name}”获取。
转发和重定向简介及与之相关的(URL)参数(parameter)、属性(attribute)问题探讨的更多相关文章
- php 后台转发和重定向的区别及kohana框架当前url加参数方式
1.重定向是浏览器行为,浏览器地址有变化:转发是后台服务器完成, url地址不变化. 2.kohana获取URL 当前url是http://soyoung.kohana.com/blog/add?id ...
- jsp:和属性相关的方法,请求的转发,重定向
jsp中与属性相关的方法: 方法: void setAttribute(String name, Object o): 设置属性 Object getAttribute(String name):获取 ...
- HttpServletRequest 接口、HttpServletResponse 接口、请求转发与重定向
上篇文章我们讲了servlet的基本原理,这章将讲一下剩余的部分. HttpServletRequest 接口 该接口是 ServletRequest 接口的子接口,封装了 HTTP 请求的相关信息, ...
- ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
ServletRequest 基本概念 JavaWeb中的 "Request"对象 实际为 HttpServletRequest 或者 ServletRequest, ...
- HttpRequest,HttpResponse,乱码,转发和重定向
HttpServletRequest简介 Web服务器收到客户端的http请求,会针对每一次请求,创建一个用于代表请求的HttpServletRequest类型的request对象,并将"H ...
- HttpServlet的转发和重定向
HttpServletResponse重定向 1.HTTP协议规定了一种重定向的机制,重定向的运作流程如下 用户在浏览器输入特定的URL,请求访问服务端的某个组件. 服务端的组件返回一个状态码为302 ...
- Servlet(四):转发与重定向、路径问题
在上次的小案例中用到了转发的技术,今天来仔细聊聊转发和重定向的问题,以及一些小知识的汇总. 一.转发 1.转发的概念 转发主要是将浏览器的请求交给另外一个servlet或jsp来处理,借助reques ...
- SpringMVC中使用forward和redirect进行转发和重定向以及重定向时如何传参详解
转自:http://blog.51cto.com/983836259/1877188 2016-11-28 09:45:59 如题所示,在SpringMVC中可以使用forward和redirec ...
- springMVC3.0(文件上传,@RequestMapping加參数,@SessionAttributes,@ModelAttribute,转发,重定向,数值获取,传參,ajax,拦截器)
1.项目包结构例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsiz ...
随机推荐
- [转]Spark SQL2.X 在100TB上的Adaptive execution(自适应执行)实践
Spark SQL是Apache Spark最广泛使用的一个组件,它提供了非常友好的接口来分布式处理结构化数据,在很多应用领域都有成功的生产实践,但是在超大规模集群和数据集上,Spark SQL仍然遇 ...
- Day 20:网络编程(1)
什么是计算机网络? 指的是分布在不同地域的计算机,通过外部设备连接起来,实现资源共享与数据传输的计算机系统. 通信三要素: IP: IP地址 Internet上的每台主机(Host)都有一个唯一的IP ...
- MFC双缓冲
大家都知道包括windows桌面在内我们看到的一切都是系统画上去的,windows桌面就相当于一个黑板: <1>普通绘图就是直接在我们看得到的黑板上绘图 <2>双缓冲就是先在一 ...
- Airflow 使用 Celery 时,如何添加 Celery 配置
背景 前段时间我选用了 Airflow 对 wms 进行数据归档,在运行一段时间后,经常发现会报以下错误: [-- ::,: WARNING/ForkPoolWorker-] Failed opera ...
- Java8 Optional类使用小结
Optional类的Javadoc描述如下: 这是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. of: 为非null的值创建一 ...
- nested exception is java.lang.IllegalArgumentException: warning no match for this type name: res [Xlint:invalidAbsoluteTypeName]
注:内有单词(sping)写错,请忽略,不影响程序运行 运行时报错: Exception in thread "main" org.springframework.beans.fa ...
- 「黑科技」智能消毒防疫机器人 技术方案介绍-disinfection robot
消毒机器人 小新防疫消杀机器人 - 自主导航全方位360°臭氧杀菌消毒机器人,采用臭氧无阻碍.无死角.遍布整个空间除菌:强力涡轮风机,30㎡室内空气循环6次/h,10分钟速效杀菌.除异味.自动转化为氧 ...
- [安洵杯 2019]easy_web
0x00 知识点 md5强类型的绕过 方法比较固定: POST: a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%d ...
- 使用Object类为实例定义方法和属性
1.1 可以使用 Object 类直接定义个实例,并且为该对象赋属性和方法,例如: var person_1 = { nickName:"xiaowu", age:28, show ...
- Centos6.5 安装zabbix3(收藏,非原创)
1.安装PHP Zabbix 3.0对PHP的要求最低为5.4,而CentOS6默认为5.3.3,完全不满足要求,故需要利用第三方源,将PHP升级到5.4以上,注意,不支持PHP7 rpm -ivh ...