利用Filter压缩HTTP响应

importjava.io.IOException;
importjava.util.Enumeration;
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;


/**
*Implementationof<code>javax.servlet.Filter</code>usedtocompress
*theServletResponseifitisbiggerthanathreshold.
*
*@authorAmyRoh
*@authorDmitriValdin
*@version$Revision:1.2$,$Date:2004/03/1816:40:33$
*/

publicclassCompressionFilter implementsFilter{

/**
*Thefilterconfigurationobjectweareassociatedwith.Ifthisvalue
*isnull,thisfilterinstanceisnotcurrentlyconfigured.
*/
privateFilterConfigconfig= null;

/**
*Minimalreasonablethreshold
*/
private intminThreshold=128;


/**
*Thethresholdnumbertocompress
*/
protected intcompressionThreshold;

/**
*Debuglevelforthisfilter
*/
private intdebug=0;

/**
*Placethisfilterintoservice.
*
*@paramfilterConfigThefilterconfigurationobject
*/

public voidinit(FilterConfigfilterConfig){

config=filterConfig;
if(filterConfig!= null){
Stringvalue=filterConfig.getInitParameter("debug");
if(value!= null){
debug=Integer.parseInt(value);
} else{
debug=0;
}
Stringstr=filterConfig.getInitParameter("compressionThreshold");
if(str!= null){
compressionThreshold=Integer.parseInt(str);
if(compressionThreshold!=0&&compressionThreshold<minThreshold){ if(debug>0){
System.out.println("compressionThresholdshouldbeeither0-nocompressionor>="+minThreshold);
System.out.println("compressionThresholdsetto"+minThreshold);
}
compressionThreshold=minThreshold;
}
} else{
compressionThreshold=0;
}

} else{
compressionThreshold=0;
}

}

/**
*Takethisfilteroutofservice.
*/
public voiddestroy(){

this.config= null;

}

/**
*The<code>doFilter</code>methodoftheFilteriscalledbythecontainer
*eachtimearequest/responsepairispassedthroughthechaindue
*toaclientrequestforaresourceattheendofthechain.
*TheFilterChainpassedintothismethodallowstheFiltertopassonthe
*requestandresponsetothenextentityinthechain.<p>
*Thismethodfirstexaminestherequesttocheckwhethertheclientsupport
*compression.<br>
*Itsimplyjustpasstherequestandresponseifthereisnosupportfor
*compression.<br>
*Ifthecompressionsupportisavailable,itcreatesa
*CompressionServletResponseWrapperobjectwhichcompressesthecontentand
*modifiestheheaderifthecontentlengthisbigenough.
*IttheninvokesthenextentityinthechainusingtheFilterChainobject
*(<code>chain.doFilter()</code>),<br>
**/

public voiddoFilter(ServletRequestrequest,ServletResponseresponse,
FilterChainchain) throwsIOException,ServletException{

if(debug>0){
System.out.println("@doFilter");
}

if(compressionThreshold==0){
if(debug>0){
System.out.println("doFiltergetscalled,butcompressionTresholdissetto0-nocompression");
}
chain.doFilter(request,response);
return;
}

booleansupportCompression= false;
if(request instanceofHttpServletRequest){
if(debug>1){
System.out.println("requestURI="+((HttpServletRequest)request).getRequestURI());
}

//Areweallowedtocompress?
Strings=(String)((HttpServletRequest)request).getParameter("gzip");
if("false".equals(s)){
if(debug>0){
System.out.println("gotparametergzip=false-->don'tcompress,justchainfilter");
}
chain.doFilter(request,response);
return;
}

Enumeratione=
((HttpServletRequest)request).getHeaders("Accept-Encoding");
while(e.hasMoreElements()){
Stringname=(String)e.nextElement();
if(name.indexOf("gzip")!=-1){
if(debug>0){
System.out.println("supportscompression");
}
supportCompression= true;
} else{
if(debug>0){
System.out.println("nosupportforcompresion");
}
}
}
}

if(!supportCompression){
if(debug>0){
System.out.println("doFiltergetscalledwocompression");
}
chain.doFilter(request,response);
return;
} else{
if(response instanceofHttpServletResponse){
CompressionServletResponseWrapperwrappedResponse=
newCompressionServletResponseWrapper((HttpServletResponse)response);
wrappedResponse.setDebugLevel(debug);
wrappedResponse.setCompressionThreshold(compressionThreshold);
if(debug>0){
System.out.println("doFiltergetscalledwithcompression");
}
try{
chain.doFilter(request,wrappedResponse);
} finally{
wrappedResponse.finishResponse();
}
return;
}
}
}

/**
*Setfilterconfig
*Thisfunctionisequivalenttoinit.RequiredbyWeblogic6.1
*
*@paramfilterConfigThefilterconfigurationobject
*/
public voidsetFilterConfig(FilterConfigfilterConfig){
init(filterConfig);
}

/**
*Returnfilterconfig
*RequiredbyWeblogic6.1
*/
publicFilterConfiggetFilterConfig(){
returnconfig;
}

}

/*
*Copyright2004TheApacheSoftwareFoundation
*
*LicensedundertheApacheLicense,Version2.0(the"License");
*youmaynotusethisfileexceptincompliancewiththeLicense.
*YoumayobtainacopyoftheLicenseat
*
*http://www.apache.org/licenses/LICENSE-2.0
*
*Unlessrequiredbyapplicablelaworagreedtoinwriting,software
*distributedundertheLicenseisdistributedonan"ASIS"BASIS,
*WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.
*SeetheLicenseforthespecificlanguagegoverningpermissionsand
*limitationsundertheLicense.
*/

importjava.io.IOException;
importjava.io.PrintWriter;
importjava.util.Enumeration;
importjavax.servlet.*;
importjavax.servlet.http.*;

/**
*VerySimpletestservlettotestcompressionfilter
*@authorAmyRoh
*@version$Revision:1.2$,$Date:2004/03/1816:40:33$
*/

publicclassCompressionFilterTestServlet extendsHttpServlet{

public voiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{

ServletOutputStreamout=response.getOutputStream();
response.setContentType("text/plain");

Enumeratione=((HttpServletRequest)request).getHeaders("Accept-Encoding");
while(e.hasMoreElements()){
Stringname=(String)e.nextElement();
out.println(name);
if(name.indexOf("gzip")!=-1){
out.println("gzipsupported--abletocompress");
}
else{
out.println("gzipnotsupported");
}
}


out.println("CompressionFilterTestServlet");
out.close();
}
}

你可能感兴趣的:(apache,servlet)