- package cn.itcast.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.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 {
- public void destroy() {
- }
- public void doFilter(ServletRequest request, ServletResponse response,
- FilterChain chain) throws IOException, ServletException {
- //要想压缩页面 就是当用户访问页面时 在服务器把页面信息打给浏览器的时候进行压缩 所以这时候就是对response进行包装
- MyResponse myresponse = new MyResponse((HttpServletResponse) response);
- chain.doFilter(request, (ServletResponse) myresponse);
- //从包装的myresponse里获得写到容器流里的原始数据bs
- byte[] bs = myresponse.getOut();
- System.out.println("压缩前>>>"+bs.length);
- //用原始的response响应用户,此response需要转换为HttpServletResponse类型
- HttpServletResponse resp = (HttpServletResponse) response;
- //response解决中文乱码问题
- resp.setContentType("text/html;charset=utf-8");
- //开始压缩
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- GZIPOutputStream zip = new GZIPOutputStream(out);
- zip.write(bs);
- zip.close();
- //获取压缩后的数据
- byte[] dest = out.toByteArray();
- System.out.println("压缩后>>>"+dest.length);
- //设置响应头
- resp.setDateHeader("content-length", dest.length);
- resp.setHeader("content-Encoding", "gzip");
- resp.getOutputStream().write(dest);
- }
- public void init(FilterConfig arg0) throws ServletException {
- }
- }
- class MyResponse extends HttpServletResponseWrapper{
- private ByteArrayOutputStream out = new ByteArrayOutputStream();//定义一个容器
- public MyResponse(HttpServletResponse response) {
- super(response);
- }
- //重写父类的getwriter方法
- PrintWriter writer;
- @Override
- public PrintWriter getWriter() throws IOException {
- //写到一个容器流里 ,
- writer = new PrintWriter(new OutputStreamWriter(out,"utf-8"), true);
- return writer;
- }
- //提供一个获得流里内容的方法 因为用字符流写到容器里的,有缓冲区,所以在取出流里的数据时判断字符流是否关闭
- public byte[] getOut(){
- if(writer!=null){
- writer.close();
- }
- return out.toByteArray();
- }
- }
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.5"
- xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
- <display-name></display-name>
- <filter>
- <filter-name>GZIP</filter-name>
- <filter-class>cn.itcast.filter.GZIPFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>GZIP</filter-name>
- <url-pattern>*.jsp</url-pattern>
- </filter-mapping>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- </web-app>
- //该片段来自于http://www.codesnippet.cn/detail/070820135004.html
来源: http://www.codesnippet.cn/detail/070820135004.html