response.setHeader()的用法
1. HTTP消息头
(1)通用信息头
即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma
主要: Cache-Control , Connection , Data , Pragma , Trailer , Transfer-Encoding , Upgrade
(2)请求头
用于在请求消息中向服务器传递附加信息,主要包括客户机可以接受的数据类型,压缩方法,语言,以及客户计算机上保留的信息和发出该请求的超链接源地址等.
主要: Accept , Accept-Encoding , Accept-Language , Host ,
(3)响应头
用于在响应消息中向客户端传递附加信息,包括服务程序的名称,要求客户端进行认证的方式,请求的资源已移动到新地址等.
主要: Location , Server , WWW-Authenticate(认证头)
(4)实体头
用做实体内容的元信息,描述了实体内容的属性,包括实体信息的类型,长度,压缩方法,最后一次修改的时间和数据的有效期等.
主要: Content-Encoding , Content-Language , Content-Length , Content-Location , Content-Type
(5)扩展头
主要:Refresh, Content-Disposition
2. 几个主要头的作用
(1)Content-Type的作用
该实体头的作用是 让服务器告诉 浏览器 它发送的数据属于什么文件类型。
例如:当Content-Type 的值设置为text/html和text/plain 时,前者会让浏览器把接收到的实体内容以HTML格式解析,后者会让浏览器以普通文本解析.
(2)Content-Disposition 的作用
当Content-Type 的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型。
Content-Disposition扩展头的例子:
1 2 3 4 5 6 7 | <%@ page pageEncoding= "GBK" contentType= "text/html;charset=utf-8" import = "java.util.*,java.text.*" %> <%=DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.CHINA).format( new Date()) %> <% response.setHeader( "Content-Type" , "video/x-msvideo" ); response.setHeader( "Content-Disposition" , "attachment; filename=aaa.doc" ); %> |
Content-Disposition中指定的类型是文件的扩展名,并且弹出的下载对话框中的文件类型图片是按照文件的扩展名显示的,点保存后,文件以filename的值命名,保存类型以Content中设置的为准。(attachment:附件)
注意:在设置Content-Disposition头字段之前,一定要设置Content-Type头字段。
3.如何实现文件下载
要实现文件下载,我们只需要设置两个特殊的相应头,它们是什么头?如果文件名带中文,该如何解决?
两个特殊的相应头:
----Content-Type: application/octet-stream
----Content-Disposition: attachment;filename=aaa.zip
例如:
1 2 | response.setContentType( "image/jpeg" ); response.setHeader( "Content- Disposition" , "attachment;filename=Bluehills.jpg" ); |
如果文件中filename参数中有中文,则就会出现乱码。
解决办法:
1 2 | ( 1 )MimeUtility.encodeWord( "中文.txt" ); //现在版本的IE还不行 ( 2 ) new String( "中文" .getBytes( "GB2312" ), "ISO8859- 1" ); //实际上这个是错误的 |
4. 测试并分析文件名乱码问题
response.setHeader()下载中文文件名乱码问题
1 | response.setHeader( "Content-Disposition" , "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8" )); |
response.setHeader(...)文件名中有空格的时候
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | String fileName = StringUtils.trim(file.getName()); String formatFileName = encodingFileName(name); //在后面定义方法encodingFileName(String fileName); response.setHeader( "Content-Disposition" , "attachment; filename=" + formatFileName ); //处理文件名中出现的空格 //其中%20是空格在UTF-8下的编码 public static String encodingFileName(String fileName) { String returnFileName = "" ; try { returnFileName = URLEncoder.encode(fileName, "UTF-8" ); returnFileName = StringUtils.replace(returnFileName, "+" , "%20" ); if (returnFileName.length() > 150 ) { returnFileName = new String(fileName.getBytes( "GB2312" ), "ISO8859-1" ); returnFileName = StringUtils.replace(returnFileName, " " , "%20" ); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); if (log.isWarnEnabled()) { log.info( "Don't support this encoding ..." ); } } return returnFileName; } |
一秒刷新页面一次
1 | response.setHeader( "refresh" , "1" ); |
二秒跳到其他页面
1 | response.setHeader( "refresh" , "2;URL=otherPagename" ); |
没有缓存:
1 2 | response.setHeader( "Pragma" , "No-cache" ); response.setHeader( "Cache-Control" , "no-cache" ); |
设置过期的时间期限
1 | response.setDateHeader( "Expires" , System.currentTimeMillis()+自己设置的时间期限); |
访问别的页面:
1 2 | response.setStatus( 302 ); response.setHeader( "location" , "url" ); |
通知浏览器数据采用的压缩格式:
1 | response.setHeader( "Content-Encoding" , "压缩后的数据" ); |
高速浏览器压缩数据的长度:
1 | response.setHeader( "Content-Length" ,压缩后的数据.length+ "" ); |
高速浏览器图片或视频:
1 2 3 4 5 6 7 8 | response.setHeader( "Content-type" , "这个参数在tomcat里conf下的web.xml里面找" ); inputstream in= this .getServletContext.getResourceAsStream( "/2.jpg" ); int len= 0 ; byte buffer[]= new byte [ 1024 ] outputStream out = response.getOutputStream(); while (len=in.read(buffer)> 0 ){ out.write(buffer, 0 ,len) } |
高速浏览器已下载的形式:
1 2 3 4 5 6 7 8 | response.setHeader( "Content-disposition" , "attachment;filename=2.jpg" ); inputstream in= this .getServletContext.getResourceAsStream( "/2.jpg" ); int len= 0 ; byte buffer[]= new byte [ 1024 ] outputStream out = response.getOutputStream(); while (len=in.read(buffer)> 0 ){ out.write(buffer, 0 ,len) |