转发和重定向

servlet和servlet之间可以实现相互跳转,servlet的跳转可以将一个项目的模块进行划分,这样更加方便了开发人员的操作,servlet之间的跳转分为两种,一种是转发,英文名称Forward,另一种是重定向,英文名称Redirect。转发,指转移发放,指的是文件的批转发送;重定向,就是通过)就是通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向)。下面重点详细介绍一下转发和重定向,希望对有需要的小伙伴有帮助,还请大牛们多多指教。
转发(Forward)
转发市通过RequestDispatcher对象的Forward(HttpServletRequest request,HttpServletResponse response)来实现的,语法格式如下所示:
RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet/LifeCycleServlet"); 
dispatcher.forward(request, response);
      servlet页面跳转的路径是相对路径,转发方式只能跳转到本web应用中的页面上,跳转后浏览器地址栏不会改变,转发市最常用的方式,在struts等MVC框架中,都是用servlet来处理用户请求,把结果通过request.setAttribut()放到request中,然后转发到jsp中进行显示,当执行转发方法时,不能有任何输出到达客户端,否则会抛出异常,也就是说,在转发之前,不要使用out.println()语句向客户端输出。代码如下所示:
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String destination = request.getParameter("destination");if("file".equals(destination)){RequestDispatcher d = request.getRequestDispatcher("/WEB-INF/web.xml");d.forward(request, response);}else if("jsp".equals(destination)){request.setAttribute("date", new Date());  //attributes are reset between requests.RequestDispatcher dispatcher = request.getRequestDispatcher("/forward.jsp");dispatcher.forward(request, response);}else if("servlet".equals(destination)){RequestDispatcher disp = request.getRequestDispatcher("/servlet/LifeCycleServlet");disp.forward(request, response);}else{response.setCharacterEncoding("UTF-8");response.getWriter().println("缺少参数。用法:"+request.getRequestURI()+"?destination=jsp或者file或者servlet");}
}
重定向(Redirect)
        重定向是通过服务器端返回状态码来实现的,a和b都表示重定向,区别是a表示永久性重定向,b表示临时性重定向,通过sendRedirect(String location)就可以实现重定向,如下面的demo。本例子主要实现了Servlet来实现文件下载并统计下载次数。要下载的文件以及下载次数都保存在一个Map中。主要思路是:首先加载页面表单,当用户点击下载链接时,客户端发起请求,运行doGet里的if判断,实现重定向。 重定向和跳转的区别:跳转是在服务器端实现的,客户端浏览器并不知道该浏览动作,而使用Redict跳转时,跳转是在客户端实现的,也就是说客户端浏览器实际上请求了两次次服务器。
public class RedictServlet extends HttpServlet {Map<String,Integer> map = new HashMap<String,Integer>(); //new一个Mappublic void init() throws ServletException {  //放在init中,加载servlet时运行此方法,把文件内容放到map中去map.put("/download/setup.exe", 0);map.put("/download/application.zip", 0);map.put("/download/01.mp3", 0);}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String filename = request.getParameter("filename");if(filename!=null){int hit = map.get(filename);  //取下载次数map.put(filename, ++hit);  //下载次数加1后保存response.sendRedirect(request.getContextPath()+filename);  //重定向到文件}else{response.setCharacterEncoding("UTF-8");PrintWriter out = response.getWriter();response.setContentType("text/html");out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");out.println("<HTML>");out.println("  <HEAD><TITLE>文件下载</TITLE></HEAD>");out.println("   <link rel='stylesheet' type='text/css' href='../css/style.css'>");out.println("  <BODY><br/>");out.println("<fieldset align=center style=width:90%><legend>文件下载</legend>");  //绘制页面表单out.println("<table width=100%>");out.println("   <tr>");out.println("       <td><b>文件名"+"</b></td>");out.println("       <td><b>下载次数</b></td>");out.println("       <td><b>下载</b></td>");out.println("   </tr>");for(Entry<String,Integer> entry: map.entrySet()){  //遍历map的方法out.println("<tr>");out.println("   <td>"+entry.getKey()+"</td>");out.println("   <td>"+entry.getValue()+"</td>");out.println("   <td><a href = '"+request.getRequestURI()+"?filename="+entry.getKey()+"'target = '_blank' onclick ='location = location;'>下载</a></td>");  //target='_blank'目标地址在无标题的新页面中打开。onclick ='location = location;'页面刷新out.println("</tr>");}out.println("</table>");out.println("   </legend>");out.println("  </BODY>");out.println("</HTML>");out.flush();out.close();}}public void destroy() {super.destroy(); // Just puts "destroy" string in log// Put your code heremap = null;}
}

转发和重定向的区别
使用转发跳转时,跳转是在服务器端实现的,客户端浏览器并不知道该浏览的动作,而使用重定向跳转的社会化,跳转实在客户端实现的,也就是说客户端浏览器实际上请求了两次服务器,语法格式如下:
response.sendRedirect("/a.jsp");
页面的路径是相对路径,sendRedirect可以将页面跳转到任何页面,不一定局限于本web应用中,例如:
response.sendRedirect("URL");
跳转后浏览器地址栏发生变化,这种方式要传值出去的话,只能在url中带parameter或者是放在seesion中,无法使用request.setAttribute来传递。接着小编以画图的形式来解释一下转发和重定向的区别:
转发
a、转发不会改变浏览器的地址栏
b、转发共享同一个request
c、转发只能在同一个web应用中使用
如下图:

接着,我们来看重定向:
a、重定向会改变浏览器的地址栏
b、重定向不共享request
c、可以重定向到任意URL
如下图:

        一句话概括来说就是,转发是服务器行为,重定向是客户端行为,从请求次数和请求的资源地址两个方面来理解一下她们之间的区别,首先从请求次数来说,重定向行为是做了两次请求,以及产生了两个request对象,重定向会导致request对象信息丢失。转发是做了一次请求,浏览器地址栏一直是第一次请求的地址,转发是服务器内部request/response控制权的移交。

        从请求资源的角度来看,重定向是weib自荐可以将请求重定向到任意一个url,而不仅仅是同一个应用,重定向的源组件与目标组件不公用同一个HttpServletRequest对象,因此不能在request范围内共享数据。转发的源组件与目标组件必须在同一个应用总,两者可以在request范围内共享数据。

       小编寄语:小编主要简单介绍了转发和重定向的相关知识,小编简单的举一个例子来帮助小伙伴们理解一下转发和重定向,假设我们需要去办理一个银行业务,假设我们先去了建行,建行的工作人员看了以后,发现这个业务应该工行的工作人员来进行处理,但是建行的工作人员没有跟我们说,让我们去工行,而是让我们坐下来,喝杯茶,建行的工作人员自己和工行的工作人员取得联系,让他们把业务办理好,给我们送了过来,这就是转发;那么什么是重定向呢?我们先去了建行,建行的工作人员说,这个事情不归我们管理,你们需要去工行办理,然后,我们从建行撤了回来,我们自己乘车去了工行,这就是重定向。
     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/64347.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

登录重定向问题

路由拦截器的路径和登录成功后路由重定向发生冲突导致 在路由跳转的时候把错误抛出 this.$router.push({}).catch(()>{}) main.js const originalPush Router.prototype.push Router.prototype.push function push(location, onResolve, onReject) {if (onResolve || …

剖析转发和重定向

做JavaWeb开发一定会遇到转发和重定向这两个名字&#xff0c;刚开始确实有些模糊&#xff0c;感觉两者非常相似&#xff0c;但是随着研究深入发现两者的本质相差甚远。 首先看书写语句&#xff1a; 转发&#xff1a;request.getRequestDispatcher("apage.jsp").forwa…

关于转发和重定向

req.getRequestDispatcher(path).forward(req,resp); 请求转发如果path的值为"/xxx" 则浏览器地址栏请求的是服务器ip:端口号/项目名/xxx resp.sendRedirect(path); 重定向的话如果**path前面不带/**则表示客户端访问的是直接路径 例如 resp.sendRedirect(“hhtps…

转发以及重定向

转发 && 重定向 作用 在Servlet中实现页面的跳转有两种方式&#xff1a;转发和重定向 页面的跳转&#xff1a;转发 1.转发的原理 2.转发的方法 3.疑问 能否在FirstServlet中保存值到请求域中&#xff0c;在另一个SecondServlet中打印出来&#xff1f; 什么是转发 …

从匿名管道谈重定向技术

匿名管道与重定向技术 正文 首先我们得理解一个定义&#xff1a;重定向何谓重定向&#xff1f;可以先字面理解为&#xff1a;重新决定方向!在控制台程序中&#xff0c;将标准的输入、输出句柄用管道的读、写句柄替换,而控制台程序本身并不知道它的输入、输出句柄已发生了变化…

一文了解转发与重定向

一文了解转发与重定向 &#x1f3e0;个人主页&#xff1a;不会写代码的满满 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是满满&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; 目前状况&#x1f389;&#xff1a;开学即将大三&#xff0c;目…

转发与重定向

转发是服务器行为&#xff0c;重定向是客户端行为。转发耗时比重定向少。 转发——>客户浏览器发送HTTP请求——>web服务器接受请求——>调用内部一个方法在容器内部完成请求处理和转发动作——>再将转发跳转到的那个网页资源返回给客户&#xff1b; 转发只能在同…

将您重定向的次数过多什么意思_Linux重定向

通常说所重定向便是将命令结果如查询结果重定向到一个文件中,通常用在一些命令结果较多无法完全显示完,可以重定向到一个文件,在文件中查看。 重定向分为输入重定向<和输出重定向> 一、>和>> 区别:>是重定向到一个文件;>>追加内容到一个文件 如果…

API接口案例,淘宝商品详情数据采集

item_get-获得商品详情 API接口工具 请求参数 请求参数&#xff1a;num_iid520813250866&is_promotion1参数说明&#xff1a;num_iid:淘宝商品ID is_promotion:是否获取取促销价 Request address: https://api-gw.onebound.cn/taobao/item_get_app/?keyt& &num…

API数据接口该怎么对接

随着互联网和移动互联网的发展&#xff0c;API&#xff08;Application Programming Interface&#xff09;接口的作用越来越重要。API接口将各种平台相互连接&#xff0c;使得不同系统的信息可以互相获取和使用&#xff0c;大大提高了系统的互操作性和开发效率。本文将介绍如何…

如何实现高质量的系统数据对接/API接口整合集成方案?

我们建立一个数字化系统可能会有跟别的系统进行数据对接的需要&#xff0c;而别人的数字化系统也有可能需要跟我们的系统进行数据对接&#xff0c;也可能我们开发了不同的网站&#xff0c;网站小应用之间需要进行数据对接。那么数据对接应该如何操作呢&#xff1f;怎么才能更好…

以聚合数据为例,详细说明API接口使用方法

前言 以聚合数据为例&#xff0c;详细说明API接口使用细节方法&#xff0c;说明清楚如何使用API接口的每个步骤&#xff0c;防止以后忘记没地方找。 API网站注册后最重要的个人数据是请求key值&#xff0c;每个不同的数据都有与之对应的请求key值&#xff0c;这里我拿新…

举例说明如何使用【聚合数据】的API接口

更新&#xff1a;这篇文章写于2016年8月&#xff0c;现在的聚合数据可能有些变化&#xff0c;申请使用的方式相应有所改变&#xff0c;所以本文只作参考. ________________________________________________________________________________________________________________…

企业微信增加企业内部应用入口的超链接

背景 2020年初,新冠疫情导致很多企业远程办公,接到许多方便员工移动办公的开发需求.比如最近接到一个任务,是需要再企业微信的工作台台添加一个超链接,连接到企业已经有的一个web项目上去.并且能够携带用户信息进行访问. 放超链接很简单,复杂的是如何携带用户信息到这个超链接…

企业微信url及生成授权链接

企业微信第三方开发课程 14-18 一、简介 这里主要分为四部分&#xff0c;验证 url 有效性、完成用户的测试安装、获取生成预授权码、生成授权安装链接。这几部就可以完成第三方有用的回调和安装&#xff0c;这也是后续功能开发的基础。 二、Get 请求验证 URL 有效性 1.为什…

对接企业微信3:网页授权登录

构造网页授权链接 如果企业需要在打开的网页里面携带用户的身份信息&#xff0c;第一步需要构造如下的链接来获取code参数&#xff1a; https://open.weixin.qq.com/connect/oauth2/authorize?appidCORPID&redirect_uriREDIRECT_URI&response_typecode&scopesnsa…

企业微信-构造网页授权链接实现登录

文档地址&#xff1a;构造网页授权链接 - 接口文档 - 企业微信开发者中心 注意&#xff1a; 1.redirect_uri&#xff1a;回调链接地址&#xff0c;需要使用urlencode对链接进行处理 2.scope&#xff1a;如果需要获取成员的头像、手机号等信息需要设为snsapi_privateinfo 例如前…

windows浏览器无法访问虚拟机上Linux部署的consul

一、问题&#xff1a; 查看consul服务 是启动的&#xff0c;但是就是无法访问。 二、解决步骤&#xff1a; 1、查看防火墙是否关闭或者添加接口映射 关闭防火墙&#xff08;具体看应用场景&#xff0c;请不要盲目的操作&#xff09; systemctl stop firewalld 查看防火墙状…

插件部署环境

插件部署环境 前言 按照前面的文章已经安装好了同步工具&#xff0c;那么在使用之前&#xff0c;我们需要为同步工具做一些准备工作&#xff0c;插件才能正常使用 准备工作 准备工作主要两点&#xff0c;许可&#xff0c;金蝶环境配置 许可试用 插件一共提供四种许可方式…

RabbiteMQ 部署到虚拟机的 Linux 上,加入插件后,无法通过浏览器访问 RabbiteMQ 控制台

解决办法&#xff1a; 可以通过安装 docker 容器&#xff0c;在 docker 容器上面安装 RabbiteMQ 解决。 具体操作如下&#xff1a; 1.先安装 docker 安装yum工具 yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken更新本地镜像源&#xff1a; …