Java Web -- Servlet(9) Http协议详细分析--HTTP响应部分(Refresh、Content-Disposition、缓存例子)(2)

三、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();

}

}

Java Web -- Servlet(9) Http协议详细分析--HTTP响应部分(Refresh、Content-Disposition、缓存例子)(2)_第1张图片 


 

可弹出下载窗口,下载下来即是您的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());

}

 

}

当查看缓存文件时,可以看到该缓存到期时间是一个小时。

 

 

当在地址栏中单击回车键时,如果该页面没有更新,则该页面是没有变化的,因为该页面是从缓存文件中取。

时间没有任何更新:

 

你可能感兴趣的:(java,Web,http,servlet)