java gzip filter_java servlet Filter实现gzip压缩机制的源代码分享

在java提供接口给客户端开发中,可以启动gzip压缩机制来达到减小文件大小的目的。

相关java代码如下:

GZIPFilter.javapackage com.zuidaima.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.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class GZIPFilter implements Filter {

public void doFilter(ServletRequest req, ServletResponse res,

FilterChain chain) throws IOException, ServletException {

if (req instanceof HttpServletRequest) {

HttpServletRequest request = (HttpServletRequest) req;

HttpServletResponse response = (HttpServletResponse) res;

boolean isGzip = false;

String gzip = request.getParameter("gzip");//根据请求参数启用gzip机制

if (gzip != null && gzip.equals("true")) {

isGzip = true;

}

String ae = request.getHeader("Accept-Encoding");

if (ae != null && ae.indexOf("gzip") != -1) {//根据客户端agent请求参数来启用gzip机制

isGzip = true;

}

if (isGzip) {

GZIPResponseWrapper wrappedResponse = new GZIPResponseWrapper(

response);

chain.doFilter(req, wrappedResponse);

wrappedResponse.finishResponse();

return;

}

chain.doFilter(req, res);

}

}

public void init(FilterConfig filterConfig) {

}

public void destroy() {

}

}

GZIPResponseStream.javapackage com.zuidaima.filter;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.util.zip.GZIPOutputStream;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServletResponse;

public class GZIPResponseStream extends ServletOutputStream {

protected ByteArrayOutputStream baos = null;

protected GZIPOutputStream gzipstream = null;

protected boolean closed = false;

protected HttpServletResponse response = null;

protected ServletOutputStream output = null;

public GZIPResponseStream(HttpServletResponse response) throws IOException {

super();

closed = false;

this.response = response;

this.output = response.getOutputStream();

baos = new ByteArrayOutputStream();

gzipstream = new GZIPOutputStream(baos);

}

public void close() throws IOException {

if (closed) {

throw new IOException("This output stream has already been closed");

}

gzipstream.finish();

byte[] bytes = baos.toByteArray();

response.addHeader("Content-Length", Integer.toString(bytes.length));

response.addHeader("Content-Encoding", "gzip");

output.write(bytes);

output.flush();

output.close();

closed = true;

}

public void flush() throws IOException {

if (closed) {

throw new IOException("Cannot flush a closed output stream");

}

gzipstream.flush();

}

public void write(int b) throws IOException {

if (closed) {

throw new IOException("Cannot write to a closed output stream");

}

gzipstream.write((byte) b);

}

public void write(byte b[]) throws IOException {

write(b, 0, b.length);

}

public void write(byte b[], int off, int len) throws IOException {

if (closed) {

throw new IOException("Cannot write to a closed output stream");

}

gzipstream.write(b, off, len);

}

public boolean closed() {

return (this.closed);

}

public void reset() {

// noop

}

}

GZIPResponseWrapper.javapackage com.zuidaima.filter;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpServletResponseWrapper;

public class GZIPResponseWrapper extends HttpServletResponseWrapper {

protected HttpServletResponse origResponse = null;

protected ServletOutputStream stream = null;

protected PrintWriter writer = null;

public GZIPResponseWrapper(HttpServletResponse response) {

super(response);

origResponse = response;

}

public ServletOutputStream createOutputStream() throws IOException {

return (new GZIPResponseStream(origResponse));

}

public void finishResponse() {

try {

if (writer != null) {

writer.close();

} else {

if (stream != null) {

stream.close();

}

}

} catch (IOException e) {

}

}

public void flushBuffer() throws IOException {

stream.flush();

}

public ServletOutputStream getOutputStream() throws IOException {

if (writer != null) {

throw new IllegalStateException(

"getWriter() has already been called!");

}

if (stream == null)

stream = createOutputStream();

return (stream);

}

public PrintWriter getWriter() throws IOException {

if (writer != null) {

return (writer);

}

if (stream != null) {

throw new IllegalStateException(

"getOutputStream() has already been called!");

}

stream = createOutputStream();

writer = new PrintWriter(new OutputStreamWriter(stream, "UTF-8"));

return (writer);

}

public void setContentLength(int length) {

}

}

web.xml中配置如下:

GZIPFilter

com.zuidaima.filter.GZIPFilter

GZIPFilter

*.htm

未启用gzip压缩前响应头信息:

5f44669d9023f819b9cfa4031178418d.png

启用gizp压缩后响应头信息:

5f44669d9023f819b9cfa4031178418d.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值