最近分享代码较少,正好在优化最代码关于返回的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 = "(<|<)p-re[\\w\\W]*?[\\w\\W]*?/p-re[\\w\\W]*?(>|>)";
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中的过滤器(Filter)是Java Web开发中一个非常重要的概念,它是Servlet API的一部分,主要用于在请求被发送到目标Servlet或JSP之前对请求进行预处理,以及在响应返回给客户端之前对响应进行后处理。...
Servlet过滤器是基于Java的Servlet API实现的,主要通过实现`javax.servlet.Filter`接口来创建。`Filter`接口定义了三个核心方法:`doFilter()`, `init()`, 和 `destroy()`。`doFilter()`方法是过滤器的核心,每当有...
5. **GZIP压缩过滤器**:提高网站性能,通过压缩HTTP响应内容减少传输的数据量。过滤器可以检测客户端是否接受gzip压缩,如果接受则对响应内容进行压缩。 在实际开发中,我们还可以根据需求创建更复杂的过滤器,...
总结来说,"java中servlet文字过滤器"是Java Web开发中的一个重要工具,它提供了对HTTP请求和响应的预处理和后处理能力,尤其在处理编码问题和安全过滤方面起到了关键作用。通过合理配置和实现,Filter可以帮助我们...
Servlet过滤器是Java Web开发中的强大工具,通过简单的配置,即可实现对请求和响应的灵活控制。在Eclipse中创建并实现Servlet过滤器,可以让你更好地理解和应用这一特性,提升Web应用的功能和安全性。本教程提供的...
在IT领域,特别是Java Web开发中,Servlet过滤器(Filter)是实现用户权限管理、登录状态验证等关键功能的重要机制之一。本文将深入探讨如何利用Servlet过滤器来验证用户是否已登录,以及如何配置过滤器以针对特定的...
Servlet过滤器,作为Java Servlet规范中的一个重要组成部分,自2.3版本起被引入,主要用于在Servlet容器中对请求和响应进行预处理和后处理。它不直接生成请求或响应,而是作为一个中间件存在,能够在请求到达目标...
* 压缩过滤器:用于压缩响应体,减少网络传输的数据量。 * 安全过滤器:用于检测和防止恶意攻击。 * 记录过滤器:用于记录请求和响应的日志信息。 Java 过滤器是一种非常强大和灵活的机制,可以实现各种有用的功能...
Servlet过滤器(Filter)是Java Servlet API的一部分,它提供了一种机制,可以对HTTP请求和响应进行预处理和后处理。过滤器可以在不修改原有Servlet代码的情况下,实现数据的校验、登录检查、日志记录、字符编码转换...
GZIP压缩过滤器能够减少网络传输的数据量,提高页面加载速度。它在响应发送给客户端前,先将其压缩,客户端接收后自动解压。实现这一功能的过滤器如 `GzipFilter`,会检查请求头中的 `Accept-Encoding` 来决定是否...
在Java Web开发中,过滤器(Filter)是一个非常重要的概念,它主要负责在请求被实际处理之前或之后执行一些预处理或后处理操作。标题"过滤器例子的代码"表明我们将探讨一个关于过滤器的实际应用代码。描述中提到的...
### Servlet 3.0 使用注解标注过滤器 #### 一、Servlet 3.0概述与新特性 Servlet 3.0 是 Java EE 6 的一部分,它引入了许多新的特性和改进,使得开发者能够更方便地开发 Web 应用程序。其中一个重要特性就是支持...
在Servlet API中,提供了一个名为`Filter`的接口,任何实现了该接口的Java类都可以被视为过滤器。当Web服务器接收到客户端的请求并准备将请求分发到特定资源时,过滤器会在实际资源被访问之前被触发,允许开发者在这...
Servlet过滤器是Java Web开发中的一个重要组件,它在Servlet生命周期中扮演着预处理和后处理的角色。在Tomcat这样的Servlet容器中,过滤器允许开发者在请求到达Servlet之前或Servlet响应发送回客户端之后对请求和...
通过使用过滤器,开发者可以实现诸如数据验证、登录检查、字符编码转换、日志记录等多种功能,而无需改动目标资源(如Servlet)的代码。 ### 过滤器的工作原理 过滤器的工作基于“链式调用”模式。当一个HTTP请求...
在给定的"过滤器Fileter.txt"文件中,可能包含了实现这些功能的Java代码示例。 在Web应用程序中,过滤器是通过实现`javax.servlet.Filter`接口来创建的。这个接口定义了三个关键方法: 1. `init(FilterConfig ...
Java过滤器(Filter)是Servlet技术中的一项重要特性,它允许开发者在Web应用程序中实现对HTTP请求和响应的预处理与后处理。这使得开发人员能够对进入或离开Web服务器的所有资源(如JSP页面、Servlet和其他静态文件...
Servlet过滤器是Java Web开发中的一个重要组件,它允许开发者在HTTP请求到达Servlet或JSP之前以及响应返回给客户端之后对其进行处理。过滤器可以用于多种用途,包括但不限于安全控制、日志记录、数据转换等。 首先...
数据压缩过滤器用于减少数据传输量,从而加快网络通信速度和降低带宽成本。在客户端和服务器之间传输的数据被压缩,然后在接收端解压缩,这一过程对最终用户来说通常是透明的。GZIP是最常见的数据压缩算法之一,在...
四、GZIP压缩过滤器 `GzipFilter`对响应内容进行GZIP压缩,减少网络传输的数据量,提高网页加载速度: ```java public class GzipFilter implements Filter { public void doFilter(ServletRequest request, ...