filter实现过滤压缩指定的请求的操作
2014-01-03 16:08
417 查看
filter过滤器的创建 package filter; 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.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 res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; System.out.println("doFilter被执行在创建增强器MyRresponse之前................."); // 对response响应的对象进行增强 MyRresponse myRresponse=new MyRresponse(response); //执行目标方法带着增强后的对象 chain.doFilter(request, myRresponse); //获取response对象中的流的原大小 byte resouceByte[]=myRresponse.getBuffer(); System.out.println("这是原数据的大小==========="+resouceByte.length); //这是压缩之后的数据对象 ByteArrayOutputStream out=new ByteArrayOutputStream(); //创建压缩的流对象,接收字节输出流 GZIPOutputStream gzipOutputStream=new GZIPOutputStream(out); //压缩流对象,并将数据写入压缩输出流对象 gzipOutputStream.write(resouceByte); //关闭数据流 gzipOutputStream.close(); //得到压缩后的数据 byte gzipByte[]=out.toByteArray(); System.out.println("这是压缩后的数据大小==========="+gzipByte.length); //高速浏览器以什么样的方式进行解析 //内容的编码方式 response.setHeader("Content-Encoding", "gzip"); //内容大小 response.setContentLength(gzipByte.length); //将内容写入 response.getOutputStream().write(gzipByte); } @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub } // 这是对服务器输出流的增强 class MyServletOutputStream extends ServletOutputStream { // 定义字节的输出流对象 private ByteArrayOutputStream baos; public MyServletOutputStream(ByteArrayOutputStream baos) { super(); this.baos = baos; } // 重写输输出流方法 @Override public void write(int b) throws IOException { // TODO Auto-generated method stub baos.write(b); } } // 这是对响应的数据进行增强的类 // 1.首先看需要被增强对象继承了什么接口或父类,编写一个类也去继承这些接口或父类 class MyRresponse extends HttpServletResponseWrapper { // 缓冲区输出流的定义 private ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 2.在类中定义一个变量,变量类型即需要增强对象的类型 private HttpServletResponse response; // 创建文本输出流 private PrintWriter pw; // 3.在类中定义一个构造函数,接收需增强的对象 public MyRresponse(HttpServletResponse response) { super(response); this.response = response; } // 4.覆盖被增强的方法,编写增强的功能 @Override public ServletOutputStream getOutputStream() throws IOException { return new MyServletOutputStream(baos); } @Override public PrintWriter getWriter() throws IOException { pw = new PrintWriter(new OutputStreamWriter(baos, "UTF-8")); return pw; } // 自定义方法 public byte[] getBuffer() { if (pw != null) {// 判断缓冲区是否写入数据 pw.close(); } return baos.toByteArray(); } } }
web.xml文件的配置处理 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>jqueryeasyui</display-name> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login.do</url-pattern> </servlet-mapping> <filter> <filter-name>EncodingFilter</filter-name> <filter-class>filter.EncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>GzipFilter</filter-name> <filter-class>filter.GzipFilter</filter-class> </filter> <!-- 过滤指定的后缀请求--> <filter-mapping> <filter-name>GzipFilter</filter-name> <url-pattern>*.jpg</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
相关文章推荐
- 使用UglifyJS合并/压缩JavaScript的方法
- 高性能WEB开发 JS、CSS的合并、压缩、缓存管理
- 脚本分析、压缩、混淆工具 JSA新版本发布,压缩效率提高大约10%
- 发布一个高效的JavaScript分析、压缩工具 JavaScript Analyser
- javaweb之web入门基础
- 在IIS上启用Gzip压缩 (HTTP压缩)第1/3页
- javascript实现的样式表(CSS) 格式整理与压缩
- php zlib压缩和解压缩swf文件的代码
- YUI Compressor压缩JavaScript原理及微优化
- python zip文件 压缩
- CSS代码格式化和压缩的方法与技巧
- Linux下的压缩与解压缩命令详细解析
- asp.net中调用winrar实现压缩解压缩的代码
- ACCESS数据库文件的压缩和修复方法[图文]
- MySQL 加密/压缩函数
- JavaScript 在线压缩和格式化收藏
- 基于.NET 4.5 压缩的使用
- Linux tar 压缩打包命令使用方法第1/2页
- JavaWeb中struts2实现文件上传下载功能实例解析
- Google的javaScript压缩工具