java过滤器实现Gzip压缩实例源码教程

java过滤器实现Gzip压缩实例源码教程

java过滤器实现Gzip压缩实例源码教程。Gzip是若干种文件压缩程序的简称,我们这里来实现通过javaee中的filter实现对响应数据的压缩,高效的传到客户端,那么是怎么通过Gzip压缩实现的将数据压缩后客户端的,对步骤进行分析:

1.我们把客户端要对用户响应的数据先放在缓存中,

2.然后,通过Gzip将缓存中的数据压缩,

3.在过滤器中通过response的写方法,将数据响应到客户端。

为了模拟:

首先写一个请求的servlet:

package com.zsq.gzip;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class GzipServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

response.setContentType(“text/html;charset=utf-8″);
String s=”sadgjassssssssssssssssssssssssssssssssssssssss” +
“ssssssaaaaaaaaaaaaaaaaaaasaaaaaaaaaaaaaaaaaaaaaa” +
“saaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaaa” +
“assssssssssssssssssssssssssssssssssssssssssaa不是吧”;
//response.getOutputStream().write(s.getBytes(“utf-8″));
response.getWriter().write(s);

}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}

}

下面是一个过滤器:

package com.zsq.gzip;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;

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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class GzipFilter implements Filter{

public void destroy() {
System.out.println(“压缩过滤开始了”);
}

public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request=(HttpServletRequest)req;
HttpServletResponse response=(HttpServletResponse)res;
MyResponse mresponse=new MyResponse(response);
chain.doFilter(request, mresponse);
byte[] b=mresponse.getBytes();
System.out.println(“压缩前:”+b.length);
ByteArrayOutputStream out=new ByteArrayOutputStream();

GZIPOutputStream gzipOutputStream=new GZIPOutputStream(out);
gzipOutputStream.write(b);
gzipOutputStream.close();//将数据刷出,如果没有则不显示

byte[]bu=out.toByteArray();
System.out.println(“压缩后:”+bu.length);
response.setHeader(“Content-Encoding”,”gzip”);
response.getOutputStream().write(bu);

}

public void init(FilterConfig filterConfig) throws ServletException {

System.out.println(“压缩过滤结束了。”);
}

}

其中有一个自定义类MyResponse,这个类是对Response的增强类,具体增强的是getOutputStream()和getWriter()这两个方法,通过对这两个方法将数据写到ByteArrayOutputStream中,而不是打印到页面,然后向外提供一个接口得到这个ByteArrayOutputStream对象,通过Gzip压缩,然后响应到客户端;该类的代码:

package com.zsq.gzip;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class MyResponse extends HttpServletResponseWrapper{

private ByteArrayOutputStream bytes=new ByteArrayOutputStream();//用bytes保存数据
private HttpServletResponse response;

private PrintWriter pw;
public MyResponse(HttpServletResponse response) {
super(response);
// TODO Auto-generated constructor stub
this.response=response;
}

@Override
public ServletOutputStream getOutputStream(){
return new MyServletOutputStream(bytes);//调用自定义类将数据写到bytes中
}

@Override
public PrintWriter getWriter(){

try {
pw=new PrintWriter(new OutputStreamWriter(bytes,”utf-8″));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return pw;
}

public byte[] getBytes(){//向外提供一个接口得到bytes数据。
if(pw!=null){
pw.close();
return bytes.toByteArray();
}

if(bytes!=null){
try {
bytes.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
return bytes.toByteArray();
}

}
class MyServletOutputStream extends ServletOutputStream{
private ByteArrayOutputStream stream;
public MyServletOutputStream(ByteArrayOutputStream stream){
this.stream=stream;
}
@Override
public void write(int b) throws IOException {
// TODO Auto-generated method stub
stream.write(b);//将数据写到stream中
}

}

web.xml中的配置:

<filter>
<filter-name>GzipFilter</filter-name>
<filter-class>com.zsq.gzip.GzipFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>GzipFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

程序运行截图:

 

后台打印的结果:

 

当然这只是为了回顾知识点的,我这个过滤的路径是 /*,一般我们只需要过滤的是:

1./*.jsp;

2./*.css;

3. /*.js

4./*.html;

5./*.htm

这五种,我们可以在web.xml中做相应的配置。

 

写之记录记录。。。留给日后用。。。。写给有需要的人。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值