HTTP-response

1. HTTP协议补充

  1. 请求消息:客户端发送给服务器端的数据

    • 数据格式:请求行、请求头、请求空行、请求体
  2. 响应消息:服务器端发送给客户端的数据

    • 响应行

      1. 组成:协议/版本 响应状态码 状态码描述 HTTP/1.1 200 OK
      2. 响应状态码:服务器告诉客户端本次请求和响应的一个状态
        • 1XX:服务器接收客户端消息,但没有接收完成,等待一段时间发送1XX状态码。
        • 2XX:成功。代表200
        • 3XX:重定向。代表302(重定向)、304(访问缓存)
        • 4XX:客户端错误。404(请求路径没有对应的资源) 405(请求方式没有对应的doXxx方法)
        • 5XX:服务器端错误。500服务器端异常
    • 响应头

      1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式。text/html;charset:utf-8

      2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据

        • in-line:默认值,在当前页面内打开
        • attachment;filename=xxx:以附件形式打开响应体。文件下载
    • 响应空行

    • 响应体:传输的数据

2. response:设置响应消息

  1. 设置响应行

    • 设置状态码:setStatus(int sc)
  2. 设置响应头

    • setHeader(String name,String value)
  3. 设置响应体

    • 获取输出流
      1. 字符输出流:PrintWriter getWriter()
      2. 字节输出流:ServletOutputStream getOutputStream()
    • 使用输出流,将数据输出到客户端浏览器中

3.重定向

  • 当前服务器资源告诉浏览器重定向,状态码302

  • 告诉浏览器重定向资源的路径,响应头location:B资源的路径

  • 代码实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //获取虚拟路径
    String contextPath = request.getContextPath();
    //方法1
    //访问/responseDemo1,会自动跳转到/responseDemo2
    response.setStatus(302);
    //设置响应头
    response.setHeader("location",contextPath+"/responseDemo2");

    //方法2
    response.sendRedirect(contextPath+"/responseDemo2");
  • 特点

    重定向redirect的特点

    1. 地址栏发生变化
    2. 重定向可以访问其他站点(服务器)的资源
    3. 重定向是两次请求,不能用request对象来共享数据

    转发forward的特点

    1. 地址栏不发生变化
    2. 转发只能访问当前服务器下的资源
    3. 转发是一次请求,能用request对象来共享数据
  • 路径写法

    1. 路径分类

      相对路径:通过相对路径不可以确定唯一资源。以 . 开头,如./index.html。

      ​ 找到当前资源和目标资源之间的相对位置对应关系

      绝对路径:可以确定唯一资源。以/开头,如/test/demo

      ​ 给客户端浏览器使用:需要加虚拟目录。a或form标签 重定向。。。

      ​ 给服务器端使用:不需要加虚拟目录。转发

4.服务器输出字符数据到浏览器

  1. 获取字符输出流

  2. 输出数据

  3. 解决中文乱码问题

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("demo2......");
    //获取流对象之前,设置流的默认编码,默认是ISO-8859-1
    response.setCharacterEncoding("gbk");
    //告诉浏览器,服务器发送的消息体数据的编码。建议浏览器使用该编码
    //response.setHeader("content-type","text/html;charset=gbk");
    response.setContentType("text/html;charset=gbk");
    PrintWriter writer = response.getWriter();
    writer.write("<h1>hello response</h1>");
    writer.write("hello response");
    writer.write("你好 response");
    }

5.获取字节输出流

1
2
3
4
5
6
7
8
9
10
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo2......");
//获取流对象之前,设置流的默认编码,默认是ISO-8859-1
response.setCharacterEncoding("utf-8");
//告诉浏览器,服务器发送的消息体数据的编码。建议浏览器使用该编码
response.setContentType("text/html;charset=utf-8");
//获取字节输出流
ServletOutputStream os = response.getOutputStream();java
os.write("你好".getBytes("UTF-8"));///默认GBK,要和浏览器一致
}

6.验证码

  • 本质是一张图片
  • Checkcode代码
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
@WebServlet("/CheckCodeServlet")
public class CheckCodeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int width = 50;
int height = 25;
//1.创建一个对象,在内存中图片(验证码图片对象)
BufferedImage Image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//2.美化图片
//获取画笔
Graphics graphics = Image.getGraphics();
//设置画笔颜色
graphics.setColor(Color.orange);
//填充颜色
graphics.fillRect(0,0,width,height);
graphics.setColor(Color.BLACK);
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
String code = "";
//生成随机角标
Random random = new Random();
for (int i = 1; i <= 4; i++) {
int index = random.nextInt(str.length());
//获取随机字符
char ch = str.charAt(index);
//写验证码
graphics.drawString(ch+"",width/5*i,height/2);
code += ch;
}
//画干扰线
graphics.setColor(Color.CYAN);
for (int i = 0; i < 10; i++) {
int x1 = random.nextInt(width);
int x2 = random.nextInt(width);
int y1 = random.nextInt(height);
int y2 = random.nextInt(height);
graphics.drawLine(x1,y1,x2,y2);
}
System.out.println(code);
//3.将图片输出到页面展示
ImageIO.write(Image,"jpg",response.getOutputStream());

}

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

regist.html

1
2
3
4
<form action="/test/requestdemo4"method="post">
<input type="text"name="checkcode"placeholder="请输入验证码">
<img id="check" src="/test/CheckCodeServlet" alt=""><br>
</form>