java压缩过滤器创建过程,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中的配置:

GzipFilter

com.zsq.gzip.GzipFilter

GzipFilter

/*

程序运行截图:

5972.html

后台打印的结果:

5972.html

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

1./*.jsp;

2./*.css;

3. /*.js

4./*.html;

5./*.htm

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值