一、问题:

  做web项目经常提到的一个需求就是页面的文件下载,那么下载的时候在后台为什么要设置响应消息头?为什么这样设置?

二、解决:

  1、例子

//设置响应的消息头
response.setContentType("text/html;charset=UTF-8");
//设置响应类型中包含文件附件
response.setHeader("Content-Disposition", "attachment; " +
"filename="+new String(AREA_FILE.getBytes("gb2312"), "ISO-8859-1"));

  2、setContentType:

    它的作用就是,设置客户端的MIME类型【多类型邮件传输协议】,浏览器可以根据该类型来指定程序解析对应类型的文件

    比如,servlet里写入了一个 <jpg> 标签,如果不指定为jpg类型,页面是不能直接显示的

    它的默认类型是[text/html]类型,所以返回的是html也可以不设置

    包括下载文件的时候,不指定也是可以的,因为后边还设置了携带的响应附件,可以支持文件的下载

    也可以指定响应的编码,让浏览器可以正确的显示信息

  3、setHeader:

    它的作用就是设置响应的头部

    Content-Disposition:指明响应的配置信息

    attachment:指明包含附件

  4、new String(AREA_FILE.getBytes("gb2312"), "ISO-8859-1"))

    这里特别说明,如果文件名不包含中文可以不设置该项

    如果包含中文名,则需要设置编码,否则文件名下载后中文字符会乱码

    其中,getBytes指定了编码的方式,ISO-8859-1指定了解码(读取)的方式

    想要转换编码,就是先编码,再解码

    如:

      utf-8转gbk :new String(str.getBytes("gbk"), "gbk"))

      gbk转utf-8 :new String(str.getBytes("utf-8"), "utf-8"))

    

三、扩展:

  那么为什么下载的文件名中的中文字符会乱码?

  首先,我们常用的编码:

  (1)ISO-8859-1:它是单字节编码,tomcat默认的字符编码方式,但是可以标识的字符量比较少

  (2)unicode:单字节编码

  (3)gb2312:我们大中国的汉字编码,两个字节标识一个汉字

  (4)UTF-8:万国码,支持世界字符,是可变的长度编码,字节数不定

  乱码的出现就是因为,java的字符串默认采用的编码是unicode编码,而tomcat传输又更改为iso-8859-1,

  页面读取的时候,碰到汉字本来双字节的读取成了单字节,出现了乱码

  所以要把字符串以【gbk】编码,再以【iso-8859-1】读取相应的字符,传递到页面就是【iso-8859-1】,可以正常显示中文字符

  

  

javaWeb项目-文件下载的消息头和编码问题的更多相关文章

  1. JAVAWEB项目报"xxx响应头缺失“漏洞处理方案

    新增一个拦截器,在拦截器doFilter()方法增加以下代码 public void doFilter(ServletRequest request, ServletResponse response ...

  2. 关于服务器响应,浏览器请求的理解以及javaWeb项目的编码问题

    1.服务器(Server)响应,浏览器(Brower)请求: 对于B/S的软件,数据的传递体现在,用户利用浏览器请求,以获得服务器响应.在JavaWeb项目中,大致包含.java文件的数据处理模块,和 ...

  3. JavaWeb项目前端规范(采用命名空间使js深度解耦合)

    没有规矩不成方圆,一个优秀的代码架构不仅易于开发和维护,而且是一门管理与执行的艺术. 这几年来经历了很多项目,对代码之间的强耦合及书写不规范,维护性差等问题深恶痛绝.在这里,通过仔细分析后,结合自己的 ...

  4. HTTP消息头

    (一)初识HTTP消息头 但凡搞WEB开发的人都离不开HTTP(超文本传输协议),而要了解HTTP,除了HTML本身以外,还有一部分不可忽视的就是HTTP消息头.做过Socket编程的人都知道,当我们 ...

  5. HTTP协议的消息头:Content-Type和Accept的作用

    一.背景知识 1.概述 Http报头分为通用报头,请求报头,响应报头和实体报头. 请求方的http报头结构:通用报头|请求报头|实体报头 响应方的http报头结构:通用报头|响应报头|实体报头 Acc ...

  6. javaweb项目中遇到的一些乱码问题

    在做javaweb项目时,我们经常会遇到一些乱码问题: 首先,确定一点思想:要想不乱码,你要保证编码一致就行了,即统一编码~ 其一,jsp等页面中的中文显示乱码(这里不只是说jsp文件,其它文件也有这 ...

  7. javaweb(四)——Http协议(请求头,响应头详解)

    一.什么是HTTP协议 HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的 ...

  8. 手把手搭建一个完整的javaweb项目

    手把手搭建一个完整的javaweb项目 本案例使用Servlet+jsp制作,用MyEclipse和Mysql数据库进行搭建,详细介绍了搭建过程及知识点. 下载地址:http://download.c ...

  9. Javaweb项目中文乱码

    Javaweb项目中文乱码 一.了解常识: 1.UTF-8国际编码,GBK中文编码.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立; 2.web tomcat: ...

随机推荐

  1. Kafka TimeoutException: Batch Expired 问题排查

    当前系统中produer配置request.timeout.ms=30000(30秒),但是broker端配置zookeeper.connection.timeout.ms=1000000,kafka ...

  2. 基于HP DL388 Gen 9服务器基本配置(ESXI 6.5)

    最近一段时间由于做毕业设计的原因,一直处于忙碌状态,刚做完毕业设计,导师处于项目的原因,买了一台惠普服务器(人民币1.7万),服务器自带的内存仅有16 G,硬盘也就只有600G,而且磁盘还做了raid ...

  3. 6、Dubbo-配置(1)

    覆盖关系 下图展示了配置覆盖关系的优先级,从上到下优先级依次降低: 参考官网:http://dubbo.apache.org/zh-cn/docs/user/configuration/configu ...

  4. SpringBoot实战(十一)之与JMS简单通信

    什么是JMS? 引用百度百科上的说明: JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之 ...

  5. Jquery mobile 自定义 返回按钮 data-rel="back"

    data-rel="back" 第一个页面 主页面 studentmaster.html  通过下面js脚本跳转到详情页面 window.location.href="s ...

  6. 利用maven开发springMVC项目(三)——数据库配置

    前两节介绍了开发环境的搭建以及框架的配置 现在主要介绍在eclipse中如何将SpringMVC.hibernate.mysql数据库结合起来. 数据库配置 下面,就要通过一个简单的例子,来介绍Spr ...

  7. 【luogu P3959 宝藏】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3959 我只是心血来潮想学SA(考场上骗分总行吧). 这个题可以状压DP.爆搜+剪枝.有意思的还是随机化搜索( ...

  8. php版本低更换php版本-问题以解决

    Parse error: syntax error, unexpected 'class' (T_CLASS), expecting identifier (T_STRING) or variable ...

  9. Factory(工厂)模式

    设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题. ...

  10. 容易忽略的expect脚本问题,暗藏的僵尸进程,wait命令不要漏掉

    问题描述 前几天有个小需求,用到expect脚本去循环的发送一些数据,主要问题代码如下: #! /usr/bin/expect while {true} { set timeout 60 spawn ...