javaweb之压缩过滤器
2016-05-17 21:19
267 查看
过滤器是提高网站性能的必须之物 下面就是一个过滤器的简单demon
当然写完这些之后这个过滤肯定是不能用的 我们必须还要去web.xml中配置 配置的时候还是有个小细节需要捋捋
首先 gzip是对文本有比较高的压缩率 所以路径就配了 jsp html css js 的了 其次 由于在服务器内部 我们访问这些资源的时候可能是采取转发的形式来访问 所以dispatcher必须也要配上FORWORD 这样一个简单的压缩过滤器就做好了 下面是测试额压缩率
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.ServletOutputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; public class GzipFilter implements Filter { @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; //response.getOutputStream().writer respnose.getWriter().writer(); //定义自己的增强版 response Myresponse myresponse = new Myresponse(response); chain.doFilter(request, myresponse); byte[] bout= myresponse.getBuffer(); System.out.println("压之前"+bout.length); byte[] gzipb = gzip(bout); System.out.println("压之后"+gzipb.length); //原理相当与 原本由普通的response 直接输出给了浏览器 但被我增强一把之后 数据就被我截获了 //保存在我的那个 byteArrayOutputStream 中了 然后我取出来处理了下 不过最后还是要物归原主 返回给浏览器 response.setHeader("content-encoding", "gzip"); response.setHeader("content-length", gzipb.length+""); response.getOutputStream().write(gzipb); } public byte[] gzip(byte[] bout){ ByteArrayOutputStream out= new ByteArrayOutputStream(); try{ GZIPOutputStream gzipout= new GZIPOutputStream(out); gzipout.write(bout); gzipout.close(); //因为GZIPOutputStream是缓冲流 return out.toByteArray(); }catch (Exception e) { // TODO: handle exception throw new RuntimeException(e); } } class Myresponse extends HttpServletResponseWrapper{ private ByteArrayOutputStream bout= new ByteArrayOutputStream(); private HttpServletResponse response; private PrintWriter pw; public Myresponse(HttpServletResponse response) { super(response); // TODO Auto-generated constructor stub this.response = response; } @Override public ServletOutputStream getOutputStream() throws IOException { // TODO Auto-generated method stub //看返回类型 得知 它是个抽象类 所以没办法治好自己实现它了 然后再将数据写到定义到到的那个流中 return new MyServletOutputStream(bout) ; } @Override public PrintWriter getWriter() throws IOException { // TODO Auto-generated method stub // PrintWriter(OutputStream out) 虽然有这个方法 但是并不能指定码表编码所以容易造成乱码 //必须用一个能支持编码的流作为传递的依赖 所以才有了以下这个写法 pw = new PrintWriter(new OutputStreamWriter(bout,"utf-8")); return pw; } public byte[] getBuffer(){ if(pw !=null){ pw.close(); //因为 PrintWriter 是个包装流 所以也要关闭 } return bout.toByteArray(); } } class MyServletOutputStream extends ServletOutputStream{ private ByteArrayOutputStream bout= new ByteArrayOutputStream(); public MyServletOutputStream(ByteArrayOutputStream bout) { // TODO Auto-generated constructor stub this.bout = bout; } @Override public void write(int b) throws IOException { // TODO Auto-generated method stub //每个字有自己的字节码 比如 a 的ascii码为97 bout.write(b); } } @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub } }
当然写完这些之后这个过滤肯定是不能用的 我们必须还要去web.xml中配置 配置的时候还是有个小细节需要捋捋
<filter> <filter-name>gzipFilter</filter-name> <filter-class>com.tb.bookshoop.web.Filter.GzipFilter </filter-class> </filter> <filter-mapping> <filter-name>gzipFilter</filter-name> <url-pattern>*.jsp</url-pattern> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> </filter-mapping> <filter-mapping> <filter-name>gzipFilter</filter-name> <url-pattern>*.html</url-pattern> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> </filter-mapping> <filter-mapping> <filter-name>gzipFilter</filter-name> <url-pattern>*.css</url-pattern> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> </filter-mapping> <filter-mapping> <filter-name>gzipFilter</filter-name> <url-pattern>*.js</url-pattern> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> </filter-mapping>
首先 gzip是对文本有比较高的压缩率 所以路径就配了 jsp html css js 的了 其次 由于在服务器内部 我们访问这些资源的时候可能是采取转发的形式来访问 所以dispatcher必须也要配上FORWORD 这样一个简单的压缩过滤器就做好了 下面是测试额压缩率
相关文章推荐
- 移植项目时遇到的NoClassDefFoundError错误及其解决方法
- Java中的递归原理分析
- Java的多态
- [Javascrip] Logging Timing Data to the Console
- java类单继承,接口多继承设计的原因
- Java编译、反编译、JAR
- Java集合框架List,Map,Set等
- java反射详解
- 第十八章 springboot + thymeleaf
- Java单例模式
- 排序算法分析(一)-java实现
- Java图形界面开发—列出指定目录
- Java图形界面开发—列出指定目录
- REST、RESTFUL的理解以及SpringMVC实现Restful编程
- 并发编程学习总结(四) :java 显式锁ReentrantLock使用详解之lock()\unlock() 加锁与释放锁
- Dijkstra-java
- java之求两个输入数的最大公因数和最小公倍数
- java web 过滤器filter
- java实体类实现序列化的意义
- Eclipse报错:An internal error has occurred. Widget is disposed