全站压缩

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 {

public void destroy() {

}

public void doFilter(ServletRequest req, ServletResponse resp,

FilterChain chain) throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest)req;

HttpServletResponse response = (HttpServletResponse)resp;

GzipHttpServletResponse gresponse = new GzipHttpServletResponse(response);

chain.doFilter(request, gresponse);//放行

//压缩代码写在此处

//找一个内存缓冲字节流

ByteArrayOutputStream baos = new ByteArrayOutputStream();

//把数据压缩到缓冲字节流流中

GZIPOutputStream gout = new GZIPOutputStream(baos);

//取出数据:压缩后的

byte b[] = gresponse.getOldBytes();//原始字节

System.out.println("原有数据大小:"+b.length);

gout.write(b);

gout.close();//保证所有的数据都进入内存缓存流

//取出压缩后的数据

b = baos.toByteArray();

System.out.println("压缩后的数据大小:"+b.length);

//输出前一定要告知客户端压缩方式

response.setHeader("Content-Encoding", "gzip");

response.setContentLength(b.length);//告知客户端正文的大小

//用服务器的响应对象输出

ServletOutputStream out = response.getOutputStream();

out.write(b);

}

public void init(FilterConfig filterConfig) throws ServletException {

}

}

class GzipHttpServletResponse extends HttpServletResponseWrapper{

private ByteArrayOutputStream baos = new ByteArrayOutputStream();

private PrintWriter pw;

public GzipHttpServletResponse(HttpServletResponse response){

super(response);

}

//把原始数据封装到一个缓冲流中

@Override

public ServletOutputStream getOutputStream() throws IOException {

return new MyServletOutputStream(baos);

}

//字符流:把原始数据封装到一个缓冲流中

@Override

public PrintWriter getWriter() throws IOException {

pw = new PrintWriter(new OutputStreamWriter(baos, super.getCharacterEncoding()));//字符流转成字节流编码会丢失

return pw;

}

//返回baos中的缓存数据:原始

public byte[] getOldBytes(){

try {

if(pw!=null){

pw.close();

}

baos.flush();

} catch (IOException e) {

e.printStackTrace();

}

return baos.toByteArray();

}

}

class MyServletOutputStream extends ServletOutputStream{

private ByteArrayOutputStream baos;

public MyServletOutputStream(ByteArrayOutputStream baos){

this.baos = baos;

}

@Override

public void write(int b) throws IOException {

baos.write(b);

}

}

全站压缩,布布扣,bubuko.com

时间: 2024-10-21 21:00:41

全站压缩的相关文章

压缩字符流和字节流和全站压缩过滤器

1 public static void main(String[] args) throws Exception { 2 ByteArrayOutputStream bos = new ByteArrayOutputStream(); //字符流 3 OutputStreamWriter osw = new OutputStreamWriter(bos); 4 PrintWriter pw = new PrintWriter(osw); 5 pw.write("helloworld"

javaEE之------GZIP全站压缩

GZIP全站压缩 将压缩后的文本文件,发送给浏览器,减少流量 GZIP压缩的条件: 设置头文件协议: myresp.setHeader("Content-Encoding", "gzip"); myresp.setContentLength(src.length); 两个主要的类:ByteArrayOutputStream,GZIPOutputStream 采用包装模式对respone加强 主要流程: 共存在两种流,字节流outputStream和字符流PrintW

【Java EE 学习第19天】【使用过滤器实现全站压缩】【使用ThreadLocal模式解决跨DAO事务回滚问题】

一.使用过滤器实现全站压缩 1.目标:对网站的所有JSP页面进行页面压缩,减少用户流量的使用.但是对图片和视频不进行压缩,因为图片和视频的压缩率很小,而且处理所需要的服务器资源很大. 2.实现原理: (1)使用GZIPOutputStream工具对数据进行压缩,中间借助了ByteArrayOutputStream类进行结果的存储. (2)使用过滤器对浏览器请求进行拦截,通过自定义HttpServletResponse类(使用包装模式),重写getWriter方法,使得写出的目的地转变成ByteA

全站压缩过滤器

1.网站压缩的一个简单示例 public class ServletDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

JavaWeb-过滤器Filter学习(五)全站压缩

全站压缩,最大的好久就是帮客户端节省流量. 数据压缩,我们需要用到二个Java类,也就是java.util.zip 中的 类 GZIPOutputStream 此类为使用 GZIP 文件格式写入压缩数据实现流过滤器. java.io 类 ByteArrayOutputStream 此类实现了一个输出流,其中的数据被写入一个 byte 数组.缓冲区会随着数据的不断写入而自动增长.可使用 toByteArray() 和 toString() 获取数据. 我们利用GZIPOutputStream(Ou

JavaWeb 后端 <十二> 之 过滤器 filter 乱码、不缓存、脏话、标记、自动登录、全站压缩过滤器

一.过滤器是什么?有什么? 1.过滤器属于Servlet规范,从2.3版本就开始有了. 2.过滤器就是对访问的内容进行筛选(拦截).利用过滤器对请求和响应进行过滤 二.编写步骤和执行过程 1.编码步骤: a.编写一个类:实现javax.servlet.Filter接口 public class FilterDemo1 implements Filter { public FilterDemo1(){ System.out.println("调用了默认的构造方法"); } //用户每次访

JavaWeb之Filter快速入门(十七)

Filter 1. 过滤器简介 1. 过滤器是Java Web三大组件之一,它在很多方面都与Servlet相似 2. 过滤器可以理解成拦截器,其实过滤器的代码是环绕在被访问资源的前后,为被访问的资源提供增强的作用(比如过滤器就像楼层中保安,所有人员经过楼层必须经过保安) 3. 过滤器的应用场景: 1). 执行目标资源之前做预处理工作,例如设置编码,这种试通常都会放行,只是在目标资源执行之前做一些准备工作 2). 通过条件判断是否放行,例如校验当前用户是否已经登录,或者用户IP是否已经被禁用 3)

linux 几个常用命令

解压: tar zxvf 22gif.tar.gz 压缩: tar zcvf 22gif.tar.gz www.22gif.com (目录名字,这里是全站压缩备份) 查看正在使用的服务和端口 可以使用netstat -tunlp,netstat -antup,lsof -i:PORT命令查看. 查看服务器进程信息 可以使用ps auxww|grep PID,ps -ef,lsof -p PID,top -p PID命令查看. 测试配置文件是否正确: /alidata/server/nginx-1

过滤器和文件上传

1.过滤器 1.概述 过滤器就是在对目标资源进行请求前或请求后来进行拦截, //放行前加入的代码 chain.doFilter(request,response); //放行后的代码 2.写法 1.实现Filter接口 init(FilterConfig); doFilter(ServletRequest,ServletResponse,FilterChain); destory(); 2.web.xml配置? <filter> <filter-name></filter-n