JavaWeb学习总结(七)--HttpServletResponse(二)

[TOC]

一、HttpServletResponse常见应用——生成验证码

1.1、生成随机图片用作验证码

  生成图片主要用到了一个BufferedImage类,

  img

生成随机图片范例:

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
package org.wuqinghua.java.ch04;
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;
/**
* Created by wuqinghua on 17/7/2.
*/
@WebServlet(urlPatterns = "/responseDemo05")
public class ResponseDemo05 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置浏览器每隔5秒刷新一次
resp.setHeader("refresh", "5");
//1.在内存中创建一张图片
BufferedImage image = new BufferedImage(100, 25, BufferedImage.TYPE_INT_RGB);
//2.绘制图片 获取画笔
Graphics2D g = (Graphics2D) image.getGraphics();
g.setColor(Color.WHITE);//设置图片的背景色
g.fillRect(0, 0, 100, 25);//填充背景
//3.向图片上写数值
g.setColor(Color.BLUE);
g.setFont(new Font(null, Font.BOLD, 20));
g.drawString(makeNum(),0,20);
//4.设置浏览器以图片方式打开
resp.setHeader("content-type","image/jpeg");
//5.设置浏览器不缓存图片
resp.setDateHeader("expries",-1);
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragma","no-cache");
//6.将图片写到浏览器
ImageIO.write(image,"jpg",resp.getOutputStream());
}
private String makeNum() {
Random random = new Random();
String num = random.nextInt(9999999) + "";
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < 7 - num.length(); i++) {
buffer.append("0");
}
num = buffer.toString() + num;
return num;
}
}

运行结果如下:

  img

二、HttpServletResponse常见应用——设置响应头控制浏览器的行为

2.1、设置http响应头控制浏览器禁止缓存当前文档内容

1
2
3
response.setDateHeader("expries", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");

2.2、设置http响应头控制浏览器定时刷新网页(refresh)

1
response.setHeader("refresh", "5");//设置refresh响应头控制浏览器每隔5秒钟刷新一次

2.3、通过response实现请求重定向

  请求重定向指:一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向。

  应用场景:用户登陆,用户首先访问登录页面,登录成功后,就会跳转到某个页面,这个过程就是一个请求重定向的过程

  实现方式:response.sendRedirect(String location),即调用response对象的sendRedirect方法实现请求重定向
  sendRedirect内部的实现原理:使用response设置**302状态码和设置location响应头实现重定向**

例如:

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
package gacl.response.study;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResponseDemo04 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 1.调用sendRedirect方法实现请求重定向,
* sendRedirect方法内部调用了
* response.setHeader("Location", "/JavaWeb_HttpServletResponse_Study_20140615/index.jsp");
* response.setStatus(HttpServletResponse.SC_FOUND);//设置302状态码,等同于response.setStatus(302);
*/
response.sendRedirect("/JavaWeb_HttpServletResponse_Study_20140615/index.jsp");
//2.使用response设置302状态码和设置location响应头实现重定向实现请求重定向
//response.setHeader("Location", "/JavaWeb_HttpServletResponse_Study_20140615/index.jsp");
//response.setStatus(HttpServletResponse.SC_FOUND);//设置302状态码,等同于response.setStatus(302);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

三、response细节问题

  getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。
  getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
  Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
  Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。