离线数据包的部署
离线数据包是一组静态资源文件,并不需要特定的云端程序提供运行时环境,因此可以像部署网页的css、js、image一样部署在静态Web服务器上。
注:在部署前,必须把压缩文件解压。
支持的Web服务器
包括但不限于以下几种:
1、Nginx
2、Apache
3、Tomcat
4、IIS
5、NodeJS
实现步骤
以Nginx为例,三个步骤完成部署
1、把解压后的文件夹拷贝到Nginx默认站点目录html下(如:D:\nginx-1.5.0\html)
2、在nginx.conf文件中,针对离线数据包访问路径设置Http响应头(下文详述)
3、在浏览器中输入”http://ip:port/{离线数据包文件夹名称}“即可(如:http://localhost/a686c361e0bb07d66685d83fd18a881d)
Http响应头设置
为了加速访问,离线数据包中的很多文件都进行了gzip压缩。在离线数据包部署到Web服务器之后,必须对.gz文件设置http响应头,否则将产生错误。
1、由于仅需要针对BIMFACE离线数据包中的.gz文件设置响应头,建议开发人员最好把BIMFACE的离线数据包放置在统一的路径下,然后再针对这个统一的路径,设置匹配后缀为.gz的路径。
2、针对以上路径设置:Content-Encoding: gzip
由于不用的Web服务设置Http响应头的方式不一,下面介绍了几种常见服务器的设置方式:
1、Nginx
在nginx.conf文件中相应的Server节点添加
location ~* .*\.gz$ {
add_header Content-Encoding gzip;
}
例如:
server {
listen 80;
server_name localhost;
location ~* .*\.gz$ {
add_header Content-Encoding gzip;
}
}
2、Apache
1)Apache未启用gzip特性时,httpd.conf文件末尾添加
Header set Content-Encoding "gzip" "expr=%{REQUEST_URI} =~ m#.*.gz$#"
2)Apache启用gzip特性时,需要对gz请求禁用gzip功能,httpd.conf文件在对应的gzip配置处添加
DeflateCompressionLevel 6
SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
Header set Content-Encoding "gzip"
3、Tomcat
Tomcat不支持在配置文件中设置,因此只能通过代码在拦截器中设置头信息
1)编写Filter类,对gz请求响应添加“Content-Encoding”头属性,类似
package com.bimface.offline.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
public class GzFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
//告诉响应头以gzip格式解码,启用浏览器gzip解压
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Encoding", "gzip");
response.setContentType("application/json;charset=utf-8");
try {
filterChain.doFilter(servletRequest, servletResponse);
} catch (ServletException e) {
e.printStackTrace();
}
}
@Override
public void destroy() {
}
}
2)Filter打包Jar放入Tomcat\lib目录下
3)对Tomcat的web.xml文件添加全局Filter配置
<filter>
<filter-name>gzFilter</filter-name>
<filter-class>com.bimface.offline.filter.GzFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>gzFilter</filter-name>
<url-pattern>*.gz</url-pattern>
</filter-mapping>
4、IIS
通过IIS信息服务管理器或者web.config文件进行规则配置对gz请求响应添加“Content-Encoding”头属性
5、NodeJS
在NodeJS服务中对gz请求响应添加“Content-Encoding”头属性,类似
response.writeHeader(200,{
'Content-Encoding' : 'gzip',
'content-type' : 'application/octet-stream'
});
例如Server.js:
var port = 8888;
var http = require('http');
var fs = require('fs');
var documentRoot = 'D:/Tools/nginx-1.5.0/html'; //需要访问的离线数据包文件的存放目录
var server= http.createServer(function(req,res){
var url = req.url;
var file = documentRoot + url;
fs.readFile(file, function(err,data){
if(err){
res.writeHeader(404,{
'content-type' : 'text/html;charset="utf-8"'
});
res.write('<h1>404错误</h1><p>你要找的页面不存在</p>');
res.end();
}else{
if(url.substr(url.length-3, 3) == ".gz"){
res.writeHeader(200,{
'Content-Encoding' : 'gzip',
'content-type' : 'application/octet-stream'
});
}else{
res.writeHeader(200,{
'content-type' : 'text/html;charset="utf-8"'
});
}
res.write(data);
res.end();
}
});
}).listen(port);