`
q1457797371
  • 浏览: 6261 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java servlet对html网页压缩后返回的过滤器代码实现

阅读更多
最近分享代码较少,正好在优化最代码关于返回的html代码的压缩上有些相关经验分享下。
【参考:http://www.zuidaima.com/share/2633847241772032.htm】
之前研究的是通过freemarker的原生macro实现的:

1
<@compress single_line=true>
2
<html>
3
freemarker template技术
4
</html>
5
</@compress>
但因为最代码目前已经有几十个template文件,一个个加的话太费时费力了,另外如果不是freemarker技术的话就不能使用这个机制了,感觉java应该有这种技术来实现压缩的功能,于是想到了Filter

HtmlFilter.java

001
package com.zuidaima.filter;
002

003
import java.io.ByteArrayOutputStream;
004
import java.io.IOException;
005
import java.io.PrintWriter;
006
import java.util.ArrayList;
007
import java.util.List;
008
import java.util.regex.Matcher;
009
import java.util.regex.Pattern;
010

011
import javax.servlet.Filter;
012
import javax.servlet.FilterChain;
013
import javax.servlet.FilterConfig;
014
import javax.servlet.ServletException;
015
import javax.servlet.ServletOutputStream;
016
import javax.servlet.ServletRequest;
017
import javax.servlet.ServletResponse;
018
import javax.servlet.http.HttpServletRequest;
019
import javax.servlet.http.HttpServletResponse;
020
import javax.servlet.http.HttpServletResponseWrapper;
021

022
/**
023
*@author www.zuidaima.com
024
**/
025
public class HtmlFilter implements Filter {
026

027
    public static final String codePatternStr = "(<|&lt;)p-re[\\w\\W]*?[\\w\\W]*?/p-re[\\w\\W]*?(>|&gt;)";
028
    public static final Pattern codePattern = Pattern.compile(codePatternStr,
029
            Pattern.CASE_INSENSITIVE);
030

031
    private FilterConfig filterConfig = null;
032

033
    class CodeFragment {
034

035
        private String left;
036
        private String fragment;
037
        private String right;
038

039
        public CodeFragment(String left, String fragment, String right) {
040
            this.left = left;
041
            this.fragment = fragment;
042
            this.right = right;
043
        }
044

045
        public String getLeft() {
046
            return left;
047
        }
048

049
        public void setLeft(String left) {
050
            this.left = left;
051
        }
052

053
        public String getFragment() {
054
            return fragment;
055
        }
056

057
        public void setFragment(String fragment) {
058
            this.fragment = fragment;
059
        }
060

061
        public String getRight() {
062
            return right;
063
        }
064

065
        public void setRight(String right) {
066
            this.right = right;
067
        }
068
    }
069

070
    private static class ByteArrayServletStream extends ServletOutputStream {
071
        ByteArrayOutputStream baos;
072

073
        ByteArrayServletStream(ByteArrayOutputStream baos) {
074
            this.baos = baos;
075
        }
076

077
        public void write(int param) throws IOException {
078
            baos.write(param);
079
        }
080
    }
081

082
    private static class ByteArrayPrintWriter {
083

084
        private ByteArrayOutputStream baos = new ByteArrayOutputStream();
085

086
        private PrintWriter pw = new PrintWriter(baos);
087

088
        private ServletOutputStream sos = new ByteArrayServletStream(baos);
089

090
        public PrintWriter getWriter() {
091
            return pw;
092
        }
093

094
        public ServletOutputStream getStream() {
095
            return sos;
096
        }
097

098
        byte[] toByteArray() {
099
            return baos.toByteArray();
100
        }
101
    }
102

103
    public class CharResponseWrapper extends HttpServletResponseWrapper {
104
        private ByteArrayPrintWriter output;
105
        private boolean usingWriter;
106

107
        public CharResponseWrapper(HttpServletResponse response) {
108
            super(response);
109
            usingWriter = false;
110
            output = new ByteArrayPrintWriter();
111
        }
112

113
        public byte[] getByteArray() {
114
            return output.toByteArray();
115
        }
116

117
        @Override
118
        public ServletOutputStream getOutputStream() throws IOException {
119
            // will error out, if in use
120
            if (usingWriter) {
121
                super.getOutputStream();
122
            }
123
            usingWriter = true;
124
            return output.getStream();
125
        }
126

127
        @Override
128
        public PrintWriter getWriter() throws IOException {
129
            // will error out, if in use
130
            if (usingWriter) {
131
                super.getWriter();
132
            }
133
            usingWriter = true;
134
            return output.getWriter();
135
        }
136

137
        public String toString() {
138
            return output.toString();
139
        }
140
    }
141

142
    public void doFilter(ServletRequest request, ServletResponse response,
143
            FilterChain chain) throws IOException, ServletException {
144
        HttpServletRequest _request = (HttpServletRequest) request;
145
        if (_request.getRequestURI().indexOf("update") != -1
146
                || _request.getRequestURI().indexOf("create") != -1) {
147
            chain.doFilter(request, response);
148
            return;
149
        }
150
        CharResponseWrapper wrappedResponse = new CharResponseWrapper(
151
                (HttpServletResponse) response);
152
        chain.doFilter(request, wrappedResponse);
153
        byte[] bytes = wrappedResponse.getByteArray();
154

155
        String contentType = wrappedResponse.getContentType();
156
        if (contentType != null && contentType.matches(".*?(html|json).*?")) {
157
            String out = new String(bytes);
158
            Matcher matcher = codePattern.matcher(out);
159
            List<CodeFragment> codeFragments = new ArrayList<CodeFragment>();
160
            while (matcher.find()) {
161
                String fragment = matcher.group(0);
162
                String left = matcher.group(1);
163
                String right = matcher.group(2);
164
                CodeFragment codeFragment = new CodeFragment(left, fragment,
165
                        right);
166
                codeFragments.add(codeFragment);
167
                // 占位符<pr-e>idx</pr-e>
168
                out = out.replace(fragment, left + "p-re" + right
169
                        + codeFragments.size() + left + "/p-re" + right);
170
            }
171
            out = out.replaceAll("[\r\n]", "").replaceAll(">\\s*?<", "><")
172
                    .trim();
173
            // 还原占位符
174
            for (int i = 0; i < codeFragments.size(); i++) {
175
                CodeFragment codeFragment = codeFragments.get(i);
176
                String fragment = codeFragment.getFragment();
177
                String left = codeFragment.getLeft();
178
                String right = codeFragment.getRight();
179
                out = out.replace(left + "p-re" + right + (i + 1) + left
180
                        + "/p-re" + right, fragment);
181
            }
182
            response.getOutputStream().write(out.getBytes());
183
        } else {
184
            response.getOutputStream().write(bytes);
185
        }
186
    }
187

188
    @Override
189
    public void init(FilterConfig filterConfig) throws ServletException {
190
        this.filterConfig = filterConfig;
191
    }
192

193
    @Override
194
    public void destroy() {
195
        filterConfig = null;
196
    }
197
}
刚上线的新鲜代码分享,相信对牛牛们会有所帮助吧。

注意:

1.创建和编辑类的操作不做压缩,因为访问量不大

2.<pre></pre>内部的代码不做处理

3.只对content type为html和json做的做处理

压缩前和压缩后的html代码大小对比如下图

java servlet对html网页压缩后返回的过滤器代码实现

压缩前源码

java servlet对html网页压缩后返回的过滤器代码实现

压缩后源码

java servlet对html网页压缩后返回的过滤器代码实现

另外对seo的影响可能不会很大,毕竟没有改变html结构。
分享到:
评论

相关推荐

    过滤器 java servlet

    Java Servlet中的过滤器(Filter)是Java Web开发中一个非常重要的概念,它是Servlet API的一部分,主要用于在请求被发送到目标Servlet或JSP之前对请求进行预处理,以及在响应返回给客户端之前对响应进行后处理。...

    Servlet过滤器的简单使用源码+文档

    Servlet过滤器是基于Java的Servlet API实现的,主要通过实现`javax.servlet.Filter`接口来创建。`Filter`接口定义了三个核心方法:`doFilter()`, `init()`, 和 `destroy()`。`doFilter()`方法是过滤器的核心,每当有...

    servlet过滤器实例经典过滤器

    5. **GZIP压缩过滤器**:提高网站性能,通过压缩HTTP响应内容减少传输的数据量。过滤器可以检测客户端是否接受gzip压缩,如果接受则对响应内容进行压缩。 在实际开发中,我们还可以根据需求创建更复杂的过滤器,...

    java中servlet文字过滤器

    总结来说,"java中servlet文字过滤器"是Java Web开发中的一个重要工具,它提供了对HTTP请求和响应的预处理和后处理能力,尤其在处理编码问题和安全过滤方面起到了关键作用。通过合理配置和实现,Filter可以帮助我们...

    servlet过滤器实现(Eclipse工程)

    Servlet过滤器是Java Web开发中的强大工具,通过简单的配置,即可实现对请求和响应的灵活控制。在Eclipse中创建并实现Servlet过滤器,可以让你更好地理解和应用这一特性,提升Web应用的功能和安全性。本教程提供的...

    servlet过滤器验证用户登录

    在IT领域,特别是Java Web开发中,Servlet过滤器(Filter)是实现用户权限管理、登录状态验证等关键功能的重要机制之一。本文将深入探讨如何利用Servlet过滤器来验证用户是否已登录,以及如何配置过滤器以针对特定的...

    servlet过滤器详解

    Servlet过滤器,作为Java Servlet规范中的一个重要组成部分,自2.3版本起被引入,主要用于在Servlet容器中对请求和响应进行预处理和后处理。它不直接生成请求或响应,而是作为一个中间件存在,能够在请求到达目标...

    java 过滤器(附代码)

    * 压缩过滤器:用于压缩响应体,减少网络传输的数据量。 * 安全过滤器:用于检测和防止恶意攻击。 * 记录过滤器:用于记录请求和响应的日志信息。 Java 过滤器是一种非常强大和灵活的机制,可以实现各种有用的功能...

    servlet过滤器教程(含代码)

    Servlet过滤器(Filter)是Java Servlet API的一部分,它提供了一种机制,可以对HTTP请求和响应进行预处理和后处理。过滤器可以在不修改原有Servlet代码的情况下,实现数据的校验、登录检查、日志记录、字符编码转换...

    java 常用过滤器

    GZIP压缩过滤器能够减少网络传输的数据量,提高页面加载速度。它在响应发送给客户端前,先将其压缩,客户端接收后自动解压。实现这一功能的过滤器如 `GzipFilter`,会检查请求头中的 `Accept-Encoding` 来决定是否...

    过滤器例子的代码

    在Java Web开发中,过滤器(Filter)是一个非常重要的概念,它主要负责在请求被实际处理之前或之后执行一些预处理或后处理操作。标题"过滤器例子的代码"表明我们将探讨一个关于过滤器的实际应用代码。描述中提到的...

    Servlet3.0使用注解标注过滤器(Filter)

    ### Servlet 3.0 使用注解标注过滤器 #### 一、Servlet 3.0概述与新特性 Servlet 3.0 是 Java EE 6 的一部分,它引入了许多新的特性和改进,使得开发者能够更方便地开发 Web 应用程序。其中一个重要特性就是支持...

    过滤器介绍及代码

    在Servlet API中,提供了一个名为`Filter`的接口,任何实现了该接口的Java类都可以被视为过滤器。当Web服务器接收到客户端的请求并准备将请求分发到特定资源时,过滤器会在实际资源被访问之前被触发,允许开发者在这...

    servlet过滤器

    Servlet过滤器是Java Web开发中的一个重要组件,它在Servlet生命周期中扮演着预处理和后处理的角色。在Tomcat这样的Servlet容器中,过滤器允许开发者在请求到达Servlet之前或Servlet响应发送回客户端之后对请求和...

    java过滤器例子

    通过使用过滤器,开发者可以实现诸如数据验证、登录检查、字符编码转换、日志记录等多种功能,而无需改动目标资源(如Servlet)的代码。 ### 过滤器的工作原理 过滤器的工作基于“链式调用”模式。当一个HTTP请求...

    java的过滤器

    在给定的"过滤器Fileter.txt"文件中,可能包含了实现这些功能的Java代码示例。 在Web应用程序中,过滤器是通过实现`javax.servlet.Filter`接口来创建的。这个接口定义了三个关键方法: 1. `init(FilterConfig ...

    java_过滤器详解

    Java过滤器(Filter)是Servlet技术中的一项重要特性,它允许开发者在Web应用程序中实现对HTTP请求和响应的预处理与后处理。这使得开发人员能够对进入或离开Web服务器的所有资源(如JSP页面、Servlet和其他静态文件...

    servlet过滤器1

    Servlet过滤器是Java Web开发中的一个重要组件,它允许开发者在HTTP请求到达Servlet或JSP之前以及响应返回给客户端之后对其进行处理。过滤器可以用于多种用途,包括但不限于安全控制、日志记录、数据转换等。 首先...

    java一些 常用 的过滤 器

    数据压缩过滤器用于减少数据传输量,从而加快网络通信速度和降低带宽成本。在客户端和服务器之间传输的数据被压缩,然后在接收端解压缩,这一过程对最终用户来说通常是透明的。GZIP是最常见的数据压缩算法之一,在...

    java中五种常用的过滤器

    四、GZIP压缩过滤器 `GzipFilter`对响应内容进行GZIP压缩,减少网络传输的数据量,提高网页加载速度: ```java public class GzipFilter implements Filter { public void doFilter(ServletRequest request, ...

Global site tag (gtag.js) - Google Analytics