过滤器压缩全站jsp

过滤器:
 public class Gzip implements Filter {
     public void destroy() {}
     public void doFilter(ServletRequest request, ServletResponse response,
             FilterChain chain) throws IOException, ServletException {
         HttpServletResponse resp=(HttpServletResponse) response;
         MyResp myResp=new MyResp(resp);//包装过的response
         chain.doFilter(request, myResp);//放行
         byte[] srcBytes= myResp.getSrcByte();//获取源数据
         ByteArrayOutputStream bOutStream=new ByteArrayOutputStream();//目标容器
         GZIPOutputStream zipOutStream=new GZIPOutputStream(bOutStream);//压缩工具
         zipOutStream.write(srcBytes);//写到容器中
         zipOutStream.close();//如果不关闭,会在缓存中,不写出
         byte[] descByte=bOutStream.toByteArray();
         System.out.println("-------------------");
         System.out.println("压缩前:"+srcBytes.length);
         System.out.println("压缩后:"+ descByte.length);
         System.out.println("-------------------");
         //使用原生response输出
         resp.setContentType("text/html;charset=utf-8");
         resp.setHeader("Content-Encoding", "Gzip");
         resp.setContentLength(srcBytes.length);
         //输出
         OutputStream out=resp.getOutputStream();
         out.write(descByte);//关闭
     }
     public void init(FilterConfig filterConfig) throws ServletException {}
 }
 class MyResp extends HttpServletResponseWrapper
 {
     private  PrintWriter outWrite;
     private ByteArrayOutputStream srcByte;
     //获取原生数据
     public byte[] getSrcByte() {
         if(outWrite!=null)//如果不关闭流,不会显示,因为数据在缓存中,没有写出
         {
             outWrite.close();
         }
         return srcByte.toByteArray();
     }
     public MyResp(HttpServletResponse response) {
         super(response);
     }
     //包装getWrite()方法,jsp页面输出内容使用的是response.getWriter().write("")
     //所以要包装
     @Override
     public PrintWriter getWriter() throws IOException {
         srcByte=new ByteArrayOutputStream();//输出的源数据
         outWrite=new PrintWriter(new OutputStreamWriter(srcByte,"utf-8"));
         return outWrite;
     }
 }
如果过滤器需要过滤Servlet,则需要用response.getWriter().write("")输出,否则不会被过滤
 response.setContentType("text/html;charset=utf-8");
         String str="你好,同学;Hello World";
         PrintWriter writer=response.getWriter();
         writer.write(str);
         writer.close();
如果Servlet中使用response.getOutputStream().write("")输出,则需要包装getOutputStream()方法
 response.setContentType("text/html;charset=utf-8");
         String str="你好,同学;Hello World";
         String times=request.getParameter("times");
         int n=Integer.valueOf(times);
         OutputStream out=response.getOutputStream();
         for (int i = 0; i < n; i++) {
             out.write(str.getBytes("utf-8"));
         }
         out.close();
包装getOutputStream()方法
@Override
public ServletOutputStream getOutputStream() throws IOException {
srcByte =new ByteArrayOutputStream();//输出的源数据
ServletOutputStream out=new ServletOutputStream() {
@Override
public void write(int b) throws IOException {
srcByte.write(b);
}
};
return out;
}
过滤器压缩全站jsp的更多相关文章
- 【Java EE 学习 19】【使用过滤器实现全站压缩】【使用ThreadLocal模式解决跨DAO事务回滚问题】
		
一.使用过滤器实现全站压缩 1.目标:对网站的所有JSP页面进行页面压缩,减少用户流量的使用.但是对图片和视频不进行压缩,因为图片和视频的压缩率很小,而且处理所需要的服务器资源很大. 2.实现原理: ...
 - shiro:10个过滤器;10个jsp标签;5个@注解
		
10个过滤器 过滤器简称 对应的java类 anon org.apache.shiro.web.filter.authc.AnonymousFilter authc org.apache.shiro. ...
 - 过滤器Filter(拦截jsp页面的跳转)案例:
		
创建一个 Filter , class类: 其继承于 接口 Filte(接口导包:import javax.servlet.Filter;) 在 web.xml 文件中配置并映射该 Filter. 其 ...
 - javaweb的Filter过滤器设置全站编码
		
FIlter配置全站编码有一种方法是重写getParameter方法,也就是继承HttpServletRequestWrapper在重写getParameter方法,还有一种就是如下: public ...
 - jsp提交表单数据乱码,内置对象,以及过滤器
		
jsp提交表单数据乱码解决方案 通过form表单给服务器提交数据的时候,如果提交的是中文数据,那么可能会出现乱码,如果表单的请求方式是post请求,那么可以使用如下方案解决乱码: 在调用getPara ...
 - Servlet和JSP中的过滤器都是Java类
		
JSP 过滤器 Servlet和JSP中的过滤器都是Java类,它们存在的目的如下: 在请求访问后端资源时拦截它 管理从服务器返回给客户端的响应 下面列出了多种常用的过滤器类型: 认证过滤器 数据压缩 ...
 - DATASNAP压缩过滤器的使用
		
ZLIBCOMPRESSION FILTER 作为范例,我们使用已随D2010提供的DataSnap过滤器.可用于在客户端和服务端压缩数据流.这里说的ZlibCompression过滤器可以在DbxC ...
 - Web jsp开发学习——终极解决jsp中request和response中文乱码的问题(加个过滤器)
		
中文乱码真的很烦人的.而且每次都要写,可麻烦了,而且有时候写了还不一定管用,所以我们可以试试过滤器 1.每个jsp头上当然要写上utf8啦 <%@ page language="jav ...
 - Servlet过滤器
		
Servlet过滤器 [TOC] 1.过滤器的基本概念 1.1.基本概念 过滤器(Filter)属于tomcat服务器中的Servlet功能.在普通的javaweb服务中,jsp中的请求要被Servl ...
 
随机推荐
- DedeCMS中最重要的四类表
			
栏目(类别): dede_arctype (dede数据库设计者认为:不管你是存放什么样的数据(软件,商品,电影..)都应该属于某个栏目(类型)) 内容主表:dede_archives (织梦数据库的 ...
 - runtime 运行时机制 完全解读
			
runtime 运行时机制 完全解读 目录[-] import import 我们前面已经讲过一篇runtime 原理,现在这篇文章主要介绍的是runtime是什么以及怎么用!希望对读者有所帮助! ...
 - 使用minidwep-gtk-PJ-wifi教程中文版
 - MemCache内存缓存系统
			
memcached是一种缓存技术, 他可以把你的数据放入内存,从而通过内存访问提速,因为内存最快的, memcached技术的主要目的提速, 默认情况下占用的端口号为:11211. 在memachec ...
 - 求四百万以内Fibonacci(number)数列偶数结果的总和
			
又对啦...开心~~~~ 只是代码可能不符合PEP标准什么的... Each new term in the Fibonacci sequence is generated by adding the ...
 - Mysql 存储过程和函数区别
			
存储过程是procedure用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表. 存储 ...
 - Smarty for foreach 使用
			
{for} {for}{forelse}用于创建一个简单的循环. 下面的几种方式都是支持的: {for $var=$start to $end}步长1的简单循环. {for $var=$start t ...
 - Qt入门(4)——Qt常见控件
			
Qt提供了大量的内建控件及通用对话框可满足程序员的绝大部分要求.我们将对这些控件和对话框作一个大概的介绍. 1. QLabel 定义 QLabel* m_labelOrdered = newQLabe ...
 - 【转】随身HiFi 安卓OTG功能在音频上的妙用
			
原文网址:http://article.pchome.net/content-1745467.html 随身HiFi 安卓OTG功能在音频上的妙用 [PChome电脑之家音频频道原创]说起Androi ...
 - 黑马程序员_JavaIO流(四)
			
File概述 File类 用来将文件或者文件夹封装成对象. 方便对文件与文件夹的属性信息进行操作. File对象可以作为参数传递给流的构造函数. 了解File类中的常用方法. 字段:static St ...