`
dyccsxg
  • 浏览: 204778 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类

Filter 常用代码

    博客分类:
  • Java
阅读更多

1. 压缩 Filter

// GZIPFilter.java

package org.demo.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;
/**
 * Filter that compress output with gzip.
 * Code from http://www.onjava.com/pub/a/onjava/2003/11/19/filters.html
 * @author dycc
 *
 */
public class GZIPFilter implements Filter{
	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// No operation.
	}
	
	@Override
	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		if (req instanceof HttpServletRequest){
			HttpServletRequest request = (HttpServletRequest)req;
			HttpServletResponse response = (HttpServletResponse)resp;
			// check for gzip capability
			String ac = request.getHeader("accept-encoding");
			if (ac == null || ac.indexOf("gzip") == -1){
				// not support gzip.
				chain.doFilter(request, response);				
			} else {
			    // support gzip.
				GZIPResponseWrapper wrappedResp = new GZIPResponseWrapper(response);
				chain.doFilter(request, wrappedResp);
				wrappedResp.finish();
			}
		}
		
	}
	
	@Override
	public void destroy() {
		// No operation.
	}
}

 

// GZIPResponseWrapper.java

package org.demo.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;

/**
 * Wrap for GZIPFilter
 * @author dycc
 *
 */
public class GZIPResponseWrapper extends HttpServletResponseWrapper{
	protected HttpServletResponse original_resp = null;
	protected ServletOutputStream stream = null;
	protected PrintWriter writer = null;
	
	public GZIPResponseWrapper(HttpServletResponse response) {
		super(response);
		this.original_resp = response;
	}
	
	@Override
	public ServletOutputStream getOutputStream() throws IOException {
		if (writer != null){
			throw new IllegalStateException("getWriter() has already been called.");
		}
		if (stream == null){
			stream = new GZIPResponseStream(original_resp);
		}
		return stream;
	}
	
	@Override
	public PrintWriter getWriter() throws IOException {
		if (stream != null){
			throw new IllegalStateException("getOutputStream() has already been called.");
		}
		if (writer == null){
			writer = new PrintWriter(
					   new OutputStreamWriter(
				         new GZIPResponseStream(original_resp),"UTF-8"));
		}
		return writer;
	}
	
	@Override
	public void flushBuffer() throws IOException {
		if (stream != null){
			stream.flush();
		} else if (writer != null){
		    writer.flush();
		}
	}
	
	public void finish(){
		try {
			if (stream != null){
				stream.close();
			} else if (writer != null){
				writer.close();
			}
		} catch (IOException e){
			// Ignore.
		}
	}
}

 

 

// GZIPResponseStream.java

package org.demo.filter;

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

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

/**
 * Wrap response stream for GZIPFilter
 * @author dycc
 *
 */
public class GZIPResponseStream extends ServletOutputStream{

	protected HttpServletResponse response = null;
	protected ServletOutputStream out = null;
	protected ByteArrayOutputStream baos = null;
	protected GZIPOutputStream gzipos = null;
	protected boolean closed = false;
	
	public GZIPResponseStream(HttpServletResponse response)throws IOException{
		super();
		this.response = response;
		this.out = response.getOutputStream();
		this.baos = new ByteArrayOutputStream();
		this.gzipos = new GZIPOutputStream(this.baos);
		this.closed = false;
	}
	@Override
	public void write(int b) throws IOException {
		if (closed){
			throw new IOException("Cannot write to a closed output stream.");
		}
		gzipos.write(b);
	}
	@Override
	public void write(byte[] b) throws IOException {
		write(b,0,b.length);
	}
	@Override
	public void write(byte[] buf, int off, int len) throws IOException {
		if (closed){
			throw new IOException("Cannot write to a closed output stream.");
		}
		gzipos.write(buf, off, len);
	}
	@Override
	public void flush() throws IOException {
		if (closed){
			throw new IOException("Cannot flush a closed output stream.");
		}
		gzipos.flush();
	}
	@Override
	public void close() throws IOException {
		if (closed){
			return;
		}
		gzipos.finish();
		byte[] buf = this.baos.toByteArray();
		response.addHeader("Content-Length", Integer.toString(buf.length));
		response.addHeader("Content-Encoding", "gzip");
		out.write(buf);
		out.flush();
		out.close();
		closed = true;
	}
}

 

2. END

分享到:
评论

相关推荐

    lucene部分常用代码

    Lucene常用代码详解 Lucene是一款功能强大且高效的搜索引擎,广泛应用于各种搜索应用程序中。为了更好地使用Lucene,需要了解其核心API和常用代码。本文将对Lucene部分常用代码进行详细解释,包括多字段搜索、多...

    js常用代码总汇

    这个“js常用代码总汇”包含了开发者在日常工作中可能频繁使用的JavaScript代码片段,旨在提高开发效率并提供参考。 1. **变量声明与数据类型** - `var`, `let`, `const`:JavaScript 提供了三种声明变量的方式,`...

    Unity3D常用代码总结

    这个“Unity3D常用代码总结”压缩包文件显然是一个集合了开发者在实践中积累的实用代码示例和技巧的资源。下面,我们将深入探讨Unity3D中的一些关键知识点,包括组件的使用和功能实现。 1. **组件系统**: Unity3D...

    网页设计常用代码

    在本文中,我们将探讨一些常用的网页设计代码及其应用,以及如何保护网页代码和内容不被他人轻易获取。 首先,我们来看一个实现表格半透明显示效果的技巧。在网页中,可以使用CSS样式来控制元素的透明度。通过在`...

    jQuery 常用代码段

    7. **遍历和过滤**:`each()`函数用于遍历集合中的每个元素,`filter()`和`not()`则用于筛选元素。此外,还有`first()`, `last()`, `next()`, `prev()`等用于选取特定位置的元素。 8. **插件扩展**:jQuery的生态...

    EXCEL VBA 常用代码集

    ### EXCEL VBA 常用代码集:利用Dos命令搜索文件 #### 一、概述 在Excel VBA编程中,经常需要处理大量的文件操作任务,例如搜索特定类型的文件、整理文件列表等。本篇文章将深入探讨如何通过VBA调用DOS命令`dir`来...

    unity3d 常用代码库

    "unity3d 常用代码库"包含了大量预设的、经过验证的代码片段,覆盖了各种常见功能和模块,为开发者提供了一个方便的工具集。 1. **C#编程基础**:Unity3D主要使用C#作为脚本语言。了解C#的基础语法,如变量、数据...

    php后台常用代码

    "php后台常用代码"这个主题涵盖了多种PHP后端编程的技术,包括但不限于数据处理、数据库操作、用户认证、错误处理、会话管理等。 1. 数据处理:在PHP中,我们经常需要对用户提交的数据进行处理,例如使用`...

    常用HTML代码解释

    ### 常用HTML代码解释 本篇将详细介绍在给定描述中的HTML代码与部分文本内容中提及到的各类HTML标签及其用法。HTML(HyperText Markup Language)是构成网页结构的标准标记语言,通过这些标签我们可以创建、组织并...

    经典网页常用代码直接粘贴就可以用

    本资源“经典网页常用代码直接粘贴就可以用”提供了一系列可以直接应用于网页设计的代码片段,帮助开发者快速实现特定功能,无需从零开始编写。下面将详细介绍这些代码类型及其应用。 1. 不间断滚动代码:这种代码...

    javascript常用代码及汇总

    "javascript常用代码及汇总"这个资源集合了JavaScript编程中的一些常见用法和实用技巧,是开发者学习和工作中的一大助力。 首先,JavaScript的核心概念包括变量、数据类型、控制结构、函数、数组、对象等。变量是...

    CSS的filter常用滤波器属性及语句大全

    在给定的文件信息中,详细列出了多种常用的滤波器属性及其参数设置方法,让我们深入探讨这些滤波器的具体功能与应用场景。 ### 1. Alpha(透明度) Alpha滤波器主要用于调整图像的透明度。参数`Opacity`用于设定...

    安卓常用代码集合

    【安卓常用代码集合】是一个针对初级安卓开发者整理的代码片段集合,旨在帮助初学者快速理解和掌握安卓开发中的常见操作。这个集合包括了调用浏览器、接收系统广播等方面的示例代码,下面将对这些知识点进行详细的...

    Android_常用代码集合

    ### Android 常用代码集合知识点详解 #### 一、调用浏览器载入某网址 在Android开发过程中,经常需要让应用打开一个网页链接。这可以通过`Intent`对象实现。 **代码示例:** ```java Uri uri = Uri.parse(...

    100个常用js代码

    6. **常用函数**:如数组操作函数(map、filter、reduce、splice等),字符串处理(trim、substring、indexOf等),日期处理(Date对象的方法)以及数学运算(Math对象的方法)。 7. **面向对象编程**:JS支持面向...

    ARCGIS_ENGINE二次开发常用代码 - 副本.zip_AE开发常用代码_arcgis_arcgis engine_dis

    在“ARCGIS_ENGINE二次开发常用代码 - 副本.doc”文档中,可能包含了以下内容: 1. 地图控件的创建和配置:如何在Windows Forms或WPF应用中添加地图控件,设置地图的基本属性如比例尺、坐标系统等。 2. 图层的管理...

    站长常用的200个js代码

    "站长常用的200个js代码"集合可能是为了帮助网站管理员、开发者和站长解决日常工作中遇到的各种问题,提升工作效率而整理的实用代码片段。 1. **DOM操作**:JavaScript通过Document Object Model (DOM) API可以动态...

    10个常用CSS代码片段(DOC文档)

    ### CSS代码片段详解 #### 1. 居中布局 **功能:** 该段代码实现了将一个指定宽度的元素(如容器、区块等)水平居中显示。 **HTML结构:** ```html <div class="wrap"></div> ``` **CSS样式:** ```css .wrap { ...

    DirectShow-Filter 最简单的示例代码

    `stdafx.cpp`和`stdafx.h`包含预编译头文件,它们通常包含常用库的包含语句和宏定义,可以提高编译速度。在DirectShow项目中,它们可能包含了对`windows.h`,`dshow.h`和`uuid.lib`等DirectShow相关的头文件和库的...

Global site tag (gtag.js) - Google Analytics