java中如何设置HTTP协议的头信息(header)

java中如何设置HTTP协议的头信息(header),第1张

首先,我们先看一下http的头信息到底是什么:

HTTP(HyperTextTransferProtocol) 即超文本传输协议,目前网页传输的的通用协议。HTTP协议采用了请求/响应模型,浏览器或其他客户端发出请求,服务器给与响应。就整个网络资源传输而 言,包括message-header和message-body两部分。首先传递message- header,即http header消息。http header 消息通常被分为4个部分: general header, request header, response header, entity header。但是这种分法就理解而言,感觉界限不太明确,根据日常使用,大体分为Request和Response两部分。

在通常的servlet/jsp应用中,我们只是从http的header中取得信息,如果要设置信息,需要用到HttpClient,具体的设置方法如下:

HttpResponse response = null

HttpGet get = new HttpGet(url)

get.addHeader("Accept", "text/html")

get.addHeader("Accept-Charset", "utf-8")

get.addHeader("Accept-Encoding", "gzip")

get.addHeader("Accept-Language", "en-US,en")

get.addHeader("User-Agent", "Mozilla/5.0 (X11Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.160 Safari/537.22")

response = client.execute(get)

HttpEntity entity = response.getEntity()

Header header = entity.getContentEncoding()

if (header != null)

{

HeaderElement[] codecs = header.getElements()

for (int i = 0i <codecs.lengthi++)

{

if (codecs[i].getName().equalsIgnoreCase("gzip"))

{

response.setEntity(new GzipDecompressingEntity(entity))

}

}

}

return response

其中,client为一个HttpClient的实力,创建方式如:

SchemeRegistry schemeRegistry = new SchemeRegistry()

schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()))

schemeRegistry.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory()))

PoolingClientConnectionManager cm = new PoolingClientConnectionManager(schemeRegistry)

cm.setMaxTotal(200)

cm.setDefaultMaxPerRoute(2)

HttpHost googleResearch = new HttpHost("research.google.com", 80)

HttpHost wikipediaEn = new HttpHost("en.wikipedia.org", 80)

cm.setMaxPerRoute(new HttpRoute(googleResearch), 30)

cm.setMaxPerRoute(new HttpRoute(wikipediaEn), 50)

DefaultHttpClient client = new DefaultHttpClient(cm)

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扩展头的例子:

<%@ page pageEncoding="GBK" contentType="text/htmlcharset=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", "attachmentfilename=aaa.doc")

%>

Content-Disposition中指定的类型是文件的扩展名,并且d出的下载对话框中的文件类型图片是按照文件的扩展名显示的,点保存后,文件以filename的值命名,保存类型以Content中设置的为准。

注意:在设置Content-Disposition头字段之前,一定要设置Content-Type头字段。

3.如何实现文件下载

要实现文件下载,我们只需要设置两个特殊的相应头,它们是什么头?如果文件名带中文,该如何解决?

两个特殊的相应头:

----Content-Type:       application/octet-stream

----Content-Disposition: attachmentfilename=aaa.zip

例如:

response.setContentType("image/jpeg")

response.setHeader("Content- Disposition","attachmentfilename=Bluehills.jpg")

如果文件中filename参数中有中文,则就会出现乱码。

解决办法:

(1)MimeUtility.encodeWord("中文.txt")//现在版本的IE还不行

(2)new String("中文".getBytes("GB2312"),"ISO8859- 1")//实际上这个是错误的

4. 测试并分析文件名乱码问题

response.setHeader()下载中文文件名乱码问题

response.setHeader("Content-Disposition", "attachment filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"))

response.setHeader(...)文件名中有空格的时候

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

    }

一秒刷新页面一次

response.setHeader("refresh","1")

二秒跳到其他页面

response.setHeader("refresh","2URL=otherPagename")

没有缓存:

response.setHeader("Pragma", "No-cache")

response.setHeader("Cache-Control", "no-cache")

设置过期的时间期限  

  response.setDateHeader("Expires", System.currentTimeMillis()+自己设置的时间期限)

访问别的页面:

response.setStatus(302) 

response.setHeader("location","url")

通知浏览器数据采用的压缩格式:

response.setHeader("Content-Encoding","压缩后的数据")

高速浏览器压缩数据的长度:

response.setHeader("Content-Length",压缩后的数据.length+"")

高速浏览器图片或视频:

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)

}

高速浏览器已下载的形式:

response.setHeader("Content-disposition","attachmentfilename=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)

}

步骤如下:

1、在web工程里面创建一个Servlet类,继承HttpServlet,重写doPost,doGet方法,在doPost方法中调用doGet方法;

2、在doGet方法中把要设置到jsp页面的值存到request中;

3、在doGet方法中添加转发到jsp页面的代码;

4、在jsp页面中使用jstl标签获取存入的值。

事例代码如下:

Servlet类:

public class DemoServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

request.setAttribute("name", "nameValue")

request.getRequestDispatcher("/demo.jsp").forward(request, response)

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response)

}

}

jsp页面:

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>Demo</title>

<meta http-equiv="pragma" content="no-cache">

<meta http-equiv="cache-control" content="no-cache">

<meta http-equiv="expires" content="0">

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

<meta http-equiv="description" content="This is my page">

</head>

<body>

${name }

</body>

</html>

其中,<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>表示导入jstl标签库,没导入的话无法使用jstl标签,使用jstl标签可以减少很多代码量,导入jstl标签后就可以通过使用${}的方法来获取值了。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/7947727.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存