Java 您建议使用哪种压缩(GZIP是最流行的)servlet过滤器?
我正在寻找一个GZIP servlet过滤器,用于高容量的web应用程序。我不想使用特定于容器的选项 要求Java 您建议使用哪种压缩(GZIP是最流行的)servlet过滤器?,java,servlets,jakarta-ee,servlet-filters,Java,Servlets,Jakarta Ee,Servlet Filters,我正在寻找一个GZIP servlet过滤器,用于高容量的web应用程序。我不想使用特定于容器的选项 要求 压缩响应负载(XML)的能力 更快 经生产验证,适用于大容量应用 应正确设置适当的内容编码 跨集装箱移动 可以选择解压缩请求 谢谢。查看pjl comp filter Compressing filter: 我建议您在tomcat前面使用一些东西来卸载Gzip。带有mod_deflate的Apache将表现良好。您可以选择将apache放在同一个框中,或者将其移到另一个框中,这样压缩就不会
谢谢。查看pjl comp filter Compressing filter:
我建议您在tomcat前面使用一些东西来卸载Gzip。带有mod_deflate的Apache将表现良好。您可以选择将apache放在同一个框中,或者将其移到另一个框中,这样压缩就不会影响您的应用程序。mod_jk或mod_proxy在这个设置中都可以正常工作
据我所见,大多数人通常使用gzip压缩过滤器。通常来自 GZIP筛选器实现是: 将其包含在项目中的Maven坐标为:
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-web</artifactId>
<version>2.0.4</version>
</dependency>
net.sf.ehcache
ehcache网络
2.0.4
您还需要指定SLF4J日志记录目标。如果您不知道这是什么或不关心slf4j-jdk14或slf4j simple的工作原理:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.6.4</version>
</dependency>
org.slf4j
slf4j-jdk14
1.6.4
用于压缩Web应用程序中资源的GZIP筛选器:
public类CompressionFilter实现过滤器{
公共空间销毁(){
}
public void doFilter(ServletRequest请求、ServletResponse响应、FilterChain链)抛出IOException、ServletException{
HttpServletRequest httpRequest=(HttpServletRequest)请求;
HttpServletResponse=(HttpServletResponse)响应;
字符串acceptEncoding=httpRequest.getHeader(HttpHeaders.acceptEncoding);
if(acceptEncoding!=null){
if(acceptEncoding.indexOf(“gzip”)>=0){
GZIPHttpServletResponseWrapper gzipResponse=新的GZIPHttpServletResponseWrapper(httpResponse);
doFilter(请求、gzip响应);
gzipResponse.finish();
返回;
}
}
链式过滤器(请求、响应);
}
public void init(FilterConfig FilterConfig)抛出ServletException{
}
}
公共类GZIPHttpServletResponseWrapper扩展了HttpServletResponseWrapper{
私有ServletResponseGzipOutStream GzipsStream;
私有ServletOutputStream输出流;
私人印刷作家;
公共GZIPHttpServletResponseWrapper(HttpServletResponse)引发IOException{
超级(响应);
addHeader(HttpHeaders.CONTENT_编码,“gzip”);
}
public void finish()引发IOException{
如果(printWriter!=null){
printWriter.close();
}
if(outputStream!=null){
outputStream.close();
}
如果(gzipStream!=null){
gzipStream.close();
}
}
@凌驾
public void flushBuffer()引发IOException{
如果(printWriter!=null){
printWriter.flush();
}
if(outputStream!=null){
outputStream.flush();
}
super.flushBuffer();
}
@凌驾
公共ServletOutputStream getOutputStream()引发IOException{
如果(printWriter!=null){
抛出新的IllegalStateException(“printWriter已定义”);
}
if(outputStream==null){
initGzip();
outputStream=gzip流;
}
返回输出流;
}
@凌驾
公共PrintWriter getWriter()引发IOException{
if(outputStream!=null){
抛出新的IllegalStateException(“printWriter已定义”);
}
if(printWriter==null){
initGzip();
printWriter=新的printWriter(新的OutputStreamWriter(gzip流,getResponse().getCharacterEncoding());
}
返回打印机;
}
@凌驾
公共void setContentLength(int len){
}
私有void initGzip()引发IOException{
gzipStream=newservletresponsegzipoutpstream(getResponse().getOutputStream());
}
}
公共类ServletResponseGZIPOutputStream扩展了ServletOutputStream{
gzip输出流gzip流;
最终原子布尔开放=新原子布尔(真);
输出流输出;
公共ServletResponseGzipoutpOutstream(OutputStream输出)引发IOException{
这个。输出=输出;
gzipStream=新的GZIPOutputStream(输出);
}
@凌驾
public void close()引发IOException{
if(打开.比较数据集(真,假)){
gzipStream.close();
}
}
@凌驾
public void flush()引发IOException{
gzipStream.flush();
}
@凌驾
公共无效写入(字节[]b)引发IOException{
写入(b,0,b.长度);
}
@凌驾
公共无效写入(字节[]b,int off,int len)引发IOException{
如果(!open.get()){
抛出新IOException(“流关闭!”);
}
gzipStream.write(b,off,len);
}
@凌驾
公共无效写入(int b)引发IOException{
如果(!open.get()){
抛出新IOException(“流关闭!”);
}
gzipStream.write(b);
}
}
您还需要在web.xml中定义映射:
压缩滤波器
com.my.company.CompressionFilter
压缩滤波器
*.js
压缩滤波器
*.css
压缩滤波器
*.html
压缩滤波器
*.jsp
或者如果您在前面使用Nginx,请参见此处:。但是,正如Zeki所说,最好将其转移到专用的web服务器上。我希望此解决方案是可移植的,因此这不是我正在寻找的解决方案。你怎么知道他在使用Tomcat?我使用Jetty,这是一个