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()相关推荐

  1. response.setContentType()与response.setHeader()

    1.一秒刷新页面一次 response.setHeader("refresh","1"); 2.二秒跳到其他页面 response.setHeader(&quo ...

  2. response.setHeader()的用法

    1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma 主要: Cache-Control , Connecti ...

  3. response.setHeader()的用法详解及实现文件下载过程中出现问题的分析

    response.setHeader()用法详解,转载记录: 1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Prag ...

  4. response setHeader 设置下载中文文件名乱码问题

    1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma 主要: Cache-Control , Connecti ...

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

    1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma 主要: Cache-Control , Connecti ...

  6. Java导出excel中response.setHeader()参数设置

    response.setHeader() 1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma 主要: Cac ...

  7. 浅谈response.setHeader()用法

    1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma 主要: Cache-Control , Connecti ...

  8. response.setHeader()几个主要头的作用

    response.setHeader()下载中文文件名乱码问题 收藏  1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data ...

  9. response.setHeader的各种用法

    1.一秒刷新页面一次 response.setHeader("refresh","1"); 2.二秒跳到其他页面 response.setHeader(&quo ...

  10. 响应response.setHeader方法

    1.一秒刷新页面一次 response.setHeader("refresh","1"); 2.五秒跳到其他页面 response.setHeader(&quo ...

最新文章

  1. fastdfs 开启 token 防盗链,以及验证失败原因
  2. Shell合并两个文件成一个文件的两列paste,awk
  3. 工业和信息化部办公厅关于公布2021年产业技术基础公共服务平台复核结果的通知
  4. java异常及错误处理大纲
  5. 在CentOS6.5上安装Tomcat6
  6. Unreal Engine 4 字符串转换
  7. 这个 WebKit 漏洞助力 Pwn2Own 冠军斩获5.5万美元赏金(详细分析)
  8. Tensorflow+Spyder+Opencv环境搭建
  9. 重载map排序(降序)及结构体新的赋值方式
  10. 智能送药小车(F 题)--2021 年全国大学生电子设计竞赛
  11. DSS的Windows版本如何安装呢?
  12. 服务器搬迁方案_服务器搬迁方案规定搬迁之前也需要大扫除
  13. 一次人大金仓剔除锁经历
  14. openssl自建CA服务器自签证书服务器
  15. 阳了之后,北京人纷纷化身段子手 !
  16. 甘特图:项目进度管理中的跟踪工具
  17. 自定义一个可滑动时间刻度尺
  18. 东财《人力资源管理X》综合作业
  19. 华为ModelArts(声音分类与文本分类项目的创建及使用)
  20. Vue2.x动态组件的使用实现组件整合大屏展示

热门文章

  1. 【数据结构】常见的排序方法的实现以及性能对比
  2. 基于MATLAB Simulink的IEEE 13节点潮流馈线仿真模型
  3. 【对讲机的那点事】无线电在航空领域发生紧急情况的应用措施
  4. 基于深度学习的网络入侵检测研究综述
  5. 肌营养不良日常饮食要注意什么
  6. ESP8266给微信发消息,超阈值报警,消息提醒等
  7. 游双《linux高性能服务器》webserver源码
  8. java小白训练营day04-流程控制:分支+循环+异常
  9. 在电路交换中,TDM和FDM比较有什么好处?
  10. 2023年第47届(第二届)浙江技能大赛网络安全项目 (世赛省选拔赛)A模块解析