javaWeb项目-文件下载的消息头和编码问题
一、问题:
做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项目-文件下载的消息头和编码问题的更多相关文章
- JAVAWEB项目报"xxx响应头缺失“漏洞处理方案
新增一个拦截器,在拦截器doFilter()方法增加以下代码 public void doFilter(ServletRequest request, ServletResponse response ...
- 关于服务器响应,浏览器请求的理解以及javaWeb项目的编码问题
1.服务器(Server)响应,浏览器(Brower)请求: 对于B/S的软件,数据的传递体现在,用户利用浏览器请求,以获得服务器响应.在JavaWeb项目中,大致包含.java文件的数据处理模块,和 ...
- JavaWeb项目前端规范(采用命名空间使js深度解耦合)
没有规矩不成方圆,一个优秀的代码架构不仅易于开发和维护,而且是一门管理与执行的艺术. 这几年来经历了很多项目,对代码之间的强耦合及书写不规范,维护性差等问题深恶痛绝.在这里,通过仔细分析后,结合自己的 ...
- HTTP消息头
(一)初识HTTP消息头 但凡搞WEB开发的人都离不开HTTP(超文本传输协议),而要了解HTTP,除了HTML本身以外,还有一部分不可忽视的就是HTTP消息头.做过Socket编程的人都知道,当我们 ...
- HTTP协议的消息头:Content-Type和Accept的作用
一.背景知识 1.概述 Http报头分为通用报头,请求报头,响应报头和实体报头. 请求方的http报头结构:通用报头|请求报头|实体报头 响应方的http报头结构:通用报头|响应报头|实体报头 Acc ...
- javaweb项目中遇到的一些乱码问题
在做javaweb项目时,我们经常会遇到一些乱码问题: 首先,确定一点思想:要想不乱码,你要保证编码一致就行了,即统一编码~ 其一,jsp等页面中的中文显示乱码(这里不只是说jsp文件,其它文件也有这 ...
- javaweb(四)——Http协议(请求头,响应头详解)
一.什么是HTTP协议 HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的 ...
- 手把手搭建一个完整的javaweb项目
手把手搭建一个完整的javaweb项目 本案例使用Servlet+jsp制作,用MyEclipse和Mysql数据库进行搭建,详细介绍了搭建过程及知识点. 下载地址:http://download.c ...
- Javaweb项目中文乱码
Javaweb项目中文乱码 一.了解常识: 1.UTF-8国际编码,GBK中文编码.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立; 2.web tomcat: ...
随机推荐
- java内部类之成员内部类之局部内部类
局部内部类特点: 1.定义在代码块.方法体内的类叫局部内部类 2.局部内部类访问外部类的属性和方法使用“外部类名.this.属性名”和“外部类名.this.方法名(参数)”的形式 3.对外部世界完全隐 ...
- java中JVM的原理重温【转】
一.基础理论知识 1.java虚拟机的生命周期: Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序.程序开始执行时他才运行,程序结束时他就停止.你在同一台机器上 ...
- PHP笔记09:PHP之 MVC理解
1. 首先通俗地说说我对MVC的理解: Model是负责干活的,它干的活主要是从数据库中获取需要的数据以及对获取的数据按照业务逻辑进行加工处理,至于为什么要干某件活,何时干某件活它一概不管,而这正是C ...
- linux各种压缩包的压缩和解压方法
.tar/.war(tar是打包,不是压缩) 解包:tar xvf FileName.tar / FileName.war 打包:tar cvf FileName.tar DirName .gz 解压 ...
- Win32多线程之核心对象
CreateThread()传回两个值,用以识别一个新的线程.第一个值是个Handle, 这也是CreateThread()的返回值,大部分与线程有关的API函数都需要它.第二个值是由lpThrea ...
- Spotlight On Oracle安装和使用
Spotlight On Oracle安装和使用 软件版本:Version: 5.0.1.1022 注册码:063920179532918005749 Site Message:Quest Free ...
- 关于JavaScript 常见的面试题
关于JavaScript常见的面试题总结 一.JavaScript基本数据类型 null:空.无.表示不存在,当为对象的属性赋值为null,表示删除该属性 undefined:未定义.当声明变量却没有 ...
- spring boot 配置Rabbit
单独安装Rabbit服务并设置启动,可以通过浏览器访问,一般访问地址是http://localhost:15672/ ,用户名密码看配置文件的用户名密码 1 实例化配置类注解 import org.s ...
- OpenID Connect Core 1.0(六)使用隐式验证流
3.2 使用隐式验证流(Authentication using the Implicit Flow) 本节描述如何使用隐式流程执行验证.使用隐式流程时,所有令牌从授权终结点返回:不使用令牌终结点返回 ...
- HTTPweb服务器——HTTP基本知识
对于HTTP来说,我们不需要说太多,HTTP又叫做超文本传输协议,现如今利用最多的版本是1.1版本. HTTP的特点:C/S模式,B/S模式 简单快速:基于请求和响应,请求只需要传送请求方法和路径. ...