功能描述
如果浏览器支持 gzip 压缩格式的数据,则将响应的数据使用 gzip 压缩后再输出。
使用方法
在 java web 项目的 web.xml 文件中添加如下代码。
<!--压缩过滤器的配置 开始 --> < filter >
< filter-name >CompressionFilter</ filter-name >
< filter-class >com.hmw.filter.CompressionFilter</ filter-class >
</ filter >
< filter-mapping >
< filter-name >CompressionFilter</ filter-name >
< servlet-name >/LongServlet</ servlet-name >
</ filter-mapping >
<!--压缩过滤器的配置 结束 --> |
过滤器源码
CompressionFilter.java
package com.hmw.filter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.zip.GZIPOutputStream;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/** * 压缩过滤器 <br>
* 如果浏览器支持 gzip 压缩格式的数据,则将响应的数据使用 gzip 压缩后再输出。
*/
public class CompressionFilter implements Filter {
@Override
public void init(FilterConfig config) throws ServletException {
}
/**
* 如果浏览器不支持 gzip 压缩,则不做直接放行(不做压缩处理)<br>
* 反之,将HTTP响应头的编码设置为 <code>gzip</code>,然后将响应数据使用 gzip 进行压缩处理。
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws ServletException, IOException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
if (!isGzipSupported(req)) { // Invoke resource normally.
chain.doFilter(req, res);
return ;
}
// 将响应头信息中的内容编码设置为 gzip
res.setHeader( "Content-Encoding" , "gzip" );
// 调用资源,使用 CharArrayWrapper 包装输出
CharArrayWrapper responseWrapper = new CharArrayWrapper(res);
chain.doFilter(req, responseWrapper);
// 取得存放输出数据的 char 型数组
char [] responseChars = responseWrapper.toCharArray();
// 将响应数据压缩后存入一个 byte 型的数组,然后输出到
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
GZIPOutputStream zipOut = new GZIPOutputStream(byteStream);
OutputStreamWriter tempOut = new OutputStreamWriter(zipOut);
// 将原来的响应数据压缩后写入二字节输出流
tempOut.write(responseChars);
// 关闭输出流
tempOut.close();
// 更新响应头信息中 Content-Length 的值。
res.setContentLength(byteStream.size());
// 将压缩后的数据发送至客户端
OutputStream realOut = res.getOutputStream();
byteStream.writeTo(realOut);
}
@Override
public void destroy() {
}
/**
* 检测浏览器是否支持 Gzip 压缩
*
* @param req HTTP 请求对象
* @return 如果浏览器支持 Gzip 压缩,则返回 true,反之,则返回 false
*/
private boolean isGzipSupported(HttpServletRequest req) {
String browserEncodings = req.getHeader( "Accept-Encoding" );
return ((browserEncodings != null ) && (browserEncodings.indexOf( "gzip" ) != - 1 ));
}
} |
CharArrayWrapper.java
package com.hmw.filter;
import java.io.CharArrayWriter;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
/** * A response wrapper that takes everything the client would normally output and
* saves it in one big character array.
*/
public class CharArrayWrapper extends HttpServletResponseWrapper {
private CharArrayWriter charWriter;
/**
* Initializes wrapper.
* <P>
* First, this constructor calls the parent constructor. That call is
* crucial so that the response is stored and thus setHeader, *setStatus,
* addCookie, and so forth work normally.
* <P>
* Second, this constructor creates a CharArrayWriter that will be used to
* accumulate the response.
*/
public CharArrayWrapper(HttpServletResponse response) {
super (response);
charWriter = new CharArrayWriter();
}
/**
* When servlets or JSP pages ask for the Writer, don't give them the real
* one. Instead, give them a version that writes into the character array.
* The filter needs to send the contents of the array to the client (perhaps
* after modifying it).
*/
@Override
public PrintWriter getWriter() {
return new PrintWriter(charWriter);
}
/**
* Get a String representation of the entire buffer.
* <P>
* Be sure <B>not</B> to call this method multiple times on the same
* wrapper. The API for CharArrayWriter does not guarantee that it
* "remembers" the previous value, so the call is likely to make a new
* String every time.
*/
@Override
public String toString() {
return charWriter.toString();
}
/** Get the underlying character array. */
public char [] toCharArray() {
return charWriter.toCharArray();
}
} |
相关推荐
Servlet过滤器是Java Web开发中的一个重要组件,它允许开发者在请求到达Servlet之前或者响应离开Servlet之后进行拦截处理。本教程将深入讲解如何配置和使用Servlet过滤器,以及介绍五个经典的过滤器实例。 首先,让...
在DSFC中,这九个过滤器可能包括了数据传输前后的加密过程,以及对传输数据进行压缩以减少网络带宽消耗的功能。例如,一个过滤器可能负责对敏感数据进行AES加密,确保数据在传输过程中不被窃取;另一个过滤器则可能...
每个过滤器都是一个独立的类,负责对输入数据进行某种特定的处理,并将处理后的结果传递给下一个过滤器。这个过程就像是数据通过一根管道,依次经过各个过滤阶段。这种模式允许我们将复杂的任务分解为多个简单的部分...
在"0121SupperSocket"这个文件中,可能包含了关于高级Socket通信、封包处理技巧以及如何结合Filter进行网络数据过滤的示例代码或教程。通过学习和实践这些内容,开发者可以更好地理解和掌握网络编程的核心技术,提升...
在Java Web开发中,过滤器(Filter)是用于处理HTTP请求和响应的一种机制,它可以对请求进行预处理,也可以对响应进行后处理。过滤器链(Filter Chain)则是多个过滤器按照特定顺序组织起来,共同处理同一个请求或...
在处理加密时,可以利用过滤器在请求到达目标资源之前加密数据,在响应返回客户端之前解密数据,从而确保数据的安全传输。 **示例代码(demo)** 这个压缩包中的"demo"可能包含了完整的Java代码示例,展示了如何在...
响应压缩,是对Response返回的Json进行压缩,可以最大程度...而.net 项目中可以通过过滤器或中间件全局压缩所有后端接口的Response。 所以说响应压缩,可以用最小的改动,减少这些冗余数据的体积。优化服务器流量压力。
过滤器(Filter)的主要作用是对客户端发起的HTTP请求进行预处理,也可以在响应返回给客户端之前进行后处理。例如,过滤器可以用于以下用途: 1. **敏感词汇过滤**:在用户提交的数据中检查并移除或替换敏感或非法...
在Java Web开发中,过滤器(Filter)是一个非常重要的组件,它允许我们在数据处理的各个环节进行拦截、修改或增强处理。本篇文章将深入探讨Java中的过滤器使用技术,旨在帮助开发者理解和掌握这一核心技术。 首先,...
例如,你可以使用结果过滤器来改变HTTP响应头,或者在响应发送到客户端之前对其进行压缩。 在提供的压缩包文件"WebMIS.GoldFilterOpenSource"中,很可能是包含了一个开源的Web过滤器实现。这样的库通常会提供自定义...
过滤器提供了一种机制,可以对HTTP请求和响应进行拦截、处理,甚至修改,从而实现诸如数据校验、权限控制、字符编码转换等多种功能。本文将全面解析过滤器的概念、原理及其实现方式。 过滤器是Java Servlet规范的一...
在JAVAEE平台上,过滤器(Filter)是一种强大的工具,它允许开发者在请求到达Servlet之前或Servlet响应返回客户端之后对请求和响应进行处理。过滤器在Java Web应用中扮演着重要角色,可以实现如数据验证、登录检查、...
Servlet过滤器是Java Web开发中的一个重要概念,它允许开发者在请求到达Servlet之前或者Servlet响应返回客户端之前进行拦截处理。在本实例中,我们将深入探讨Servlet过滤器(Filter)的使用和实现,以及它在实际应用...
3. **使用场景**:过滤器常用于数据过滤、安全控制、性能优化等,如登录验证、GZIP压缩等。监听器常用于初始化资源、管理会话、统计信息收集等,如初始化全局变量、记录日志等。 4. **配置方式**:两者都需要在web....
- **应用场景**:过滤器常用于数据验证、字符编码转换、登录检查、压缩响应、缓存控制等场景。 - **配置**:在`web.xml`配置文件中通过`<filter>`和`<filter-mapping>`元素定义过滤器及其映射。 2. **监听器...
同样地,当服务器准备响应客户端时,过滤器也可以对响应内容进行操作,如添加响应头、压缩数据或改变响应内容。这种机制使得过滤器成为一种强大的工具,可以在不修改实际处理请求的Servlet或JSP代码的情况下,实现跨...
同样,响应也会按照过滤器链的逆序返回,每个过滤器都有机会对响应进行处理。 二、过滤器接口 过滤器API主要由以下三个接口组成: 1. `Filter`:这是过滤器的核心接口,定义了初始化、过滤和销毁方法,分别是`init...
它们是在请求被控制器处理之前和之后执行的一系列方法,允许你在请求生命周期的特定点进行干预。拦截器可以用于登录验证、日志记录、性能监控等多种任务。在Spring MVC中,你可以定义一个实现了`HandlerInterceptor`...
数据源是整个管道的起点,它产生原始数据流供过滤器处理。在Java中,数据源可以是`InputStream`、`OutputStream`、`Reader`或`Writer`的实例,它们分别对应于字节流和字符流。开发者可以根据需求选择合适的数据源,...
JSP(JavaServer Pages)过滤器是Servlet API的一部分,它允许开发者在请求到达目标资源之前或之后对请求和响应进行处理。过滤器是JSP和Servlet开发中的一个重要概念,用于实现诸如认证、日志记录、字符编码转换、...