HTTP响应信息数据-Response
发布日期:2021-07-01 02:40:39 浏览次数:2 分类:技术文章

本文共 10860 字,大约阅读时间需要 36 分钟。

接着前面两篇博文 、 的学习。

现在记录关于 HTTP响应信息数据-Response 的笔记。


响应信息数据 格式

  • Servlet类中service()方法的参数ServletResponse
  • Response在一次响应结束后,自动被销毁,其输出流也会自动被关闭。
  • 字符串数据,比如:
1 2 3 4 5 6 7 8 9 10 11 12 13
HTTP/1.1 200 OK Content-Type: text/html;charset=UTF-8 Content-Length: 101 Date: Wed, 06 Jun 2018 07:08:42 GMT 	               $Title$                   hello , response      

响应行

  • 格式:协议/版本 响应状态码 状态码描述

响应状态码

  • 服务器告诉客户端浏览器本次请求和响应的一个状态。

特点

  • 状态码都是3位数字

分类

  1. 1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx状态码
  2. 2xx:成功。代表:
    • 200
  3. 3xx:重定向。代表:
    • 302:重定向
    • 304:访问缓存
  4. 4xx:客户端错误。代表:
    • 403:错误是一种在网站访问过程中,常见的错误提示,表示资源不可用。服务器理解客户的请求,但拒绝处理它,通常由于服务器上文件或目录的权限设置导致的WEB访问错误。
    • 404:请求路径没有对应的资源
    • 405:请求方式没有对应的doXxx方法
  5. 5xx:服务器端错误。代表:500(服务器内部出现异常)

响应头

  • 格式:响应头名称 :值

常见的响应头

  • Content-Type
  • Content-disposition

Content-Type

  • 服务器告诉客户端本次响应体数据格式以及编码格式

Content-disposition

  • 服务器告诉客户端以什么格式打开响应体数据

  • 其值:

  • in-line:默认值,在当前页面内打开

  • attachment;filename=xxx:以附件形式打开响应体。涉及文件下载等功能。

响应空行

  • 就是一个空行(空白行)
  • 作用:分割响应头和响应体

响应体

  • 传输的数据
  • 文件、HTML网页源码等等。比如,
1 2 3 4 5 6 7 8
              $Title$                   hello , response      

案例1:重定向

  • 重定向:资源跳转的方式

步骤

  1. ResponseDemo1.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
package cn.itcast.web.servlet; 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("/responseDemo1") public class ResponseDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo1........"); //访问/responseDemo1,会自动跳转到/responseDemo2资源 /* //1. 设置状态码为302 response.setStatus(302); //2.设置响应头location response.setHeader("location","/day15/responseDemo2");*/ //演示,不能使用request对象来共享数据 request.setAttribute("msg","response"); //动态获取虚拟目录 String contextPath = request.getContextPath(); //简单的重定向方法 response.sendRedirect(contextPath+"/responseDemo2"); //response.sendRedirect("http://www.itcast.cn"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response); } }
  1. ResponseDemo2.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
package cn.itcast.web.servlet; 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("/responseDemo2") public class ResponseDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo2222222........"); //演示,不能使用request对象来共享数据 Object msg = request.getAttribute("msg"); System.out.println(msg); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response); } }
  1. 演示:

33pgFe.gif

特点

  • 重定向的特点:redirect
  1. 地址栏发生变化

  2. 重定向可以访问其他站点(服务器)的资源

  3. 重定向是两次请求不能使用request对象来共享数据

  • 转发的特点:forward
  1. 转发地址栏路径不变

  2. 转发只能访问当前服务器下的资源

  3. 转发是一次请求可以使用request对象来共享数据

  • forward 和 redirect 区别

路径写法

分类

  • 相对路径
  • 绝对路径

相对路径

  • 通过相对路径不可以确定唯一资源
  • 如:./index.html
  • 不以/开头,以.开头路径
规则
  • 找到当前资源和目标资源之间的相对位置关系
  • ./:当前目录
  • ../:后退一级目录

绝对路径(JSP时推荐使用)

  • 通过绝对路径可以确定唯一资源
  • 如:http://localhost/day15/responseDemo2/day15/responseDemo2
  • /开头的路径
  • JSP时推荐使用
规则
  • 判断定义的路径是给谁用的?判断请求将来从哪儿发出
  1. 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
  • 建议动态获取虚拟目录request.getContextPath()
  • 重定向是客户端浏览器进行的
  • <a><form>等要重定向…
  1. 给服务器使用:不需要加虚拟目录
  • 比如:转发时的路径request.getRequestDispatcher("/responseDemo2").forward(request,response);

案例2:服务器输出字符数据到浏览器

步骤

  1. 获取字符输出流

  2. 输出数据

演示

  1. ResponseDemo4.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
package cn.itcast.web.servlet; 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; import java.io.PrintWriter; @WebServlet("/responseDemo4") public class ResponseDemo4 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取流对象之前,设置流的默认编码:ISO-8859-1 设置为:GBK // response.setCharacterEncoding("utf-8"); //告诉浏览器,服务器发送的消息体数据的编码。建议浏览器使用该编码解码 //response.setHeader("content-type","text/html;charset=utf-8"); //简单的形式,设置编码 response.setContentType("text/html;charset=utf-8"); //1.获取字符输出流 PrintWriter pw = response.getWriter(); //2.输出数据 pw.write("

hello response

"); pw.write("
你好啊啊啊 response"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response); } }
  1. 演示

33AyjJ.png

注意乱码问题(编解码问题)

  1. PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8859-1
  2. 设置该流的默认编码
  3. 告诉浏览器响应体使用的编码
  • 简单的形式,设置编码,是在获取流之前设置 response.setContentType("text/html;charset=utf-8");

Demo

上面ResponseDemo4.java文件中

1 2 3 4 5 6 7 8
//获取流对象之前,设置流的默认编码:ISO-8859-1 设置为:GBK // response.setCharacterEncoding("utf-8"); //告诉浏览器,服务器发送的消息体数据的编码。建议浏览器使用该编码解码 //response.setHeader("content-type","text/html;charset=utf-8"); //简单的形式,设置编码 response.setContentType("text/html;charset=utf-8");

案例3:服务器输出字节数据到浏览器

步骤

  1. 获取字符输出流

  2. 输出数据

演示

  1. ResponseDemo5.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
package cn.itcast.web.servlet; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; 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("/responseDemo5") public class ResponseDemo5 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8"); //1.获取字节输出流 ServletOutputStream sos = response.getOutputStream(); //2.输出数据 sos.write("你好".getBytes("utf-8")); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response); } }
  1. 演示

33VhlD.png

案例4:验证码

  1. 本质:图片

  2. 目的:防止恶意表单注册

步骤

  1. 创建一对象,在内存中代表一个图片(验证码图片对象)
  2. 美化图片
  3. 将图片输出到页面展示

演示

  1. New一个CheckCode.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
package cn.itcast.web.servlet; import javax.imageio.ImageIO; 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.awt.image.BufferedImage; import java.io.IOException; /**  * @Classname CheckCode  * @Description TODO  * @Date 2020/2/23 下午 10:20  * @Created by jerry  */ @WebServlet("/checkCodeServlet") public class CheckCode  extends HttpServlet {
@Override protected void doPost(HttpServletRequest requeste, HttpServletResponse response) throws ServletException, IOException {
int width = 100; int height = 50; //1.创建一对象,在内存中代表一个图片(验证码图片对象) BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //2. 美化图片 //3.将图片输出到页面展示 ImageIO.write(image, "jpg", response.getOutputStream()); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response); } }
  1. 没有美化前

  1. 美化图片
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
package cn.itcast.web.servlet; import javax.imageio.ImageIO; 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.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; /**  * 验证码  */ @WebServlet("/checkCodeServlet") public class CheckCode  extends HttpServlet {
@Override protected void doPost(HttpServletRequest requeste, HttpServletResponse response) throws ServletException, IOException {
int width = 100; int height = 50; //1.创建一对象,在内存中代表一个图片(验证码图片对象) BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //2. 美化图片 //2-1.填充背景色 Graphics g = image.getGraphics(); //画笔对象,可画/填充 g.setColor(Color.pink); //设置画笔颜色 g.fillRect(0,0,width,height); //g.fill3DRect(0, 0, width, height, true); //2-2.画边框 g.setColor(Color.BLUE); g.drawRect(0, 0, width-1, height-1); //2-3.随机字符(全部) String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789"; //生产随机角标 Random ran = new Random(); //2-3.写验证码 for (int i = 1; i <= 4; i++) {
int index = ran.nextInt(str.length()); //获取字符 char ch = str.charAt(index); //随机字符 //写入字符 g.drawString(ch+"", width/5*i , height/2); } /*g.drawString("a", 20, 25); g.drawString("2", 33, 15); g.drawString("4", 72, 35); g.drawString("g", 80, 20);*/ //2-4.画出干扰线 g.setColor(Color.green); //随机生成坐标点 for (int i = 0; i < 10; i++) {
int x1 = ran.nextInt(width); int x2 = ran.nextInt(width); int y1 = ran.nextInt(height); int y2 = ran.nextInt(height); g.drawLine(x1, y1, x2, y2); } //3.将图片输出到页面展示 ImageIO.write(image, "jpg", response.getOutputStream()); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response); } }
  1. 美化后

33th5T.png

  1. 在页面中配合注册表单等使用验证码
  2. 点击超链接或图片后,直接加载随机验证码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
       
验证码
看不清,换一张?
  1. 演示

38avh6.gif

转载地址:https://melodyjerry.blog.csdn.net/article/details/106617566 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:HTTP案例:文件下载
下一篇:RSS订阅(含转载内容)

发表评论

最新留言

不错!
[***.144.177.141]2024年04月22日 16时20分53秒