`
dyccsxg
  • 浏览: 201808 次
  • 性别: 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

分享到:
评论

相关推荐

    常用HTML代码解释

    华文彩云" size="6" color="#FFFFFF">歌曲或音乐名称</font><br> ...<EMBED style="FILTER: xray()" src=音乐地址 width=250 height=30 type=audio/x-ms-wma autostart="true" loop="-1"> <br>

    工具箱(java开发中常用工具类,web工程中常用的Filter等).zip

    提供集成开发环境(IDE),如Visual Studio、Eclipse、Android Studio和Sublime Text等,这些工具集成了文本编辑器,支持语法高亮、自动补全、代码片段管理和版本控制等功能,有助于开发者高效编写和维护代码。...

    代码生成器-可自定义模版-guns

    4. 对常用js插件进行二次封装,使js代码变得简洁,更加易维护,具体请见webapp/static/js/common文件夹内js代码。 5. 利用ehcache框架对经常调用的查询进行缓存,提升运行速度,具体请见ConstantFactory类中@...

    Spring常用注解及自定义Filter的实现

    主要介绍了Spring常用注解及自定义Filter的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    hampel_filter.m

    hampel滤波器去除异常值的matlab实现,在信号数据预处理常用。我是用于处理csi数据。输入一个csi矩阵,直接调用即可。

    Filter4个有用的过滤器

    很详细的代码,非常有用,都是开发中常用的几种拦截器!

    一些常用的软件滤波方法

    一些常用的软件滤波方法 1、限副滤波 /* A值可根据实际情况调整 value为有效值,new_value为当前采样值 滤波程序返回有效的实际值 */ #define A 10 char value; char filter() { ...

    matlabfilter代码-Coherent-Communication:相干通信

    matlab过滤器代码相干通信 该示例基于Python 3.8,用于相干光通信,支持QPSK,8QAM,16QAM,SP-16QAM,32-SP-QAM和128-SP-QAM信号生成,光纤传输和接收。 下载所有4个.py文件并将它们放置在同一文件夹中,运行main....

    matlab辅助图像处理源代码

    常用的一些图像处理Matlab源代码 #1:数字图像矩阵数据的显示及其傅立叶变换 #2:二维离散余弦变换的图像压缩 #3:采用灰度变换的方法增强图像的对比度 #4:直方图均匀化 #5:模拟图像受高斯白噪声和椒盐噪声的影响 ...

    Java Web整合开发王者归来(共4部分含源代码)part1

    第8篇为工具篇,内容包括在Java Web项目中常用的开源工具框架、主要有版本管理工具SVN、日志工具commons-logging与Log4J、报表图形引擎JFreeChart、PDF组件iText等;第9篇为实战篇,内容为两个典型的应用系统:论坛...

    Android入门到精通源代码.

    3.3.2 基于代码的界面设计 3.4 应用实例:在界面中显示图片 第4章 Android人机界面和常用组件 4.1 用户人机界面元素分类 4.1.1 视图组件(View) 4.1.2 视图容器组件(ViewGroup) 4.1.3 布局组件(Layout) 4.1.4 ...

    Java Web整合开发王者归来(共4部分含源代码)part4

    第8篇为工具篇,内容包括在Java Web项目中常用的开源工具框架、主要有版本管理工具SVN、日志工具commons-logging与Log4J、报表图形引擎JFreeChart、PDF组件iText等;第9篇为实战篇,内容为两个典型的应用系统:论坛...

    数据结构常用算法c++实现

    数据结构常用算法c++实现,程序目录如下: Array shuffle Prime test(trial division) Prime test(Miller-Rabin's method) 2D Array Arbitary Integer Linear congruential generator Maximum subarray problem Bit...

    Java Web整合开发王者归来(共4部分含源代码)part2

    第8篇为工具篇,内容包括在Java Web项目中常用的开源工具框架、主要有版本管理工具SVN、日志工具commons-logging与Log4J、报表图形引擎JFreeChart、PDF组件iText等;第9篇为实战篇,内容为两个典型的应用系统:论坛...

    Java Web整合开发王者归来(共4部分含源代码)part3

    第8篇为工具篇,内容包括在Java Web项目中常用的开源工具框架、主要有版本管理工具SVN、日志工具commons-logging与Log4J、报表图形引擎JFreeChart、PDF组件iText等;第9篇为实战篇,内容为两个典型的应用系统:论坛...

    mplayer常用命令

    mplayer常用命令.mplayer 在slave模式命令测试 测试命令及文件:./mplayer -slave -quiet media_file 1. pause 暂停/取消暂停播放 2. mute mute [value] 切换声音输出静音或将其设置为[value](value>=0) (1 ==...

    Android实例代码

    15.2、Android的常用传感器:方向传感器Orientation; 磁场传感器Magnetic Field; 温度传感器Temperature; 光传感器Light; 压力传感器Pressure; 第16章、GPS应用开发 16.1、支持GPS的核心API: 16.2、获取...

    详解AngularJS中$filter过滤器使用(自定义过滤器)

    * (1)常用内置过滤器 * number 数字过滤器,可以设置保留数字小数点后几位等 * date 时间格式化过滤器,可自己设置时间格式 * filter 过滤的数据一般是数组,数组中的数据可以是对象,字符串等 * orderBy 排序根据...

    matlab代码影响-EEG-CSP-Filter-Project:EEG-CSP-Filter-Project

    matlab代码影响EEG-CSP-Filter-Project 介绍 该实验的目的是根据Mu Waves解码想象的运动。 当身体静止时,Mu Wave出现的频率为7.5 Hz至12 Hz。 通过进行脑电图实验(实验对象想象执行某项任务),验证了运动皮层中Mu...

    java编写的图片浏览器源代码

    图片浏览功能,具有放大,缩小功能,循环浏览,一些swing常用控件的使用!

Global site tag (gtag.js) - Google Analytics