response压缩响应
思路:
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压缩响应的更多相关文章
- response (响应对象)
一.response响应过程 在去发送一个请求时, 会找到tomcat引擎 引擎会找到对应的web应用,并且会创建request对象和response对象 找到应用后, 会执行应用的web.xml再去 ...
- http response压缩
http response压缩 一.Spring boot启用Gzip压缩 application.xml新增配置: 未启用压缩时试验接口传输大小不变为61.88M,耗时1分多钟 启动压缩时试验接口传 ...
- JSP Filter,GZIP压缩响应流
url:http://hi.baidu.com/xhftx/blog/item/fbc11d3012648711ebc4af59.html 关键词:JSP,Filter,Servlet,GZIP 现在 ...
- thttpd增加gzip压缩响应报文体功能,以减少传输数据量
thttpd thttpd是一个非常小巧的轻量级web server,它非常非常简单,仅仅提供了HTTP/1.1和简单的CGI支持,在其官方网站上有一个与其他web server(如Apache, Z ...
- 通过response设置响应体
(1)响应体设置文本 PrintWriter getWriter() 获得字符流,通过字符流的write(String s)方法可以将字符串设置到response 缓冲区中,随后Tomcat会将res ...
- Filter 起航 编程式配置 压缩响应 日志过滤器
[编程式配置]可以用web.xml配置替换 @WebListenerpublic class FilterListenerConfigurator implements ServletContextL ...
- Response Assertion(响应断言)
响应断言可以让你添加匹配字符串来匹配请求和响应的各个字符串. 匹配字符串可以是1.Contains和Matches正则表达式:2.Equals和SubString文本类型,大小写敏感. Apply t ...
- Servlet学习(五)——通过response设置响应体及中文乱码问题
1.响应体设置文本 PrintWriter writer=response.getWriter(); 获得字符流,通过字符流的write(String s)方法可以将字符串设置到response 缓冲 ...
- response对响应的设置
1.response对象设置响应行状态码: protected void doGet(HttpServletRequest request, HttpServletResponse response) ...
随机推荐
- 狗屎的Java规范
规范 标题真有点侮辱了狗. 最近做Java,C#与Java对比笔记: http://www.cnblogs.com/newsea/p/4839540.html 其实Java语法弱点就弱点,关键是Jav ...
- jquery的getjson与jsonp
仔细的学习jquery的getjson的用法. http://www.cnblogs.com/leejersey/p/3750232.html http://www.jb51.net/article/ ...
- SQL Server使用游标或临时表遍历数据
方法一:使用游标(此方法适用所有情况,对标结构没有特殊要求.) declare @ProductName nvarchar() declare pcurr cursor for select Prod ...
- 清除webBrowser 缓存和Cookie的解决方案
通过测试webBrowser与IE缓存和Cookie都存放在Local Settings\Temporary Internet Files,我们可以直接调用IE API进行清除 解决方案1: publ ...
- 东大OJ 2SAT 异或
看了十年才懂懂了十年才会会了十年才会写写了十年才写完写完了十年才能改对 #include<stdio.h> #include<string.h> struct res{ int ...
- Android网络开发之实时获取最新数据
在实际开发中更多的是需要我们实时获取最新数据,比如道路流量.实时天气信息等,这时就需要通过一个线程来控制视图的更新. 示例:我们首先创建一个网页来显示系统当前的时间,然后在Android程序中每隔5秒 ...
- 标题栏ToolBar
使用标题栏ToolBar 首先需要在AndroidManifest.xml中修改 application主题或者activity主题 隐藏原生标题栏 在styles.xml中自定义主题 a ...
- 网页中常用HTML字符实体
摘要: 一些字符在 HTML 中拥有特殊的含义,比如小于号 () 用于定义 HTML 标签的开始.如果我们希望浏览器正确地显示这些字符,我们必须在 HTML 源码中插入字符实体. 字符实体有三部分:一 ...
- 【BZOJ 4269】再见Xor
zky学长提供的线性基求法: for(int i=1;i<=n;i++) for(int j=64;j>=1;j--) { if(a[i]>>(j-1)&1) { if ...
- quartz使用案例
@Service public class QuartzServiceImpl extends BaseServiceImpl<JobDetails, String, QuartzTaskVO& ...