Bu Sayfayı Paylaş:

Kaynak

OpenWebOptimizer

OpenWebOptimizer , bir java web projesine HTTP sıkıştırma eklemek için kullanılan bir projedir

İpucu

Bir Web Projesine OpenWebOptimizer İle HTTP Sıkıştırma Desteği Eklenmesi

Bir web projesine sıkıştırma özelliği eklenebilir. Bu özellikle ile eğer istemci (client) gzip sıkıştırmayı destekliyorsa, sunucu cevabı sıkıştırarak verebilir. Sıkıştırılan cevap istemci tarafından istemciden açılır. Bu şekilde site içeriği daha hızlı istemci bilgisayarına iner.


OpenWebOptimizer projesi içinde (https://github.com/OpCAT/OpenWebOptimizer) com.opcat.gzip paketi içinde HTTP sıkıştırma yapabilmeniz için üç sınıf bulunmaktadır. Sınıflar aşağıdaki gibidir:


Servlet'in cevabınının gzip algoritmasına göre sıkıştırılmasını sağlayan Stream sınıfı :
package com.opcat.gzip;
<br/>
import java.io.*;
import java.util.zip.*;
import javax.servlet.*;
import javax.servlet.http.*;
<br/>
public class GZIPResponseStream extends ServletOutputStream {
	
	protected ByteArrayOutputStream baos;
	protected GZIPOutputStream gzipstream;
	protected boolean closed;
	protected HttpServletResponse response;
	protected ServletOutputStream output;
<br/>
	public GZIPResponseStream(HttpServletResponse httpservletresponse)
		throws IOException {
		baos = null;
		gzipstream = null;
		closed = false;
		response = null;
		output = null;
		closed = false;
		response = httpservletresponse;
		output = httpservletresponse.getOutputStream();
		baos = new ByteArrayOutputStream();
		gzipstream = new GZIPOutputStream(baos);
	}
<br/>
	public void close() throws IOException {
		if (closed) {
			throw new IOException("This output 
				stream has already been closed");
		} else {
			gzipstream.finish();
			byte abyte0[] = baos.toByteArray();
			response.addHeader("Content-Length", 
				Integer.toString(abyte0.length));
			response.addHeader("Content-Encoding", "gzip");
			output.write(abyte0);
			output.flush();
			output.close();
			closed = true;
			return;
		}
	}
<br/>
	public void flush() throws IOException {
		if (closed) {
			throw new IOException("Cannot flush a 
				closed output stream");
		} else {
			gzipstream.flush();
			return;
		}
	}
<br/>
	public void write(int i) throws IOException {
		if (closed) {
			throw new IOException("Cannot write to a 
				closed output stream");
		} else {
			gzipstream.write((byte) i);
			return;
		}
	}
<br/>
	public void write(byte abyte0[]) throws IOException {
		write(abyte0, 0, abyte0.length);
	}
<br/>
	public void write(byte abyte0[], int i, int j) throws IOException {
		if (closed) {
			throw new IOException("Cannot write to 
				a closed output stream");
		} else {
			gzipstream.write(abyte0, i, j);
			return;
		}
	}
<br/>
	public boolean closed() {
		return closed;
	}
	
	public void reset() {}
}
Servlet cevabında GZIPResponseStream kullanılmasını sağlayan wrapper sınıfı :
package com.opcat.gzip;
<br/>
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
<br/>
public class GZIPResponseWrapper extends HttpServletResponseWrapper {
<br/>
	protected HttpServletResponse origResponse;
	protected ServletOutputStream stream;
	protected PrintWriter writer;
	
	public GZIPResponseWrapper(HttpServletResponse httpservletresponse) {
		super(httpservletresponse);
		origResponse = null;
		stream = null;
		writer = null;
		origResponse = httpservletresponse;
	}
<br/>
	public ServletOutputStream createOutputStream() throws IOException {
		return new GZIPResponseStream(origResponse);
	}
<br/>
	public void finishResponse() {
		try {
			if (writer != null)
				writer.close();
			else if (stream != null)
				stream.close();
		} catch (IOException ioexception) {
		}
	}
<br/>
	public void flushBuffer() throws IOException {
		stream.flush();
	}
<br/>
	public ServletOutputStream getOutputStream() throws IOException {
		if (writer != null)
			throw new IllegalStateException(
					"getWriter() has already been called!");
		if (stream == null)
			stream = createOutputStream();
		return stream;
	}
<br/>
	public PrintWriter getWriter() throws IOException {
		if (writer != null)
			return writer;
		if (stream != null) {
			throw new IllegalStateException(
					"getOutputStream() has already been called!");
		} else {
			stream = createOutputStream();
			writer = new PrintWriter(
				new OutputStreamWriter(stream, "UTF-8"));
			return writer;
		}
	}
<br/>
	public void setContentLength(int i) {}
}
üçüncü java sınıf ise tüm isteklerde devreye giren ve GZIPResponseWrapper wrapper'ının kullanılmasını sağlayan Filter sınıfı:
package com.opcat.gzip;
<br/>
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
<br/>
public class GZIPFilter implements Filter {
<br/>
	public void doFilter(ServletRequest servletrequest,
			ServletResponse servletresponse, FilterChain filterchain)
			throws IOException, ServletException {
		if (servletrequest instanceof HttpServletRequest) {
			HttpServletRequest httpservletrequest = (HttpServletRequest) servletrequest;
			HttpServletResponse httpservletresponse = (HttpServletResponse) servletresponse;
			String s = httpservletrequest.getHeader("accept-encoding");
			if (s != null && s.indexOf("gzip") != -1) {
				GZIPResponseWrapper gzipresponsewrapper = new GZIPResponseWrapper(
						httpservletresponse);
				filterchain.doFilter(servletrequest, gzipresponsewrapper);
				gzipresponsewrapper.finishResponse();
				return;
			}
			filterchain.doFilter(servletrequest, servletresponse);
		}
	}
	public void init(FilterConfig filterconfig) {}
	public void destroy() {}
}
Bu filter web.xml'de, Filter bölümünün en sonuna aşağıdaki gibi eklenebilir:
  <filter>
    <filter-name>GZIPFilter</filter-name>
    <filter-class>com.opcat.gzip.GZIPFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>GZIPFilter</filter-name>
    <url-pattern>*</url-pattern>
  </filter-mapping>




Bu Sayfayı Paylaş:

İletişim Bilgileri

Takip Et

Her Hakkı Saklıdır. Bu sitede yayınlanan tüm bilgi ve fikirlerin kullanımından fibiler.com sorumlu değildir. Bu sitede üretilmiş , derlenmiş içerikleri, fibiler.com'u kaynak göstermek koşuluyla kendi sitenizde kullanılabilirsiniz. Ancak telif hakkı olan içeriklerin hakları sahiplerine aittir