filter实现过滤压缩指定的请求的操作

filter过滤器的创建
package filter;

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

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class GzipFilter implements Filter {
	// 这是一个用来将响应出去的数据进行压缩的处理过滤的类

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws IOException, ServletException {

		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) res;
		
		System.out.println("doFilter被执行在创建增强器MyRresponse之前.................");

		// 对response响应的对象进行增强
		MyRresponse myRresponse=new MyRresponse(response);
		//执行目标方法带着增强后的对象
		chain.doFilter(request, myRresponse);
		
		//获取response对象中的流的原大小
		byte resouceByte[]=myRresponse.getBuffer();
		
		System.out.println("这是原数据的大小==========="+resouceByte.length);
		
		
		//这是压缩之后的数据对象
		ByteArrayOutputStream out=new ByteArrayOutputStream();
		//创建压缩的流对象,接收字节输出流
		GZIPOutputStream gzipOutputStream=new GZIPOutputStream(out);
		
		//压缩流对象,并将数据写入压缩输出流对象
		gzipOutputStream.write(resouceByte);
		//关闭数据流
		gzipOutputStream.close();
		
		//得到压缩后的数据
		byte gzipByte[]=out.toByteArray();
		
		System.out.println("这是压缩后的数据大小==========="+gzipByte.length);
		
		//高速浏览器以什么样的方式进行解析
		//内容的编码方式
		response.setHeader("Content-Encoding", "gzip");
		//内容大小
		response.setContentLength(gzipByte.length);
		//将内容写入
		response.getOutputStream().write(gzipByte);
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

	// 这是对服务器输出流的增强
	class MyServletOutputStream extends ServletOutputStream {

		// 定义字节的输出流对象
		private ByteArrayOutputStream baos;

		public MyServletOutputStream(ByteArrayOutputStream baos) {
			super();
			this.baos = baos;
		}

		// 重写输输出流方法
		@Override
		public void write(int b) throws IOException {
			// TODO Auto-generated method stub
			baos.write(b);
		}

	}

	// 这是对响应的数据进行增强的类
	// 1.首先看需要被增强对象继承了什么接口或父类,编写一个类也去继承这些接口或父类
	class MyRresponse extends HttpServletResponseWrapper {
		// 缓冲区输出流的定义
		private ByteArrayOutputStream baos = new ByteArrayOutputStream();

		// 2.在类中定义一个变量,变量类型即需要增强对象的类型
		private HttpServletResponse response;

		// 创建文本输出流
		private PrintWriter pw;

		// 3.在类中定义一个构造函数,接收需增强的对象
		public MyRresponse(HttpServletResponse response) {
			super(response);
			this.response = response;
		}

		// 4.覆盖被增强的方法,编写增强的功能
		@Override
		public ServletOutputStream getOutputStream() throws IOException {
			return new MyServletOutputStream(baos);
		}

		@Override
		public PrintWriter getWriter() throws IOException {
			pw = new PrintWriter(new OutputStreamWriter(baos, "UTF-8"));
			return pw;
		}

		// 自定义方法
		public byte[] getBuffer() {
			if (pw != null) {// 判断缓冲区是否写入数据
				pw.close();
			}
			return baos.toByteArray();

		}

	}

}
web.xml文件的配置处理
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>jqueryeasyui</display-name>
	<servlet>
		<servlet-name>LoginServlet</servlet-name>
		<servlet-class>servlet.LoginServlet</servlet-class>
	</servlet>

	<servlet-mapping>
		<servlet-name>LoginServlet</servlet-name>
		<url-pattern>/login.do</url-pattern>
	</servlet-mapping>

	<filter>
		<filter-name>EncodingFilter</filter-name>
		<filter-class>filter.EncodingFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>EncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<filter>
		<filter-name>GzipFilter</filter-name>
		<filter-class>filter.GzipFilter</filter-class>
	</filter>
<!-- 过滤指定的后缀请求-->
	<filter-mapping>
		<filter-name>GzipFilter</filter-name>
		<url-pattern>*.jpg</url-pattern>
	</filter-mapping>



	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
</web-app>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值