三、HTTP响应
一个HTTP响应代表服务器向客户端回送的数据,它包括:
一个状态行、若干消息头、以及实体内容,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。
(1)状态行
状态行用于描述服务器对请求的处理结果。
(2)消息头
消息头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据。
(3)实体内容
代表服务器向客户端回送的数据。
状态行
格式:HTTP版本号
状态码
原因叙述
举例:HTTP/1.1
200
OK
状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类。
http响应的状态行举例说明
200:请求和响应没有错误,这个最常见
302:表示当你请求一个资源的时候,服务器返回302表示,让浏览器转向到另外一个资源。
//告诉浏览器我的状态码为302,是要跳转到另外一个资源的。
response.setStatus(302);
//把HTTP响应的Location设置为...
response.setHeader(“Location”,”/web应用/web资源”);
//上面两行代码与response.sendRedirect(“/web应用/web资源”);
(实际是调用了上面两行码)是一样的。
这个时候返回两个状态码
302 200
第一个是这个Servlet1要转向Servlet2,第二是要把Servlet2返回给浏览器,而这个Servlet2没有错误。
404:找不到资源
500:服务器错误
Http响应消息头详解:
Location: ....
(让浏览器重新定位到URL)
Content-Length: gzip
(告诉浏览器我的压缩方式)
Content-Language: zh-cn
(支持中文)
Content-Length: 43
(告诉浏览器回送的数据大小是多少字节)
Content-Type: image/gif
(内容格式
image/gif
还有text/html等等)
Last-Modified:...
(告诉浏览器,该资源上次更新时间)
Pefresh:5,url=http://www.baidu.com
(告诉浏览器,5秒后,刷新到百度)
Content-Disposition: attachment; filename=name.zip
(告诉浏览器,有文件下载,名字为name)
Transfer-Encoding:chunked (传输的编码)
Date: Sat, 16 Apr 2016 04:16:36 GMT
(请求日期)
Expires: -1
(告诉浏览器如何缓存页面)
Pragma: no-cache
(告诉浏览器如何缓存页面)
Cache-Control: private, max-age=0, no-cache
(告诉浏览器如何缓存页面)
Server: apache
(告诉浏览器我的服务器是Apache)
Connection:close/Keep-Alive
(长连接--保持连接)
X-Content-Type-Options: nosniff
(通过为网站提供对更多的文件及主域名进行最严格的审核,加强了安全性。)
---------------------------------------------------------------------------------------
Refresh使用:
Refresh:可延时跳转到某个页面,也可定时刷新本页面。
两种方式如下:
如:response.setHeader(“Refresh”,”秒数;url=
/Web应用/Servlet名称”);
response.setHeader(“Refresh”,”10;url=www.baidu.com”);
//10秒后跳转到百度
//如果url是本地的资源,即定时刷新本页面
Content-Disposition文件下载:
添加一个images文件夹,复制2.jpg到该目录下。
创建demo3.java,代码如下:
package com.focus.Thread;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
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;
public class demo3 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//PrintWriter out = response.getWriter();
response.setHeader("Content-Disposition", "attachment; filename=2.jpg");
//获取下载文件的绝对路径
String path = this.getServletContext().getRealPath("/images/2.jpg");
//System.out.println(path);
路径输出是绝对路径
//创建文件输入流
FileInputStream fis = new FileInputStream(path);
//做一个缓冲字节数组
byte buff[] = new byte[1024];
int len = 0;
//表示实际每次读取了多少个字节
//获取输入流
ServletOutputStream os = response.getOutputStream();
//以字节的形式输出
while((len = fis.read(buff)) > 0){
os.write(buff,
0, len);
}
os.close();
fis.close();
}
}
可弹出下载窗口,下载下来即是您的2.jpg图片文件。
缺点:没有图标。
---------------------------------------------------------------------------------------
缓存问题举例:
浏览器的默认情况下,是会缓存我们的页面,这样可以节省带宽,和提高访问速度。但有些情况我们不想让本页面缓存(如股票、基金)。
创建一个Servlet(dome3.java)代码如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("本网站是股票网站,时刻保持更新"+new
java.util.Date().toString());
}
在缓存文件中查看,可找到缓存文件。文件为无期。
当加入如下代码时,可取消缓存。
//指定该页面不缓存(针对IE浏览器)
response.setHeader("Expires",
"-1");
//为了保证兼容性(火狐浏览器...)
response.setHeader("Cache-Control:",
"no-cache");
response.setHeader("Pragma",
"no-cache");
在缓存文件中查看不到该网页的缓存文件。
设置合理的缓存时间值,可以避免浏览器频繁向服务器发送请求,提升服务器的性能,又可以不要无限期的缓存。
加入代码如下:
package com.focus.Thread;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
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;
public class demo3 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//
//指定该页面不缓存(针对IE浏览器)
//
response.setHeader("Expires", "-1");
//
//为了保证兼容性(火狐浏览器...)
//
response.setHeader("Cache-Control:", "no-cache");
//
response.setHeader("Pragma", "no-cache");
//设置缓存的时间,设置为一个小时。
response.setDateHeader("Expires", System.currentTimeMillis()+1000*3600);
PrintWriter out = response.getWriter();
out.println("本网站是股票网站,时刻保持更新"+new
java.util.Date().toString());
}
}
当查看缓存文件时,可以看到该缓存到期时间是一个小时。
当在地址栏中单击回车键时,如果该页面没有更新,则该页面是没有变化的,因为该页面是从缓存文件中取。
时间没有任何更新: