response.setHeader(Content-Type)与response.setContentType()
response.setHeader(Content-Type)与response.setCo
- 在Java Web编程中,设置
Content-Type
和Content-Length
头部是再经常不过的操作了,但是HttpServletResponse
提供了两个相关的方法来设置头部,一个是void setHeader(String name, String value)
,一个是void setContentType(String type)
或者void setContentLength(int len)
。这两者之间有什么区别吗?之前一直分不清楚,也在代码中看到两种方式都有被人使用,甚至是两个一起写的。 - 我们通过阅读Tomcat相关函数的代码,来看看这两者具体有什么区别。
javax.servlet.http.HttpServletResponse#setHeader
的实现是org.apache.catalina.connector.ResponseFacade#setHeader
,内部会调用org.apache.catalina.connector.Response#setHeader
,源码如下:
public void setHeader(String name, String value) {if (name == null || name.length() == 0 || value == null) {return;}if (isCommitted()) {return;}// Ignore any call from an included servletif (included) {return;}// char cc=name.charAt(0);if (cc=='C' || cc=='c') {if (checkSpecialHeader(name, value))return;}getCoyoteResponse().setHeader(name, value);
}
- 在
setHeader
函数中,如果发现设置的头部已c
或者C
开头,会调用checkSpecialHeader
:
// org.apache.catalina.connector.Response#checkSpecialHeader
private boolean checkSpecialHeader(String name, String value) {if (name.equalsIgnoreCase("Content-Type")) {setContentType(value);return true;}return false;
}
- 在
setHeader
函数中,为了性能,只校验第一个字母,在checkSpecialHeader
方法中进行完整的判断,如果header的名字是不区分大小写的Content-Type
,则调用setContentType
函数来设置,然后直接返回。到这里我们可以知道,使用setHeader设置头部时,如果设置Content-Type
,其实内部使用的是setContentType
函数来实现。 - 那
Content-Length
呢?不着急,继续往下看。在setHeader
函数中,如果不是c
或者C
开头的情况,会执行getCoyoteResponse().setHeader(name, value)
这句话,源码如下:
// org.apache.coyote.Response#setHeader
public void setHeader(String name, String value) {char cc=name.charAt(0);if( cc=='C' || cc=='c' ) {if( checkSpecialHeader(name, value) )return;}headers.setValue(name).setString( value);
}
- 是不是觉得眼熟,这里再一次地判断了header名称是不是以
c
或者C
开头。但是这里的checkSpecialHeader
实现是不一样的:
// org.apache.coyote.Response#checkSpecialHeader
private boolean checkSpecialHeader( String name, String value) {// XXX Eliminate redundant fields !!!// ( both header and in special fields )if( name.equalsIgnoreCase( "Content-Type" ) ) {setContentType( value );return true;}if( name.equalsIgnoreCase( "Content-Length" ) ) {try {long cL=Long.parseLong( value );setContentLength( cL );return true;} catch( NumberFormatException ex ) {// Do nothing - the spec doesn't have any "throws"// and the user might know what he's doingreturn false;}}return false;
}
- 如果header的名字是不区分大小写的
Content-Type
,则调用setContentType
函数来设置。如果header的名字是不区分大小写的Content-Length
,则调用setContentLength
函数来设置。 - 至此我们得到了结论:通过
setHeader
来设置Content-Type
或者Content-Length
头部,内部是调用setsetContentType
/setContentLength
来实现的。所以两者功能上没有区别。但是推荐使用setsetContentType
/setContentLength
因为少了多余的判断,性能更高,函数名也更明义。
response.setHeader(Content-Type)与response.setContentType()相关推荐
- response.setContentType()与response.setHeader()
1.一秒刷新页面一次 response.setHeader("refresh","1"); 2.二秒跳到其他页面 response.setHeader(&quo ...
- response.setHeader()的用法
1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma 主要: Cache-Control , Connecti ...
- response.setHeader()的用法详解及实现文件下载过程中出现问题的分析
response.setHeader()用法详解,转载记录: 1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Prag ...
- response setHeader 设置下载中文文件名乱码问题
1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma 主要: Cache-Control , Connecti ...
- response.setHeader()设置下载中文文件名乱码问题
1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma 主要: Cache-Control , Connecti ...
- Java导出excel中response.setHeader()参数设置
response.setHeader() 1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma 主要: Cac ...
- 浅谈response.setHeader()用法
1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma 主要: Cache-Control , Connecti ...
- response.setHeader()几个主要头的作用
response.setHeader()下载中文文件名乱码问题 收藏 1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data ...
- response.setHeader的各种用法
1.一秒刷新页面一次 response.setHeader("refresh","1"); 2.二秒跳到其他页面 response.setHeader(&quo ...
- 响应response.setHeader方法
1.一秒刷新页面一次 response.setHeader("refresh","1"); 2.五秒跳到其他页面 response.setHeader(&quo ...
最新文章
- fastdfs 开启 token 防盗链,以及验证失败原因
- Shell合并两个文件成一个文件的两列paste,awk
- 工业和信息化部办公厅关于公布2021年产业技术基础公共服务平台复核结果的通知
- java异常及错误处理大纲
- 在CentOS6.5上安装Tomcat6
- Unreal Engine 4 字符串转换
- 这个 WebKit 漏洞助力 Pwn2Own 冠军斩获5.5万美元赏金(详细分析)
- Tensorflow+Spyder+Opencv环境搭建
- 重载map排序(降序)及结构体新的赋值方式
- 智能送药小车(F 题)--2021 年全国大学生电子设计竞赛
- DSS的Windows版本如何安装呢?
- 服务器搬迁方案_服务器搬迁方案规定搬迁之前也需要大扫除
- 一次人大金仓剔除锁经历
- openssl自建CA服务器自签证书服务器
- 阳了之后,北京人纷纷化身段子手 !
- 甘特图:项目进度管理中的跟踪工具
- 自定义一个可滑动时间刻度尺
- 东财《人力资源管理X》综合作业
- 华为ModelArts(声音分类与文本分类项目的创建及使用)
- Vue2.x动态组件的使用实现组件整合大屏展示