过滤器压缩全站jsp

过滤器:

 1 public class Gzip implements Filter {
 2
 3     public void destroy() {}
 4
 5     public void doFilter(ServletRequest request, ServletResponse response,
 6             FilterChain chain) throws IOException, ServletException {
 7         HttpServletResponse resp=(HttpServletResponse) response;
 8         MyResp myResp=new MyResp(resp);//包装过的response
 9         chain.doFilter(request, myResp);//放行
10
11         byte[] srcBytes= myResp.getSrcByte();//获取源数据
12         ByteArrayOutputStream bOutStream=new ByteArrayOutputStream();//目标容器
13         GZIPOutputStream zipOutStream=new GZIPOutputStream(bOutStream);//压缩工具
14         zipOutStream.write(srcBytes);//写到容器中
15         zipOutStream.close();//如果不关闭,会在缓存中,不写出
16
17         byte[] descByte=bOutStream.toByteArray();
18
19         System.out.println("-------------------");
20         System.out.println("压缩前:"+srcBytes.length);
21         System.out.println("压缩后:"+ descByte.length);
22         System.out.println("-------------------");
23
24         //使用原生response输出
25         resp.setContentType("text/html;charset=utf-8");
26         resp.setHeader("Content-Encoding", "Gzip");
27         resp.setContentLength(srcBytes.length);
28
29         //输出
30         OutputStream out=resp.getOutputStream();
31         out.write(descByte);//关闭
32
33
34     }
35     public void init(FilterConfig filterConfig) throws ServletException {}
36
37 }
38
39 class MyResp extends HttpServletResponseWrapper
40 {
41     private  PrintWriter outWrite;
42     private ByteArrayOutputStream srcByte;
43     //获取原生数据
44     public byte[] getSrcByte() {
45         if(outWrite!=null)//如果不关闭流,不会显示,因为数据在缓存中,没有写出
46         {
47             outWrite.close();
48         }
49         return srcByte.toByteArray();
50     }
51
52     public MyResp(HttpServletResponse response) {
53         super(response);
54
55     }
56
57     //包装getWrite()方法,jsp页面输出内容使用的是response.getWriter().write("")
58     //所以要包装
59     @Override
60     public PrintWriter getWriter() throws IOException {
61         srcByte=new ByteArrayOutputStream();//输出的源数据
62         outWrite=new PrintWriter(new OutputStreamWriter(srcByte,"utf-8"));
63         return outWrite;
64     }
65
66 }

如果过滤器需要过滤Servlet,则需要用response.getWriter().write("")输出,否则不会被过滤

1 response.setContentType("text/html;charset=utf-8");
2         String str="你好,同学;Hello World";
3         PrintWriter writer=response.getWriter();
4         writer.write(str);
5         writer.close();

如果Servlet中使用response.getOutputStream().write("")输出,则需要包装getOutputStream()方法

1 response.setContentType("text/html;charset=utf-8");
2         String str="你好,同学;Hello World";
3         String times=request.getParameter("times");
4         int n=Integer.valueOf(times);
5         OutputStream out=response.getOutputStream();
6         for (int i = 0; i < n; i++) {
7             out.write(str.getBytes("utf-8"));
8         }
9         out.close();

包装getOutputStream()方法

 1     @Override
 2     public ServletOutputStream getOutputStream() throws IOException {
 3         srcByte =new ByteArrayOutputStream();//输出的源数据
 4         ServletOutputStream out=new ServletOutputStream() {
 5             @Override
 6             public void write(int b) throws IOException {
 7                 srcByte.write(b);
 8             }
 9         };
10         return out;
11     }
时间: 2024-10-02 12:01:24

过滤器压缩全站jsp的相关文章

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

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

传智播客JavaWeb day14--监听器(用户踢人)、过滤器(解决全站乱码)

1. 2. 3. 4. 5. filter应用 1.用过滤器解决全站乱码问题 1.1 乱码分类 乱码分为get和post方式请求乱码 1.2 post请求乱码解决 post请求乱码很好解决只需一行代码搞定request.setCharacterEncoding("utf-8")告诉服务器用utf-8来获取参数即可 1.3 get请求乱码解决 问题:不能针对某个参数去解决乱码问题,因为过滤器是全站通用的,其他的请求可能没有这个参数,所以想到改造获取请求参数的三个方法,而直接继承的方式会有

javaweb的Filter过滤器设置全站编码

FIlter配置全站编码有一种方法是重写getParameter方法,也就是继承HttpServletRequestWrapper在重写getParameter方法,还有一种就是如下: public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 将requese进行强转 HttpServletR

项目总结_过滤器只过滤jsp后缀页面

其实只要在filter的xml配置中   filter-mapping     --->   *.jsp    就行了. 就可以只过滤jsp的页面,而css/js/images都可以不过滤,直接放行.   这里不要写成/*.jsp   只要*.jsp就行了.

过滤器Filter(拦截jsp页面的跳转)案例:

创建一个 Filter , class类: 其继承于 接口 Filte(接口导包:import javax.servlet.Filter;) 在 web.xml 文件中配置并映射该 Filter. 其中 url-pattern 指定该 Filter 可以拦截哪些资源, 即可以通过哪些 url 访问到该 Filter,并进行拦截: 案例:username=Tom,password=1234,设计Filter类,及jsp页面实现,输入username和password是否等于Tom和1234,不等拦

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

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

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

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

记性不如烂笔头33-利用java过滤器实现压缩响应正文内容

在前面的Response的相关内容中,就提到了把数据压缩然后传到浏览器上,通过压缩,能够提升网络文件的传输效率,在很多的场所都需要实用. 如果我们需要在所有的页面都实现压缩,那么是不是把这个加在某一个地方就一起解决了呢?貌似我们能够在过滤器中加载很多的内容,那么是不是也可以把这个也加在过滤器中呢?答案是可以的. 我们可以通过增强HttpServletResponseWrapper对象,压缩响应正文内容. 1. 原理 通过过滤器filter向目标页面传递一个自定义的response对象.在自定义的

jsp提交表单数据乱码,内置对象,以及过滤器

jsp提交表单数据乱码解决方案 通过form表单给服务器提交数据的时候,如果提交的是中文数据,那么可能会出现乱码,如果表单的请求方式是post请求,那么可以使用如下方案解决乱码: 在调用getParameter()之前,设置请求对象request的编码方式. <% request.setCharacterEncoding("utf-8");%> 002.如果是通过get方式提交的form,两种处理乱码方案: 01.通过new String(str.getBytes(“iso