JavaWeb小记——重定向和内部转发

news2024/11/19 7:41:49

目录

重定向

原理图

重定向语句

重定向特点

内部转发

原理图

请求转发特点 

路径的书写

请求域对象request

特点

请求转发特点

重定向特点


重定向

原理图

重定向语句

response.setStatus(302);
response.setHeader("location","http://www.baidu.com");
//以上两条等于下面一条

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

重定向特点

1.两次请求,两次响应。

当浏览器向服务器中aServlet发送请求时,aServlet说 我执行不了,让bServlet去做吧,然后aServlet向浏览器响应302重定向状态码,再设置一个bServlet路径的响应头。浏览器再将请求发往bServlet,bServlet执行后再响应给浏览器。所以是两次请求,两次响应。

2.发送请求后,地址栏会发生变化。

比如下面一段代码

package org.xingyun.demo;

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

@WebServlet(name = "Servletdemo2",value = "/demo2")
public class Servletdemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.sendRedirect("http://www.baidu.com");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

请求后:

 3.可以访问外部站点资源,也可以访问内部的资源。

外部资源:

例如第二点,进入百度

内部资源:

response.sendRedirect("/MyServlet20230624_war_exploded/my.jsp");

4.无法访问WEB-INF下的资源

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

5.访问内部站点资源时,需写上项目的上下文路径。

内部转发

原理图

简单案例:

package org.xingyun.demo2;

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

@WebServlet(name = "ServletDemo6",value = "/demo6")
public class ServletDemo6 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo6收到请求了");
        request.getRequestDispatcher("/demo7").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}






package org.xingyun.demo2;

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

@WebServlet(name = "ServletDemo7",value = "/demo7")
public class ServletDemo7 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo7收到请求了");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

运行结果:

请求转发特点 

1.一次请求,一次响应

在内部进行转发

2.地址栏不会发生变化

 

3.只能请求内部站点的资源 

 4.可以访问WEB-INF下的资源

5. 不用写项目的上下文路径

路径的书写

路径的书写: 
        建议以/开头
        服务器内部跳转路径 不需要加项目上下文路径  request.getRequestDispatcher("/myservlet2").forward(request, response);
    
        页面上的路径和重定向 需要加上项目的上下文路径
        <img src="/MyServlet/mydemo4" id="img1"></img>
        

        一般来说我们写相对路径

请求域对象request

特点

只能在一次请求和一次响应之间共享数据,一次请求响应后自动销毁。

请求转发特点

例:

我们先在demo6中用请求域对象存一个数据,用内部转发的方式转发到demo7,在demo7中取数据,看能否取到。

//demo6
@WebServlet(name = "ServletDemo6",value = "/demo6")
public class ServletDemo6 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo6收到请求了");
        int num = 100;
        request.setAttribute("num",num);
        request.getRequestDispatcher("/demo7").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}



//demo7
@WebServlet(name = "ServletDemo7",value = "/demo7")
public class ServletDemo7 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo7收到请求了");
        Integer num = (Integer) request.getAttribute("num");
        System.out.println(num);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

运行结果:

可见,可以在demo7中取到数据,因为请求转发是一次请求,一次响应。

重定向特点

然后我们再使用重定向的方式转发,看能否取到

可见,取不到数据了,因为重定向是两次请求,两次响应。

用ServletContext全局域对象都可以取到数据,因为它范围最大。

什么时候用重定向,什么时候用内部转发
        如果,你要跳到外部站点,只能用重定向。
        如果,你要访问WEB-INF下的资源,只能用内部转发。
        如果,你把数据存到了 request 请求域中,你还要共享数据,你要用内部转发。
        如果我要重定向,跳转资源,还想要在跳转的资源间共享数据,那我们可以 Session或者ServletContext 全局域对象

补充知识

//request中的get方法


request.getAttribute()               //获得setAtrribute的数据
request.getAttributeNames()           //返回所有可用属性名的枚举
request.getAuthType()               //返回用于保护servlet的验证方法名称
request.getCharacterEncoding()        //返回字符编码方式
request.getClass()                   //返回一个类
request.getContentLength()            //返回请求体的长度(以字节数)
request.getContentType()              //得到请求体的MIME类型
request.getContextPath()               //获取当前系统的路径 获得应用名称
request.getCookies()                  //返回此次请求发送的Cookie对象
request.getDateHeader()               //用于将指定头信息的部分转换成方便转换为时间类型的长整数型
request.getHeader()                   //获取客户端的浏览器类型。
request.getHeaderNames()           //返回请求头包含的所有头名称的枚举。
request.getHeaders()               //获取一个name的多个值序列,返回请求给出的指定类型的所有HTTP头标的名称的枚举值
request.getInputStream()              //得到请求体中一行的二进制流
request.getIntHeader()                //以int的形式返回指定请求头的值。
request.getLocalAddr()                 //接收请求的接口的 InternetProtocol (IP) 地址

request.getLocale()                     //基于 Accept-Language 头,返回客户端将用来接受内容的首选 Locale 客户端语言环境

request.getLocales()                    //所有的语言环境
request.getLocalName()                  //接收请求的 Internet Protocol(IP) 接口的主机名

request.getLocalPort()                  //接收请求的接口的 InternetProtocol (IP) 端口号

request.getMethod()                     //请求方式
request.getParameter()                   //获得表单提交的数据
request.getParameterMap()                //返回类型是String[]
request.getParameterNames()              //将发送请求页面中form表单里所有具有name属性的表单对象获取(包括button).返回一个Enumeration类型的枚举
request.getParameterValues()             //将获取所有form表单中name属性为"name"的值.该方法返回一个数组.遍历数组就可得到value值
request.getPathInfo()                   //返回与客户端发出此请求时发送的URL相关联的额外路径信息。

request.getPathTranslated()           //映射到服务器实际路径之后的路径信息
request.getProtocol()                   //返回请求用的协议类型及版本号获取客户端向服务器端传送数据所依据的协议名称。
request.getQueryString()                //字符串形式的附加到URL后面的查询字符串,数据仍旧是URL编码的
request.getReader()                      //返回解码过了的请求体
request.getRealPath()                    //返回一虚拟路径的真实路径
request.getRemoteAddr()                  //返回发送此请求的客户端IP地址
request.getRemoteHost()                    //返回发送此请求的客户端主机名   获取客户端的名字
request.getRemotePort()                      //发送请求的客户主机端口
request.getRemoteUser()                   //返回包含在请求RUL中路径后面的查询字符串。如果没有查询字符串返回null
       
request.getRequestDispatcher()            //请求转发,获取请求过来的地址,与该地址共享一个Request

request.getRequestedSessionId()             //返回客户端制定的回话ID
request.getRequestURI()                    //请求的资源
request.getRequestURL()             //获取URL,包含域名,不包含请求内容

request.getScheme()                    // 返回请求用的计划名,  返回当前链接使用的协议 如:http.https及ftp等
request.getServerName()                //返回接受请求的服务器主机名获取服务器的名字。
request.getServerPort()                //返回服务器接受此请求所用的端口号 
request.getServletPath()                //返回请求调用servlet的URL部分
request.getSession()                    //返回与此请求关联的当前HttpSession,如果没有当前会话并且参数为true,则返回一个新会话
    
request.getUserPrincipal()            // 返回包含当前已经过验证的用户的名称的java.security.Principal对象。如果用户没有经过验证,则该方法返回null

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kubectl get cs显示unhealthy的解决办法

01、问题描述 使用kubectl get cs查看K8s组件状态&#xff0c;发现scheduler和controller-manager状态为Unhealthy&#xff0c;但集群可以正常使用。 [rootk8s-master ~]# kubectl get cs Warning: v1 ComponentStatus is deprecated in v1.19 NAME STATUS …

matplotlib——2. 形状和路径(Shape and Collection)底纹(hatch)

文章目录 1. 形状和路径1.1 PatchCollection替换热力图数字1.1.1原始的数字代码1.1.2 替换为PatchCollection的代码 1.2 PatchCollection绘制目标检测&#xff08;COCO&#xff09;标签1.3 PatchCollection绘制分割&#xff08;COCO&#xff09;标签 2. 底纹&#xff08;hatch&…

搭建Zabbix服务(Linux系统)

环境&#xff1a; centos7、lamp、防火墙关闭、selinux关闭 配置阿里云zabbix yum源 [rootchenshuyi ~]# rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-1.el7.centos.noarch.rpm 获取https://mirrors.aliyun.com/zabbix/zabbix/…

开启iis服务器通过php获取MySQL数据

开启iis服务器通过php获取MySQL数据 第一步开启iis服务器。 具体的可以查看这个&#xff1a;http://www.wokk.cn/40547.html 1.全部勾选,把万维网服务和web管理工具全部勾选。 2.添加网站&#xff0c;在网站这里添加网站&#xff0c;物理连接路径为你的网站存放的根目录。 3…

sql知识集锦

sql执行顺序 SELECT 的执行顺序 关键字的顺序是不能颠倒的&#xff1a; SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY … 2.SELECT 语句的执行顺序&#xff08;在 MySQL 和 Oracle 中&#xff0c;SELECT 执行顺序基本相同&#xff09;&#xff1a; FROM >…

基于FPGA的永磁同步伺服控制系统的设计,在FPGA实现了伺服电机的矢量控制, 坐标变换,电流环,速度环,位置环,电机反馈接口,SVPWM

一个基于FPGA的永磁同步伺服控制系统&#xff0c;利用Verilog语言在FPGA上实现了伺服电机的矢量控制、坐标变换、电流环、速度环、位置环以及电机反馈接口。这个系统具有很高的研究价值。 涉及到的知识点和领域范围主要包括&#xff1a;FPGA&#xff08;现场可编程门阵列&…

2024广西大学计算机考研828 重点知识点分享 经验分享

这是广西大学828的考试大纲和参考书目。其实细看考试内容&#xff0c;第一点“计算机程序设计基础知识”的内容是比较散的&#xff0c;很难从给定的参考书目中的固定的一章或一节找到相关知识点&#xff0c;有的能找到&#xff0c;就是分散的比较乱&#xff0c;有的甚至都没有&…

动态规划入门-数据结构与算法教程

动态规划&#xff08;DP&#xff09;是一种在多项式时间内解决某些特定类型问题的技术。动态规划解决方案比指数蛮力法更快&#xff0c;并且可以很容易地证明其正确性。 动态规划主要是对普通递归的优化。只要我们看到一个递归解决方案重复调用相同的输入&#xff0c;我们就可以…

软考电子商务设计师备考资料

中级科目还好&#xff0c;难度肯定是有点的&#xff0c;而且电子商务设计师科目是近几年新增的&#xff0c;网上资料也比较少 电子商务设计可以理解为网页设计和平面设计的结合,但同时增加了用户体验和人机交互的一-些概念,互联网变成了传播&#xff0c;最终目的是销售商品.所…

nginx配置开机启动(Windows环境)

文章目录 1、下载nginx&#xff0c;并解压2、配置nginx.conf&#xff0c;并启动Nginx3、开机自启动 1、下载nginx&#xff0c;并解压 2、配置nginx.conf&#xff0c;并启动Nginx 两种方法&#xff1a; 方法一&#xff1a;直接双击nginx.exe&#xff0c;双击后一个黑色弹窗一闪…

Redis布隆过滤器详解

目录 一、前言二、RedisBloom 安装与使用三、RedisBloom 常用命令汇总四、通过 Jedis 使用 RedisBloom五、Redisson 封装的布隆过滤器六、使用哪种方式的过滤器比较好&#xff1f; 一、前言 布隆过滤器&#xff08;Bloom Filter&#xff09;是 Redis 4.0 版本提供的新功能&…

rewrite 重写跳转

Nginx Rewrite–重写跳转 Nginx Rewrite--重写跳转 一、概述&#xff1a;1.Rewrite 跳转场景&#xff1a;2.Rewrite 跳转实现&#xff1a;3.Rewrite 实际场景&#xff1a;4.Nginx正则表达式&#xff1a;5.Rewrite 命令&#xff1a;6.location分类&#xff1a;7.比较rewrite和l…

【FFmpeg实战】音视频解封装格式

转载自原文地址&#xff1a;https://www.cnblogs.com/zuojie/p/16798273.html 一、什么是封装格式 封装格式也称为容器&#xff0c;用于打包音频、视频以及字幕等等&#xff0c;比如常见的容器有MP4、MOV、WMV、FLV、AVI、MKV等等。容器里面装的是音视频的压缩帧&#xff0c;但…

5、基于Python所写的飞机大战设计

点击以下链接获取源码资源&#xff1a; https://download.csdn.net/download/qq_64505944/87953348?spm1001.2014.3001.5503 《彩图版飞机大战》程序使用说明 在PyCharm中运行《彩图版飞机大战》即可进入如图1所示的游戏界面。 图1 游戏主界面 具体的操作步骤如下&#xff…

ASEMI代理NXP可控硅BT139-600E参数,BT139-600E规格

编辑-Z BT139-600E参数描述&#xff1a; 型号&#xff1a;BT139-600E 断态重复峰值电压VDRM&#xff1a;600V RMS导通电流IT(RMS)&#xff1a;16A 非重复峰值导通电流ITSM&#xff1a;155A 峰值栅极电流IGM&#xff1a;2A 峰值栅极功率PGM&#xff1a;5W 储存温度Tstg&…

C++进阶—二叉搜索树Key、Key-Value模型应用及二叉树OJ(非递归实现遍历)

目录 1、二叉树搜索模型实现及应用场景 1. 二叉搜索树Key模型及其应用 2. 二叉搜索树Key-Value模型及其应用 2、二叉树OJ 2.1 根据二叉树创建字符串 2.2 二叉树的层序遍历I 2.3 二叉树的层序遍历II 2.4 二叉树的最近公共祖先 2.5 二叉搜索树及双向链表 2.6 从前序与中…

想学芯片专业?一文讲清楚芯片报考指南

2021年清北相继成立集成电路学院之后&#xff0c;国内在电子方面有实力积累的高校纷纷跟进&#xff0c;设立集成电路学院、开设集成电路相关专业。 直到今年&#xff0c;高校在集成电路方面的投入和培养力度&#xff0c;仍在持续并越来越大。 就在今年&#xff0c;示范性28所…

CDN是什么?

81. CDN是什么&#xff1f; CDN&#xff08;Content Delivery Network&#xff09; 即内容分发网络&#xff0c;是一种分布式的网络架构&#xff0c;旨在提高用户获取内容的速度、可用性和安全性。CDN通过将内容部署到全球各个节点服务器&#xff0c;并根据用户的地理位置将内…

有关软件检测实验室检测报告的全部知识点盘点

检测报告是实验室检测成果的重要载体&#xff0c;也是软件检测实验室质量管理水平的一个重要体现&#xff0c;本文我们就一起来看一下&#xff0c;软件检测实验室在申请cnas测试认证时&#xff0c;应该如何规范实验室的检测报告。 首先我们一起来看一下&#xff0c;cnas官方对…

记编译 Doris 的过程

目录 概述 1、关于clang 2、链接静态库的问题 3、 cmake的知识 4、关于nm 5、关于 ABI 6、关于debug info 概述 尝试编译 doris&#xff0c;其过程异常坎坷&#xff0c;不过也学到了很多东西。 首先&#xff0c;按照doris官网上的编译指导&#xff0c;下载ldb_toolchai…