当前位置: 首页 > news >正文

正定县住房和城乡建设局网站做网站需要什么服务器配置

正定县住房和城乡建设局网站,做网站需要什么服务器配置,企信网全国,网络科技有限公司的简介纸上得来终觉浅#xff0c;绝知此事要躬行Web 开发过程中#xff0c;相信大家都遇到过附件下载的场景#xff0c;其中#xff0c;各浏览器下载后的文件名中文乱码问题或许一度让你苦恼不已。网上搜索一下#xff0c;大部分都是通过Request Headers中的UserAgent字段来判断… 纸上得来终觉浅绝知此事要躬行Web 开发过程中相信大家都遇到过附件下载的场景其中各浏览器下载后的文件名中文乱码问题或许一度让你苦恼不已。网上搜索一下大部分都是通过Request Headers中的UserAgent字段来判断浏览器类型根据不同的浏览器做不同的处理类似下面的代码// MicroSoft Browserif (agent.contains(msie) || agent.contains(trident) || agent.contains(edge)) {  // filename 特殊处理}// firefoxelse if (agent.contains(firefox)) {  // filename 特殊处理}// safarielse if (agent.contains(safari)) {  // filename 特殊处理}// Chromeelse if (agent.contains(chrome)) {  // filename 特殊处理}// 其他else{ // filename 特殊处理}//最后把特殊处理后的文件名放到head里response.setHeader(Content-Disposition,                    attachment;fileName  filename);不过这样的代码看起来很魔幻为什么每个浏览器的处理方式都不一样难道每次新出一个浏览器都要做兼容吗就没有一个统一标准来约束一下这帮浏览器吗带着这个疑惑我翻阅了 RFC 文档最终得出了一个优雅的解决方案// percentEncodedFileName 为百分号编码后的文件名response.setHeader(Content-disposition,        attachment;filename  percentEncodedFileName                 ;filename*utf-8  percentEncodedFileName);经过测试这段响应头可以兼容市面上所有主流浏览器由于是 HTTP 协议范畴所以语言无关。只要按这个规则设置响应头就能一劳永逸地解决恼人的附件名中文乱码问题。接下来课代表带大家抽丝剥茧通过阅读 RFC 文档还原一下这个响应头的产出过程。1. Content-Disposition 一切要从 RFC 6266[1] 开始在这份文档中介绍了Content-Disposition响应头其实它并不属于HTTP标准但是因为使用广泛所以在该文档中进行了约束。它的语法格式如下content-disposition  Content-Disposition :                            disposition-type *( ; disposition-parm )     disposition-type     inline | attachment | disp-ext-type                         ; case-insensitive     disp-ext-type        token     disposition-parm     filename-parm | disp-ext-parm     filename-parm        filename  value                         | filename*  ext-value其中的disposition-type有两种inline 代表默认处理一般会在页面展示attachment 代表应该被保存到本地需要配合设置filename或filename*注意到disposition-parm中的filename和filename*文档规定这里的信息可以用于保存的文件名。它俩的区别在于filename 的 value 不进行编码而filename*遵从 RFC 5987[2]中定义的编码规则Producers MUST use either the UTF-8 ([RFC3629]) or the ISO-8859-1   ([ISO-8859-1]) character set.由于filename*是后来才定义的许多老的浏览器并不支持所以文档规定当二者同时出现在头字段中时需要采用filename*忽略filename。至此响应头的骨架已经呼之欲出了摘录 [RFC 6266] 中的示例如下 Content-Disposition: attachment;                      filenameEURO rates;                      filename*utf-8%e2%82%ac%20rates这里对filename*utf-8%e2%82%ac%20rates做一下说明这个写法乍一看可能会觉得很奇怪它其实是用单引号作为分隔符将等号右边分成了三部分第一部分是字符集(utf-8)中间部分是语言(未填写)最后的%e2%82%ac%20rates代表了实际值。对于这部分的组成在RFC 2231[3].section 4 中有详细说明 A single quote is used to   separate the character set, language, and actual value information in   the parameter value string, and an percent sign is used to flag   octets encoded in hexadecimal.2.PercentEncode PercentEncode 又叫 Percent-encoding 或 URL encoding.正如前文所述filename*遵守的是[RFC 5987] 中定义的编码规则在[RFC 5987] 3.2中定义了必须支持的字符集recipients implementing this specification MUST support the character sets ISO-8859-1 and UTF-8.并且在[RFC 5987] 3.2.1规定百分号编码遵从 RFC 3986[4].section 2.1中的定义摘录如下A percent-encoding mechanism is used to represent a data octet in acomponent when that octets corresponding character is outside theallowed set or is being used as a delimiter of, or within, thecomponent.  A percent-encoded octet is encoded as a charactertriplet, consisting of the percent character % followed by the twohexadecimal digits representing that octets numeric value.  Forexample, %20 is the percent-encoding for the binary octet00100000 (ABNF: %x20), which in US-ASCII corresponds to the spacecharacter (SP).  Section 2.4 describes when percent-encoding anddecoding is applied.注意了[RFC 3986] 明确规定了空格 会被百分号编码为%20而在另一份文档 RFC 1866[5].Section 8.2.1 The form-urlencoded Media Type 中却规定The default encoding for all forms is application/x-www-form-   urlencoded. A form data set is represented in this media type as   follows:        1. The form field names and values are escaped: space        characters are replaced by , and then reserved characters        are escaped as per [URL]这里要求application/x-www-form-urlencoded类型的消息中空格要被替换为,其他字符按照[URL]中的定义来转义其中的[URL]指向的是RFC 1738[6] 而它的修订版中和 URL 有关的最新文档恰恰就是 [RFC 3986]这也就是为什么很多文档中描述空格(white space)的百分号编码结果都是 或%20如w3schools:URL encoding normally replaces a space with a plus () sign or with %20.MDN:Depending on the context, the character is translated to a (like in the percent-encoding version used in an application/x-www-form-urlencoded message), or in %20 like on URLs.那么问题来了开发过程中对于空格符的百分号编码我们应该怎么处理课代表建议大家遵循最新文档因为 [RFC 1866] 中定义的情况仅适用于application/x-www-form-urlencoded类型 就百分号编码的定义来说我们应该以 [RFC 3986] 为准所以任何需要百分号编码的地方都应该将空格符 百分号编码为%20stackoverflow 上也有支持此观点的答案When to encode space to plus () or %20?[7]3. 代码实践 有了理论基础代码写起来就水到渠成了直接上代码GetMapping(/downloadFile)public String download(String serverFileName, HttpServletRequest request, HttpServletResponse response) throws IOException {    request.setCharacterEncoding(utf-8);    response.setContentType(application/octet-stream);    String clientFileName  fileService.getClientFileName(serverFileName);    // 对真实文件名进行百分号编码    String percentEncodedFileName  URLEncoder.encode(clientFileName, utf-8)            .replaceAll(\\, %20);    // 组装contentDisposition的值    StringBuilder contentDispositionValue  new StringBuilder();    contentDispositionValue.append(attachment; filename)            .append(percentEncodedFileName)            .append(;)            .append(filename*)            .append(utf-8)            .append(percentEncodedFileName);    response.setHeader(Content-disposition,            contentDispositionValue.toString());        // 将文件流写到response中    try (InputStream inputStream  fileService.getInputStream(serverFileName);         OutputStream outputStream  response.getOutputStream()    ) {        IOUtils.copy(inputStream, outputStream);    }    return OK!;}代码很简单其中有两点需要说明一下URLEncoder.encode(clientFileName, utf-8)方法之后为什么还要.replaceAll(\\, %20)。正如前文所述我们已经明确任何需要百分号编码的地方都应该把 空格符编码为 %20而URLEncoder这个类的说明上明确标注其会将空格符转换为:The space character   is converted into a plus sign {code }.其实这并不怪 JDK因为它的备注里说明了其遵循的是application/x-www-form-urlencoded( PHP 中也有这么一个函数也是这么个套路)Translates a string into {code application/x-www-form-urlencoded} format using a specific encoding scheme. This method uses the所以这里我们用.replaceAll(\\, %20) 把号处理一下使其完全符合 [RFC 3986] 的百分号编码规范。这里为了方便说明问题把所有操作都展现出来了。当然你完全可以自己实现一个PercentEncoder类丰俭由人。[RFC 6266] 标准中filename的value是不需要编码的这里的filename后面的 value 为什么要百分号编码回顾 [RFC 6266] 文档 filename和filename*同时出现时取后者浏览器太老不支持新标准时取前者。目前主流的浏览器都采用自升级策略所以大部分都支持新标准------除了老版本IE。老版本的IE对 value 的处理策略是 进行百分号解码 并使用。所以这里专门把filename的value进行百分号编码用来兼容老版本 IE。PS课代表实测 IE11 及 Edge 已经支持新标准了。4. 浏览器测试 根据下图 statcounter 统计的 2019 年中国市场浏览器占有率课代表设计了一个包含中文英文空格的文件名 下载-down test .txt用来测试测试结果BrowserVersionpassChrome84.0.4147.125trueUCV6.2.4098.3trueSafari13.1.2trueQQ Browser10.6.1(4208)trueIE7-11trueFirefox79.0trueEdge44.18362.449.0true360安全浏览器1212.2.1.362.0trueEdge(chromium)84.0.522.59true根据测试结果可知基本已经能够兼容市面上所有主流浏览器了。5.总结 回顾本文内容其实就是浏览器兼容性问题引发的附件名乱码为了解决这个问题查阅了两类标准文档HTTP 响应头相关标准[RFC 6266]、[RFC 1866]编码标准[RFC 5987]、[RFC 2231]、[3986]、[1738]我们以 [RFC 6266] 为切入点全文总共引用了 6 个 [RFC] 相关文档引用都标明了出处感兴趣的同学可以跟着文章思路阅读一下原文档相信你会对这个问题有更深入的理解。文中代码已上传 github[8]最后不禁要感叹一下规范真是个好东西它就像 Java 语言中的 interface只制定标准具体实现留给大家各自发挥。参考资料[1]RFC 6266: https://tools.ietf.org/html/rfc6266[2]RFC 5987: https://tools.ietf.org/html/rfc5987[3]RFC 2231: https://tools.ietf.org/html/rfc2231[4]RFC 3986: https://tools.ietf.org/html/rfc3986[5]RFC 1866: https://tools.ietf.org/html/rfc1866[6]RFC 1738: https://tools.ietf.org/html/rfc1738[7]When to encode space to plus () or %20?: https://stackoverflow.com/questions/2678551/when-to-encode-space-to-plus-or-20[8]课代表的 github: https://github.com/zhengxl5566/springboot-demo精彩推荐强大10k点赞的 SpringBoot 后台管理系统竟然出了详细教程冒着被开除的风险也要给大家看看看这份SpringCloud 总结微服务 2.0 技术栈选型手册天天在用Stream那你知道如此强大的Stream的实现原理吗
http://www.pierceye.com/news/295013/

相关文章:

  • 网站开发用到什么技术公司做影视网站侵权
  • 自己做网站大概多少钱唐山丰南建设局网站
  • 建设法律法规文本查询网站什么是建设型的网站
  • 如何设计一个购物网站如何免费网络营销推广
  • 网站制作服务好的商家做网站送的企业邮箱能用吗
  • 免费行情软件app网站排行企业内部网站如何建设
  • 沧州网络运营中心在哪里新的seo网站优化排名 网站
  • 米拓建站免费模板wordpress那个主题收录好
  • 网站后台中小型网站建设的基本流程
  • 一键做网站的软件爱互融网站开发合同
  • 平顶山市哪里有做网站的高端的扬中网站建设
  • 网站定制电话如何自己开公众号
  • app开发网站建设及开发专业济南网站建设价格
  • 网站建设新闻分享免费制作网站app
  • 海口网站建设高端wordpress 论坛那
  • 谁能帮我做网站百度推广登录平台怎么收费
  • 有关于网站建设的论文如何开发一个微信公众号
  • 深圳网站建制作网上写文章用什么软件
  • 网站模版自适应网站建设全包方案
  • 广州网站建设鞍山家电网站首页制作
  • 西安注册公司网站网站建设找a金手指
  • 浙江省住房和城乡建设厅网站打不开设计书籍频道开放说明
  • 阿里巴巴 网站建设遵义网警
  • 宁夏建设厅网站官网如何做DJ网站
  • 龙岩做网站公司哪家好erp系统与网站对接长沙
  • 做二手房需要用到哪些网站搜集房源找人做设计的网站
  • 建设银行河北分行招聘网站可以下载新闻视频的网站
  • 凡客官网旗舰店襄阳seo关键词优化公司
  • 区域门户网站源码健身网站建设
  • 动漫网站建设赚钱吗三端互通传奇手游开服列表