思路:

1、通过filter向目标页面传递一个自定义的response对象 2.、在这个response对象中通过重写getOutputStream方法和getWriter方法使目标资源调用
该方法输出页面内容时,获得我们自定义的ServletOutputStream对象
3、在我们自己定义的ServletOutputStream中,重写writer 方法,使资源写到buffer中。
4、当页面完成输出后,在filter中就可以得到页面写出的数据,从而我们可以调用GZIPOutputStream
对数据进行压缩后再传递给浏览器,完成响应文件的压缩功能

目的:减少浏览器的响应时间以及节省带宽

1、showServlet类:

public class ShowServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获得response的输出流
ServletOutputStream sout=response.getOutputStream();
//字符串转化为字节输出
sout.write("AAAAAAAfwef fds asdfsdaf sdfa sdfasd sadf AAAAAAAAAAAAAAAAAAAAAAAAAAAAA".getBytes());
}
}

2、MyResponse类:

import java.io.ByteArrayOutputStream;
import java.io.IOException; import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper; /*HttpServletResponseWrapper
是一个Decoretor设计模式的默认实现类
不需要像实现request接口中的所有方法
以下为装饰类的做法
*/
public class MyResponse extends HttpServletResponseWrapper {
private HttpServletResponse response;
private ByteArrayOutputStream bout=new ByteArrayOutputStream(); public MyResponse(HttpServletResponse response) {
super(response);
this.response=response;
} /*综合考虑下还是重写getOutStream
但是需求是要输出到缓存,此方法不适合,于是写一个拓展类类来迎合需求*/
@Override
public ServletOutputStream getOutputStream() throws IOException {
return new MyServletOutputStream(bout);
} //将数据封装成一个数组然后发送到缓存
class MyServletOutputStream extends ServletOutputStream{
private ByteArrayOutputStream bout;
public MyServletOutputStream(ByteArrayOutputStream bout){
this.bout=bout; } /*此处应该要将数据包装成一个数组但是
此处不符合需求,于是重载*/
@Override
public void write(int b) throws IOException { }
public void write(byte[] bytes) throws IOException {
bout.write(bytes);
bout.flush();
bout.close();
} }
public byte[] getBuffer() {
return bout.toByteArray();
}
}

3、GZIPFilter过滤类:

import java.io.ByteArrayOutputStream;
import java.io.IOException;
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; public class GZIPFilter implements Filter {
@Override
public void destroy() {
} @Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
//转化为子类才能处理,此处用了强制类型转换
HttpServletRequest request=(HttpServletRequest) req;
HttpServletResponse response=(HttpServletResponse) res; //创建MyResponse
MyResponse myResponse=new MyResponse(response); //此处放行的response是处理过的response
chain.doFilter(request, myResponse); //在输出到浏览器之前将输过来的buffer进行压缩
//增加getBuffer方法
byte[] bytes=myResponse.getBuffer();
//输出压缩前的长度以作对比
System.out.println("压缩前"+bytes.length); //用GZIPOutputStream压缩
ByteArrayOutputStream bout=new ByteArrayOutputStream();
GZIPOutputStream gzip=new GZIPOutputStream(bout); gzip.write(bytes); //一般输出都要flush
gzip.flush();
gzip.close();
bytes=bout.toByteArray();
//压缩后
System.out.println("压缩后"+bytes.length); //注明压缩类型
response.setHeader("content-encoding", "gzip");
response.setHeader("content-length",bytes.length+"");
//写到浏览器,浏览器会自动解压,只要注明了类型
response.getOutputStream().write(bytes); } @Override
public void init(FilterConfig filterConfig) throws ServletException { } }

其中在xml配置文件中应该添加以下代码

	 <filter>
<filter-name>GZIPFilter</filter-name>
<filter-class>a2.GZIPFilter</filter-class>
</filter> <filter-mapping>
<filter-name>GZIPFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

控制台输出(显示压缩的效果)

浏览器输出(显示响应报文)

response压缩响应的更多相关文章

  1. response (响应对象)

    一.response响应过程 在去发送一个请求时, 会找到tomcat引擎 引擎会找到对应的web应用,并且会创建request对象和response对象 找到应用后, 会执行应用的web.xml再去 ...

  2. http response压缩

    http response压缩 一.Spring boot启用Gzip压缩 application.xml新增配置: 未启用压缩时试验接口传输大小不变为61.88M,耗时1分多钟 启动压缩时试验接口传 ...

  3. JSP Filter,GZIP压缩响应流

    url:http://hi.baidu.com/xhftx/blog/item/fbc11d3012648711ebc4af59.html 关键词:JSP,Filter,Servlet,GZIP 现在 ...

  4. thttpd增加gzip压缩响应报文体功能,以减少传输数据量

    thttpd thttpd是一个非常小巧的轻量级web server,它非常非常简单,仅仅提供了HTTP/1.1和简单的CGI支持,在其官方网站上有一个与其他web server(如Apache, Z ...

  5. 通过response设置响应体

    (1)响应体设置文本 PrintWriter getWriter() 获得字符流,通过字符流的write(String s)方法可以将字符串设置到response 缓冲区中,随后Tomcat会将res ...

  6. Filter 起航 编程式配置 压缩响应 日志过滤器

    [编程式配置]可以用web.xml配置替换 @WebListenerpublic class FilterListenerConfigurator implements ServletContextL ...

  7. Response Assertion(响应断言)

    响应断言可以让你添加匹配字符串来匹配请求和响应的各个字符串. 匹配字符串可以是1.Contains和Matches正则表达式:2.Equals和SubString文本类型,大小写敏感. Apply t ...

  8. Servlet学习(五)——通过response设置响应体及中文乱码问题

    1.响应体设置文本 PrintWriter writer=response.getWriter(); 获得字符流,通过字符流的write(String s)方法可以将字符串设置到response 缓冲 ...

  9. response对响应的设置

    1.response对象设置响应行状态码: protected void doGet(HttpServletRequest request, HttpServletResponse response) ...

随机推荐

  1. vNext之旅(1):从概念和基础开始

    ASP.NET vNext or .NET vNext? vNext在曝光以来绝大多数以ASP.NET vNext这样的的字眼出现,为什么这边会提及.NET vNext?原因是我认为ASP.NET只是 ...

  2. Android开发之Menu和actionBar

    一.通过Menu目录下创建一个布局文件: 先看代码meu/main.xml: <?xml version="1.0" encoding="utf-8"?& ...

  3. RHCE认证考试教材

    前段时间考RHCE7,顺便给大家分享下RHCE6.7的中文教材!毕竟此书是官方的培训教材,还是值得看看!RHEL6.7承前启后的,给个赞! 下载:http://pan.baidu.com/s/1nu9 ...

  4. 64-who 简明笔记

    显示已登录用户的信息 who [options] who am i who程序显示在本地系统上登录的用户的信息.这些信息包括每个用户的用户名.终端设备.登录时间和相应的远程主机名(如果可应用) 参数 ...

  5. you-get中文说明

    来源于:https://github.com/soimort/you-get/wiki/%E4%B8%AD%E6%96%87%E8%AF%B4%E6%98%8E You-Get 乃一小小哒命令行程序, ...

  6. MySql数据类型问题

    1. mysql时间函数 DATE_ADD(now(), INTERVAL 1 DAY) AS tomorrow DATE_SUB(now(), INTERVAL 1 DAY) AS yesterda ...

  7. Android 之px于dp在Java代码中的转换

    现在由于用到了,使用代码进行动态布局,所以需要进行px于dp之间的转换. 现将其封装为方法,以便于调用. public int DpToPx(Context context,float dp){ fl ...

  8. 用Okhttp框架登录之后的Cookie设置到webView中(转)

    1.webview中设置: [java] view plain copy @SuppressWarnings("deprecation") public void synCooki ...

  9. [转]十步完全理解SQL

    原文地址:http://blog.jobbole.com/55086/ 很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完全不同于我们所熟知的命令行语言.面向对象的程 ...

  10. 概率 高消light oj 1151

    t个样例 n个楼梯或蛇; a b 刚好走到a会到b; 问走到100期望; dp[i]   i到100的期望 这一点没奇怪的东西 dp[i]=1/6(dp[i+1]+dp[i+2]..+6); 有   ...