4.4过滤器和监听器——过滤器案例,对页面输出内容进行gzip压缩

JAVAWEB文章索引点这里
模拟输出一些字符,使用装饰者设计模式重写response对象的PrintWriter对象。然后在过滤器中兑内容进行一个压缩输出。
servlet内容

package com.servlet;

import java.io.IOException;
import java.util.zip.GZIPOutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.tomcat.util.http.fileupload.ByteArrayOutputStream;

@WebServlet("/GZIPServlet")
public class GZIPServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < 1000; i++) {
            sb.append("str");
        }
        System.out.println("压缩前的大小:"+sb.toString().length());
        response.getWriter().write(sb.toString());
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

filter的内容

package com.filter;

import java.io.CharArrayWriter;
import java.io.IOException;
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.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

import org.apache.tomcat.util.http.fileupload.ByteArrayOutputStream;

@WebFilter("/GZIPServlet")
public class GZIPFilter implements Filter {

    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response2 = (HttpServletResponse)response;
        MyResponse myResponse = new MyResponse(response2);
        //传递自己写的response对象
        chain.doFilter(request, myResponse);

        ByteArrayOutputStream buf = new ByteArrayOutputStream();
        //将buf作为容器放入GZIPOutputStream
        GZIPOutputStream gzip = new GZIPOutputStream(buf);
        //将charArray中的内容进行压缩,写入buf
        gzip.write(new String(myResponse.getCharArray()).getBytes());
        //结束命令,刷新完缓冲区
        gzip.finish();
        byte[] result = buf.toByteArray();
        //告诉浏览器发出的内容为gzip压缩过的内容
        myResponse.setHeader("content-encoding", "gzip");
        System.out.println("压缩后大小为:"+result.length);
        response.getOutputStream().write(result);
    }

    public void init(FilterConfig fConfig) throws ServletException {
    }
}
/**
 * 用装饰者模式重写PrintWriter方法
 * */
class MyResponse extends HttpServletResponseWrapper{
    private CharArrayWriter charArray = new CharArrayWriter();
    public MyResponse(HttpServletResponse response) {
        super(response);
    }
    public char[] getCharArray() {
        return charArray.toCharArray();
    }
    @Override
    public PrintWriter getWriter() throws IOException {
        //当调用response.getWriter的时候,写入的内容会写到charArray
        return new PrintWriter(charArray);
    }
}

猜你喜欢

转载自blog.csdn.net/smallhc/article/details/80846937