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

最近分享代码较少,正好在优化最代码关于返回的html代码的压缩上有些相关经验分享下。

之前研究的是通过freemarker的原生macro实现的:

freemarker template技术

@compress>

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

HtmlFilter.javapackage com.zuidaima.filter;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.ArrayList;

import java.util.List;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

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;

/**

*@author www.zuidaima.com

**/

public class HtmlFilter implements Filter {

public static final String codePatternStr = "(|>)";

public static final Pattern codePattern = Pattern.compile(codePatternStr,

Pattern.CASE_INSENSITIVE);

private FilterConfig filterConfig = null;

class CodeFragment {

private String left;

private String fragment;

private String right;

public CodeFragment(String left, String fragment, String right) {

this.left = left;

this.fragment = fragment;

this.right = right;

}

public String getLeft() {

return left;

}

public void setLeft(String left) {

this.left = left;

}

public String getFragment() {

return fragment;

}

public void setFragment(String fragment) {

this.fragment = fragment;

}

public String getRight() {

return right;

}

public void setRight(String right) {

this.right = right;

}

}

private static class ByteArrayServletStream extends ServletOutputStream {

ByteArrayOutputStream baos;

ByteArrayServletStream(ByteArrayOutputStream baos) {

this.baos = baos;

}

public void write(int param) throws IOException {

baos.write(param);

}

}

private static class ByteArrayPrintWriter {

private ByteArrayOutputStream baos = new ByteArrayOutputStream();

private PrintWriter pw = new PrintWriter(baos);

private ServletOutputStream sos = new ByteArrayServletStream(baos);

public PrintWriter getWriter() {

return pw;

}

public ServletOutputStream getStream() {

return sos;

}

byte[] toByteArray() {

return baos.toByteArray();

}

}

public class CharResponseWrapper extends HttpServletResponseWrapper {

private ByteArrayPrintWriter output;

private boolean usingWriter;

public CharResponseWrapper(HttpServletResponse response) {

super(response);

usingWriter = false;

output = new ByteArrayPrintWriter();

}

public byte[] getByteArray() {

return output.toByteArray();

}

@Override

public ServletOutputStream getOutputStream() throws IOException {

// will error out, if in use

if (usingWriter) {

super.getOutputStream();

}

usingWriter = true;

return output.getStream();

}

@Override

public PrintWriter getWriter() throws IOException {

// will error out, if in use

if (usingWriter) {

super.getWriter();

}

usingWriter = true;

return output.getWriter();

}

public String toString() {

return output.toString();

}

}

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

HttpServletRequest _request = (HttpServletRequest) request;

if (_request.getRequestURI().indexOf("update") != -1

|| _request.getRequestURI().indexOf("create") != -1) {

chain.doFilter(request, response);

return;

}

CharResponseWrapper wrappedResponse = new CharResponseWrapper(

(HttpServletResponse) response);

chain.doFilter(request, wrappedResponse);

byte[] bytes = wrappedResponse.getByteArray();

String contentType = wrappedResponse.getContentType();

if (contentType != null && contentType.matches(".*?(html|json).*?")) {

String out = new String(bytes);

Matcher matcher = codePattern.matcher(out);

List codeFragments = new ArrayList();

while (matcher.find()) {

String fragment = matcher.group(0);

String left = matcher.group(1);

String right = matcher.group(2);

CodeFragment codeFragment = new CodeFragment(left, fragment,

right);

codeFragments.add(codeFragment);

// 占位符idx

out = out.replace(fragment, left + "p-re" + right

+ codeFragments.size() + left + "/p-re" + right);

}

out = out.replaceAll("[\r\n]", "").replaceAll(">\\s*?

.trim();

// 还原占位符

for (int i = 0; i < codeFragments.size(); i++) {

CodeFragment codeFragment = codeFragments.get(i);

String fragment = codeFragment.getFragment();

String left = codeFragment.getLeft();

String right = codeFragment.getRight();

out = out.replace(left + "p-re" + right + (i + 1) + left

+ "/p-re" + right, fragment);

}

response.getOutputStream().write(out.getBytes());

} else {

response.getOutputStream().write(bytes);

}

}

@Override

public void init(FilterConfig filterConfig) throws ServletException {

this.filterConfig = filterConfig;

}

@Override

public void destroy() {

filterConfig = null;

}

}

刚上线的新鲜代码分享,相信对牛牛们会有所帮助吧。

注意:

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

2.

内部的代码不做处理 
 

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

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

5f44669d9023f819b9cfa4031178418d.png

压缩前源码

5f44669d9023f819b9cfa4031178418d.png

压缩后源码

5f44669d9023f819b9cfa4031178418d.png

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

平时多总结分享才能让自己的知识沉淀下来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java过滤器(Filter)是一种基于Servlet规范实现的、可以在请求和响应被发送到目标资源之前对请求和响应进行预处理和后处理的组件。以下是一个Java过滤器实现代码示例: ```java import javax.servlet.*; import java.io.IOException; public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化操作 } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 在请求被发送到目标资源之前,对请求进行预处理 // 可以在这里进行权限验证、编码转换、日志记录等操作 // 调用FilterChain对象的doFilter方法,将请求和响应传递给下一个过滤器或目标资源 filterChain.doFilter(servletRequest, servletResponse); // 在响应被发送到客户端之前,对响应进行后处理 // 可以在这里进行响应内容的过滤、压缩等操作 } @Override public void destroy() { // 销毁操作 } } ``` 在web.xml文件中配置过滤器: ```xml <filter> <filter-name>MyFilter</filter-name> <filter-class>com.example.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 以上示例实现了一个简单的Java过滤器,并将其映射到所有的请求路径上。在doFilter方法中,我们可以实现我们需要的各种逻辑处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值